ETH Price: $1,453.15 (-8.49%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Reward Claim All209690552024-10-15 6:04:11176 days ago1728972251IN
0x913F2DEe...8f4e36fa5
0 ETH0.0077912811.90465565
Reward Claim All207072312024-09-08 16:56:59212 days ago1725814619IN
0x913F2DEe...8f4e36fa5
0 ETH0.001305161.60624511
Reward Claim All205770482024-08-21 12:37:59230 days ago1724243879IN
0x913F2DEe...8f4e36fa5
0 ETH0.000728520.89590492
Reward Claim All204062262024-07-28 16:24:59254 days ago1722183899IN
0x913F2DEe...8f4e36fa5
0 ETH0.001234111.87943982
Reward Claim All201496142024-06-22 20:25:47290 days ago1719087947IN
0x913F2DEe...8f4e36fa5
0 ETH0.001169721.768892
Apply Interest H...199371742024-05-24 3:52:11320 days ago1716522731IN
0x913F2DEe...8f4e36fa5
0 ETH0.002749155.7753929
Reward Claim All199080172024-05-20 2:00:11324 days ago1716170411IN
0x913F2DEe...8f4e36fa5
0 ETH0.00224762.76609691
Reward Claim All197751062024-05-01 11:53:47343 days ago1714564427IN
0x913F2DEe...8f4e36fa5
0 ETH0.006377728.20152076
Reward Claim All197547162024-04-28 15:29:11345 days ago1714318151IN
0x913F2DEe...8f4e36fa5
0 ETH0.006500258.16538901
Owner Reward Tra...197298032024-04-25 3:49:11349 days ago1714016951IN
0x913F2DEe...8f4e36fa5
0 ETH0.000484827.00336973
Reward Claim All195551642024-03-31 16:49:59373 days ago1711903799IN
0x913F2DEe...8f4e36fa5
0 ETH0.014039823.38509167
Reward Claim All192588712024-02-19 2:37:47415 days ago1708310267IN
0x913F2DEe...8f4e36fa5
0 ETH0.0128383421.04580511
Reward Claim All192483562024-02-17 15:05:47416 days ago1708182347IN
0x913F2DEe...8f4e36fa5
0 ETH0.0131228122.18250451
Apply Interest H...189882922024-01-12 3:59:35453 days ago1705031975IN
0x913F2DEe...8f4e36fa5
0 ETH0.0090954816.97881045
Reward Claim All189456032024-01-06 3:47:23459 days ago1704512843IN
0x913F2DEe...8f4e36fa5
0 ETH0.0111017214.28863483
Reward Claim All188782242023-12-27 16:36:47468 days ago1703695007IN
0x913F2DEe...8f4e36fa5
0 ETH0.0298968849.28283278
Owner Reward Tra...188173122023-12-19 3:23:35477 days ago1702956215IN
0x913F2DEe...8f4e36fa5
0 ETH0.0033388548.23057218
Reward Claim All187341332023-12-07 11:31:47489 days ago1701948707IN
0x913F2DEe...8f4e36fa5
0 ETH0.0196188233.86824069
Reward Claim All186044132023-11-19 7:37:35507 days ago1700379455IN
0x913F2DEe...8f4e36fa5
0 ETH0.0088540115.17530855
Reward Claim All186043742023-11-19 7:29:47507 days ago1700378987IN
0x913F2DEe...8f4e36fa5
0 ETH0.0088481914.40642131
Reward Claim All182973432023-10-07 8:14:11550 days ago1696666451IN
0x913F2DEe...8f4e36fa5
0 ETH0.003612496.09273406
Reward Claim All181884572023-09-22 2:36:35565 days ago1695350195IN
0x913F2DEe...8f4e36fa5
0 ETH0.006700028.41586377
Owner Reward Tra...181100462023-09-11 2:10:47576 days ago1694398247IN
0x913F2DEe...8f4e36fa5
0 ETH0.000585688.46187289
Reward Claim All180806052023-09-06 23:13:35580 days ago1694042015IN
0x913F2DEe...8f4e36fa5
0 ETH0.0068305910.97374932
Owner Reward Tra...180118402023-08-28 8:05:59590 days ago1693209959IN
0x913F2DEe...8f4e36fa5
0 ETH0.001291718.65892742
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer220041702025-03-08 19:13:5931 days ago1741461239
0x913F2DEe...8f4e36fa5
0.00605028 ETH
Transfer220041702025-03-08 19:13:5931 days ago1741461239
0x913F2DEe...8f4e36fa5
0.00605028 ETH
Transfer220040942025-03-08 18:58:4731 days ago1741460327
0x913F2DEe...8f4e36fa5
0.01470571 ETH
Transfer220040942025-03-08 18:58:4731 days ago1741460327
0x913F2DEe...8f4e36fa5
0.01470571 ETH
Transfer220040632025-03-08 18:52:3531 days ago1741459955
0x913F2DEe...8f4e36fa5
0.00599037 ETH
Transfer220040632025-03-08 18:52:3531 days ago1741459955
0x913F2DEe...8f4e36fa5
0.00599037 ETH
Transfer212574982024-11-24 12:07:11135 days ago1732450031
0x913F2DEe...8f4e36fa5
3.92841896 ETH
Transfer212574982024-11-24 12:07:11135 days ago1732450031
0x913F2DEe...8f4e36fa5
3.92841896 ETH
Transfer189853742024-01-11 18:10:11453 days ago1704996611
0x913F2DEe...8f4e36fa5
0.18137481 ETH
Transfer189853742024-01-11 18:10:11453 days ago1704996611
0x913F2DEe...8f4e36fa5
0.18137481 ETH
Transfer181363582023-09-14 18:42:59572 days ago1694716979
0x913F2DEe...8f4e36fa5
11.4451735 ETH
Transfer181363582023-09-14 18:42:59572 days ago1694716979
0x913F2DEe...8f4e36fa5
11.4451735 ETH
Transfer180592692023-09-03 23:34:11583 days ago1693784051
0x913F2DEe...8f4e36fa5
0.00205808 ETH
Transfer180592692023-09-03 23:34:11583 days ago1693784051
0x913F2DEe...8f4e36fa5
0.00205808 ETH
Transfer180186152023-08-29 6:52:47589 days ago1693291967
0x913F2DEe...8f4e36fa5
2.82207682 ETH
Transfer180186152023-08-29 6:52:47589 days ago1693291967
0x913F2DEe...8f4e36fa5
2.82207682 ETH
Transfer170309892023-04-12 9:18:23728 days ago1681291103
0x913F2DEe...8f4e36fa5
163.51440391 ETH
Transfer170309892023-04-12 9:18:23728 days ago1681291103
0x913F2DEe...8f4e36fa5
163.51440391 ETH
Transfer170134042023-04-09 21:34:23730 days ago1681076063
0x913F2DEe...8f4e36fa5
4.13591068 ETH
Transfer170134042023-04-09 21:34:23730 days ago1681076063
0x913F2DEe...8f4e36fa5
4.13591068 ETH
Transfer168961132023-03-24 8:16:35747 days ago1679645795
0x913F2DEe...8f4e36fa5
0.43663347 ETH
Transfer168961132023-03-24 8:16:35747 days ago1679645795
0x913F2DEe...8f4e36fa5
0.43663347 ETH
Transfer168773342023-03-21 16:55:59749 days ago1679417759
0x913F2DEe...8f4e36fa5
14.80781278 ETH
Transfer168773342023-03-21 16:55:59749 days ago1679417759
0x913F2DEe...8f4e36fa5
14.80781278 ETH
Transfer168029342023-03-11 6:02:35760 days ago1678514555
0x913F2DEe...8f4e36fa5
10.27258756 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenManager

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-18
*/

// File: contracts/interfaces/ILiquidationManager.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's liquidation manager interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface ILiquidationManager  {
	function setCircuitBreaker(bool _emergency) external returns (bool);
	function partialLiquidation(address payable delinquentBorrower, uint256 targetHandler, uint256 liquidateAmount, uint256 receiveHandler) external returns (uint256);
	function checkLiquidation(address payable userAddr) external view returns (bool);
}

// File: contracts/interfaces/IManagerSlotSetter.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's Manager Context Setter interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IManagerSlotSetter  {
  function ownershipTransfer(address payable _owner) external returns (bool);
  function setOperator(address payable adminAddr, bool flag) external returns (bool);
  function setOracleProxy(address oracleProxyAddr) external returns (bool);
  function setRewardErc20(address erc20Addr) external returns (bool);
  function setBreakerTable(address _target, bool _status) external returns (bool);
  function setCircuitBreaker(bool _emergency) external returns (bool);
  function handlerRegister(uint256 handlerID, address tokenHandlerAddr, uint256 flashFeeRate, uint256 discountBase) external returns (bool);
  function setLiquidationManager(address liquidationManagerAddr) external returns (bool);
  function setHandlerSupport(uint256 handlerID, bool support) external returns (bool);
  function setPositionStorageAddr(address _positionStorageAddr) external returns (bool);
  function setNFTAddr(address _nftAddr) external returns (bool);
  function setDiscountBase(uint256 handlerID, uint256 feeBase) external returns (bool);
  function setFlashloanAddr(address _flashloanAddr) external returns (bool);
  function sethandlerManagerAddr(address _handlerManagerAddr) external returns (bool);
  function setSlotSetterAddr(address _slotSetterAddr) external returns (bool);
  function setFlashloanFee(uint256 handlerID, uint256 flashFeeRate) external returns (bool);
}

// File: contracts/interfaces/IHandlerManager.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's Manager Interest interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IHandlerManager  {
  function applyInterestHandlers(address payable userAddr, uint256 callerID, bool allFlag) external returns (uint256, uint256, uint256, uint256, uint256, uint256);
  function interestUpdateReward() external returns (bool);
  function updateRewardParams(address payable userAddr) external returns (bool);
  function rewardClaimAll(address payable userAddr) external returns (uint256);
  function claimHandlerReward(uint256 handlerID, address payable userAddr) external returns (uint256);
  function ownerRewardTransfer(uint256 _amount) external returns (bool);
}

// File: contracts/interfaces/IManagerFlashloan.sol
pragma solidity 0.6.12;

interface IManagerFlashloan {
  function withdrawFlashloanFee(uint256 handlerID) external returns (bool);

  function flashloan(
    uint256 handlerID,
    address receiverAddress,
    uint256 amount,
    bytes calldata params
  ) external returns (bool);

  function getFee(uint256 handlerID, uint256 amount) external view returns (uint256);

  function getFeeTotal(uint256 handlerID) external view returns (uint256);

  function getFeeFromArguments(uint256 handlerID, uint256 amount, uint256 bifiAmo) external view returns (uint256);
}

// File: contracts/SafeMath.sol
pragma solidity ^0.6.12;

// from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
// Subject to the MIT license.

/**
 * @title BiFi's safe-math Contract
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
library SafeMath {
  uint256 internal constant unifiedPoint = 10 ** 18;
	/******************** Safe Math********************/
	function add(uint256 a, uint256 b) internal pure returns (uint256)
	{
		uint256 c = a + b;
		require(c >= a, "a");
		return c;
	}

	function sub(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return _sub(a, b, "s");
	}

	function mul(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return _mul(a, b);
	}

	function div(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return _div(a, b, "d");
	}

	function _sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256)
	{
		require(b <= a, errorMessage);
		return a - b;
	}

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

		uint256 c = a* b;
		require((c / a) == b, "m");
		return c;
	}

	function _div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256)
	{
		require(b > 0, errorMessage);
		return a / b;
	}

	function unifiedDiv(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return _div(_mul(a, unifiedPoint), b, "d");
	}

	function unifiedMul(uint256 a, uint256 b) internal pure returns (uint256)
	{
		return _div(_mul(a, b), unifiedPoint, "m");
	}
}

// File: contracts/interfaces/IManagerDataStorage.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's manager data storage interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IManagerDataStorage  {
	function getGlobalRewardPerBlock() external view returns (uint256);
	function setGlobalRewardPerBlock(uint256 _globalRewardPerBlock) external returns (bool);

	function getGlobalRewardDecrement() external view returns (uint256);
	function setGlobalRewardDecrement(uint256 _globalRewardDecrement) external returns (bool);

	function getGlobalRewardTotalAmount() external view returns (uint256);
	function setGlobalRewardTotalAmount(uint256 _globalRewardTotalAmount) external returns (bool);

	function getAlphaRate() external view returns (uint256);
	function setAlphaRate(uint256 _alphaRate) external returns (bool);

	function getAlphaLastUpdated() external view returns (uint256);
	function setAlphaLastUpdated(uint256 _alphaLastUpdated) external returns (bool);

	function getRewardParamUpdateRewardPerBlock() external view returns (uint256);
	function setRewardParamUpdateRewardPerBlock(uint256 _rewardParamUpdateRewardPerBlock) external returns (bool);

	function getRewardParamUpdated() external view returns (uint256);
	function setRewardParamUpdated(uint256 _rewardParamUpdated) external returns (bool);

	function getInterestUpdateRewardPerblock() external view returns (uint256);
	function setInterestUpdateRewardPerblock(uint256 _interestUpdateRewardPerblock) external returns (bool);

	function getInterestRewardUpdated() external view returns (uint256);
	function setInterestRewardUpdated(uint256 _interestRewardLastUpdated) external returns (bool);

	function setTokenHandler(uint256 handlerID, address handlerAddr) external returns (bool);

	function getTokenHandlerInfo(uint256 handlerID) external view returns (bool, address);

	function getTokenHandlerID(uint256 index) external view returns (uint256);

	function getTokenHandlerAddr(uint256 handlerID) external view returns (address);
	function setTokenHandlerAddr(uint256 handlerID, address handlerAddr) external returns (bool);

	function getTokenHandlerExist(uint256 handlerID) external view returns (bool);
	function setTokenHandlerExist(uint256 handlerID, bool exist) external returns (bool);

	function getTokenHandlerSupport(uint256 handlerID) external view returns (bool);
	function setTokenHandlerSupport(uint256 handlerID, bool support) external returns (bool);

	function setLiquidationManagerAddr(address _liquidationManagerAddr) external returns (bool);
	function getLiquidationManagerAddr() external view returns (address);

	function setManagerAddr(address _managerAddr) external returns (bool);
}

// File: contracts/interfaces/IOracleProxy.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's oracle proxy interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IOracleProxy  {
	function getTokenPrice(uint256 tokenID) external view returns (uint256);

	function getOracleFeed(uint256 tokenID) external view returns (address, uint256);
	function setOracleFeed(uint256 tokenID, address feedAddr, uint256 decimals, bool needPriceConvert, uint256 priceConvertID) external returns (bool);
}

// File: contracts/interfaces/IERC20.sol
// from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
pragma solidity 0.6.12;
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external ;
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external ;

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

// File: contracts/interfaces/IObserver.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's Observer interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IObserver {
    function getAlphaBaseAsset() external view returns (uint256[] memory);
    function setChainGlobalRewardPerblock(uint256 _idx, uint256 globalRewardPerBlocks) external returns (bool);
    function updateChainMarketInfo(uint256 _idx, uint256 chainDeposit, uint256 chainBorrow) external returns (bool);
}

// File: contracts/interfaces/IProxy.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's proxy interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IProxy  {
	function handlerProxy(bytes memory data) external returns (bool, bytes memory);
	function handlerViewProxy(bytes memory data) external view returns (bool, bytes memory);
	function siProxy(bytes memory data) external returns (bool, bytes memory);
	function siViewProxy(bytes memory data) external view returns (bool, bytes memory);
}

// File: contracts/interfaces/IMarketHandler.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's market handler interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IMarketHandler  {
	function setCircuitBreaker(bool _emergency) external returns (bool);
	function setCircuitBreakWithOwner(bool _emergency) external returns (bool);

	function getTokenName() external view returns (string memory);

	function ownershipTransfer(address payable newOwner) external returns (bool);

	function deposit(uint256 unifiedTokenAmount, bool allFlag) external payable returns (bool);
	function withdraw(uint256 unifiedTokenAmount, bool allFlag) external returns (bool);
	function borrow(uint256 unifiedTokenAmount, bool allFlag) external returns (bool);
	function repay(uint256 unifiedTokenAmount, bool allFlag) external payable returns (bool);

	function executeFlashloan(
		address receiverAddress,
		uint256 amount
  ) external returns (bool);

	function depositFlashloanFee(
		uint256 amount
	) external returns (bool);

  function convertUnifiedToUnderlying(uint256 unifiedTokenAmount) external view returns (uint256);
	function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 rewardHandlerID) external returns (uint256, uint256, uint256);
	function partialLiquidationUserReward(address payable delinquentBorrower, uint256 liquidationAmountWithReward, address payable liquidator) external returns (uint256);

	function getTokenHandlerLimit() external view returns (uint256, uint256);
  function getTokenHandlerBorrowLimit() external view returns (uint256);
	function getTokenHandlerMarginCallLimit() external view returns (uint256);
	function setTokenHandlerBorrowLimit(uint256 borrowLimit) external returns (bool);
	function setTokenHandlerMarginCallLimit(uint256 marginCallLimit) external returns (bool);

  function getTokenLiquidityAmountWithInterest(address payable userAddr) external view returns (uint256);

	function getUserAmountWithInterest(address payable userAddr) external view returns (uint256, uint256);
	function getUserAmount(address payable userAddr) external view returns (uint256, uint256);

	function getUserMaxBorrowAmount(address payable userAddr) external view returns (uint256);
	function getUserMaxWithdrawAmount(address payable userAddr) external view returns (uint256);
	function getUserMaxRepayAmount(address payable userAddr) external view returns (uint256);

	function checkFirstAction() external returns (bool);
	function applyInterest(address payable userAddr) external returns (uint256, uint256);

	function reserveDeposit(uint256 unifiedTokenAmount) external payable returns (bool);
	function reserveWithdraw(uint256 unifiedTokenAmount) external returns (bool);

	function withdrawFlashloanFee(uint256 unifiedTokenAmount) external returns (bool);

	function getDepositTotalAmount() external view returns (uint256);
	function getBorrowTotalAmount() external view returns (uint256);

	function getSIRandBIR() external view returns (uint256, uint256);

  function getERC20Addr() external view returns (address);
}

// File: contracts/interfaces/IServiceIncentive.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's si interface
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
interface IServiceIncentive  {
	function setCircuitBreakWithOwner(bool emergency) external returns (bool);
	function setCircuitBreaker(bool emergency) external returns (bool);

	function updateRewardPerBlockLogic(uint256 _rewardPerBlock) external returns (bool);
	function updateRewardLane(address payable userAddr) external returns (bool);

	function getBetaRateBaseTotalAmount() external view returns (uint256);
	function getBetaRateBaseUserAmount(address payable userAddr) external view returns (uint256);

	function getMarketRewardInfo() external view returns (uint256, uint256, uint256);

	function getUserRewardInfo(address payable userAddr) external view returns (uint256, uint256, uint256);

	function claimRewardAmountUser(address payable userAddr) external returns (uint256);
}

// File: contracts/Errors.sol
pragma solidity 0.6.12;

contract Modifier {
    string internal constant ONLY_OWNER = "O";
    string internal constant ONLY_MANAGER = "M";
    string internal constant CIRCUIT_BREAKER = "emergency";
}

contract ManagerModifier is Modifier {
    string internal constant ONLY_HANDLER = "H";
    string internal constant ONLY_LIQUIDATION_MANAGER = "LM";
    string internal constant ONLY_BREAKER = "B";
}

contract HandlerDataStorageModifier is Modifier {
    string internal constant ONLY_BIFI_CONTRACT = "BF";
}

contract SIDataStorageModifier is Modifier {
    string internal constant ONLY_SI_HANDLER = "SI";
}

contract HandlerErrors is Modifier {
    string internal constant USE_VAULE = "use value";
    string internal constant USE_ARG = "use arg";
    string internal constant EXCEED_LIMIT = "exceed limit";
    string internal constant NO_LIQUIDATION = "no liquidation";
    string internal constant NO_LIQUIDATION_REWARD = "no enough reward";
    string internal constant NO_EFFECTIVE_BALANCE = "not enough balance";
    string internal constant TRANSFER = "err transfer";
}

contract SIErrors is Modifier { }

contract InterestErrors is Modifier { }

contract LiquidationManagerErrors is Modifier {
    string internal constant NO_DELINQUENT = "not delinquent";
}

contract ManagerErrors is ManagerModifier {
    string internal constant REWARD_TRANSFER = "RT";
    string internal constant UNSUPPORTED_TOKEN = "UT";
}

contract OracleProxyErrors is Modifier {
    string internal constant ZERO_PRICE = "price zero";
}

contract RequestProxyErrors is Modifier { }

contract ManagerDataStorageErrors is ManagerModifier {
    string internal constant NULL_ADDRESS = "err addr null";
}

// File: contracts/marketManager/ManagerSlot.sol
pragma solidity 0.6.12;

/**
 * @title BiFi's Slot contract
 * @notice Manager Slot Definitions & Allocations
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract ManagerSlot is ManagerErrors {
	using SafeMath for uint256;

	address public owner;
	mapping(address => bool) operators;
	mapping(address => Breaker) internal breakerTable;

	bool public emergency = false;

	IManagerDataStorage internal dataStorageInstance;
	IOracleProxy internal oracleProxy;

	/* feat: manager reward token instance*/
	IERC20 internal rewardErc20Instance;

	IObserver public Observer;

	address public slotSetterAddr;
	address public handlerManagerAddr;
	address public flashloanAddr;

  // BiFi-X
  address public positionStorageAddr;
  address public nftAddr;

	uint256 public tokenHandlerLength;

  struct FeeRateParams {
    uint256 unifiedPoint;
    uint256 minimum;
    uint256 slope;
    uint256 discountRate;
  }

  struct HandlerFlashloan {
      uint256 flashFeeRate;
      uint256 discountBase;
      uint256 feeTotal;
  }

  mapping(uint256 => HandlerFlashloan) public handlerFlashloan;

	struct UserAssetsInfo {
		uint256 depositAssetSum;
		uint256 borrowAssetSum;
		uint256 marginCallLimitSum;
		uint256 depositAssetBorrowLimitSum;
		uint256 depositAsset;
		uint256 borrowAsset;
		uint256 price;
		uint256 callerPrice;
		uint256 depositAmount;
		uint256 borrowAmount;
		uint256 borrowLimit;
		uint256 marginCallLimit;
		uint256 callerBorrowLimit;
		uint256 userBorrowableAsset;
		uint256 withdrawableAsset;
	}

	struct Breaker {
		bool auth;
		bool tried;
	}

	struct ContractInfo {
		bool support;
		address addr;
    address tokenAddr;

    uint256 expectedBalance;
    uint256 afterBalance;

		IProxy tokenHandler;
		bytes data;

		IMarketHandler handlerFunction;
		IServiceIncentive siFunction;

		IOracleProxy oracleProxy;
		IManagerDataStorage managerDataStorage;
	}

	modifier onlyOwner {
		require(msg.sender == owner, ONLY_OWNER);
		_;
	}

	modifier onlyHandler(uint256 handlerID) {
		_isHandler(handlerID);
		_;
	}

	modifier onlyOperators {
		address payable sender = msg.sender;
		require(operators[sender] || sender == owner);
		_;
	}

	function _isHandler(uint256 handlerID) internal view {
		address msgSender = msg.sender;
		require((msgSender == dataStorageInstance.getTokenHandlerAddr(handlerID)) || (msgSender == owner), ONLY_HANDLER);
	}

	modifier onlyLiquidationManager {
		_isLiquidationManager();
		_;
	}

	function _isLiquidationManager() internal view {
		address msgSender = msg.sender;
		require((msgSender == dataStorageInstance.getLiquidationManagerAddr()) || (msgSender == owner), ONLY_LIQUIDATION_MANAGER);
	}

	modifier circuitBreaker {
		_isCircuitBreak();
		_;
	}

	function _isCircuitBreak() internal view {
		require((!emergency) || (msg.sender == owner), CIRCUIT_BREAKER);
	}

	modifier onlyBreaker {
		_isBreaker();
		_;
	}

	function _isBreaker() internal view {
		require(breakerTable[msg.sender].auth, ONLY_BREAKER);
	}
}

// File: contracts/marketManager/TokenManager.sol
// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.6.12;

/**
 * @title BiFi's marketManager contract
 * @notice Implement business logic and manage handlers
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract TokenManager is ManagerSlot {

	/**
	* @dev Constructor for marketManager
	* @param managerDataStorageAddr The address of the manager storage contract
	* @param oracleProxyAddr The address of oracle proxy contract (e.g., price feeds)
	* @param breaker The address of default circuit breaker
	* @param erc20Addr The address of reward token (ERC-20)
	*/
	constructor (address managerDataStorageAddr, address oracleProxyAddr, address _slotSetterAddr, address _handlerManagerAddr, address _flashloanAddr, address breaker, address erc20Addr) public
	{
		owner = msg.sender;
		dataStorageInstance = IManagerDataStorage(managerDataStorageAddr);
		oracleProxy = IOracleProxy(oracleProxyAddr);
		rewardErc20Instance = IERC20(erc20Addr);

		slotSetterAddr = _slotSetterAddr;
		handlerManagerAddr = _handlerManagerAddr;
		flashloanAddr = _flashloanAddr;

		breakerTable[owner].auth = true;
		breakerTable[breaker].auth = true;
	}

	/**
	* @dev Transfer ownership
	* @param _owner the address of the new owner
	* @return result the setter call in contextSetter contract
	*/
	function ownershipTransfer(address payable _owner) onlyOwner public returns (bool result) {
    bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.ownershipTransfer.selector,
				_owner
			);

    (result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	function setOperator(address payable adminAddr, bool flag) onlyOwner external returns (bool result) {
		bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setOperator.selector,
				adminAddr, flag
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Set the address of OracleProxy contract
	* @param oracleProxyAddr The address of OracleProxy contract
	* @return result the setter call in contextSetter contract
	*/
	function setOracleProxy(address oracleProxyAddr) onlyOwner external returns (bool result) {
    bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setOracleProxy.selector,
				oracleProxyAddr
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Set the address of BiFi reward token contract
	* @param erc20Addr The address of BiFi reward token contract
	* @return result the setter call in contextSetter contract
	*/
	function setRewardErc20(address erc20Addr) onlyOwner public returns (bool result) {
    bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setRewardErc20.selector,
				erc20Addr
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Authorize admin user for circuitBreaker
	* @param _target The address of the circuitBreaker admin user.
	* @param _status The boolean status of circuitBreaker (on/off)
	* @return result the setter call in contextSetter contract
	*/
	function setBreakerTable(address _target, bool _status) onlyOwner external returns (bool result) {
    bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setBreakerTable.selector,
				_target, _status
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Set circuitBreak to freeze/unfreeze all handlers
	* @param _emergency The boolean status of circuitBreaker (on/off)
	* @return result the setter call in contextSetter contract
	*/
	function setCircuitBreaker(bool _emergency) onlyBreaker external returns (bool result) {
		bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setCircuitBreaker.selector,
				_emergency
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	function setSlotSetterAddr(address _slotSetterAddr) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter.setSlotSetterAddr.selector,
					_slotSetterAddr
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	function sethandlerManagerAddr(address _handlerManagerAddr) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter.sethandlerManagerAddr.selector,
					_handlerManagerAddr
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	function setFlashloanAddr(address _flashloanAddr) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter.setFlashloanAddr.selector,
					_flashloanAddr
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	function setPositionStorageAddr(address _positionStorageAddr) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter.setPositionStorageAddr.selector,
					_positionStorageAddr
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	function setNFTAddr(address _nftAddr) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter.setNFTAddr.selector,
					_nftAddr
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	function setFlashloanFee(uint256 handlerID, uint256 flashFeeRate) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter
					.setFlashloanFee.selector,
					handlerID,
			    	flashFeeRate
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	function setDiscountBase(uint256 handlerID, uint256 feeBase) onlyOwner external returns (bool result) {
			bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter
					.setDiscountBase.selector,
					handlerID,
			    feeBase
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}

	/**
	* @dev Get the circuitBreak status
	* @return The circuitBreak status
	*/
	function getCircuitBreaker() external view returns (bool)
	{
		return emergency;
	}

	/**
	* @dev Get information for a handler
	* @param handlerID Handler ID
	* @return (success or failure, handler address, handler name)
	*/
	function getTokenHandlerInfo(uint256 handlerID) external view returns (bool, address, string memory)
	{
		bool support;
		address tokenHandlerAddr;
		string memory tokenName;
		if (dataStorageInstance.getTokenHandlerSupport(handlerID))
		{
			tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID);
			IProxy TokenHandler = IProxy(tokenHandlerAddr);
			bytes memory data;
			(, data) = TokenHandler.handlerViewProxy(
				abi.encodeWithSelector(
					IMarketHandler
					.getTokenName.selector
				)
			);
			tokenName = abi.decode(data, (string));
			support = true;
		}

		return (support, tokenHandlerAddr, tokenName);
	}

	/**
	* @dev Register a handler
	* @param handlerID Handler ID and address
	* @param tokenHandlerAddr The handler address
	* @return result the setter call in contextSetter contract
	*/
	function handlerRegister(uint256 handlerID, address tokenHandlerAddr, uint256 flashFeeRate, uint256 discountBase) onlyOwner external returns (bool result) {
		bytes memory callData = abi.encodeWithSelector(
					IManagerSlotSetter
					.handlerRegister.selector,
					handlerID, tokenHandlerAddr, flashFeeRate, discountBase
				);

			(result, ) = slotSetterAddr.delegatecall(callData);
		assert(result);
	}
	/**
	* @dev Set a liquidation manager contract
	* @param liquidationManagerAddr The address of liquidiation manager
	* @return result the setter call in contextSetter contract
	*/
	function setLiquidationManager(address liquidationManagerAddr) onlyOwner external returns (bool result) {
    bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setLiquidationManager.selector,
				liquidationManagerAddr
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Update the (SI) rewards for a user
	* @param userAddr The address of the user
	* @param callerID The handler ID
	* @return true (TODO: validate results)
	*/
	function rewardUpdateOfInAction(address payable userAddr, uint256 callerID) external returns (bool)
	{
		ContractInfo memory handlerInfo;
		(handlerInfo.support, handlerInfo.addr) = dataStorageInstance.getTokenHandlerInfo(callerID);
		if (handlerInfo.support)
		{
			IProxy TokenHandler;
			TokenHandler = IProxy(handlerInfo.addr);
			TokenHandler.siProxy(
				abi.encodeWithSelector(
					IServiceIncentive
					.updateRewardLane.selector,
					userAddr
				)
			);
		}

		return true;
	}

	/**
	* @dev Update interest of a user for a handler (internal)
	* @param userAddr The user address
	* @param callerID The handler ID
	* @param allFlag Flag for the full calculation mode (calculting for all handlers)
	* @return (uint256, uint256, uint256, uint256, uint256, uint256)
	*/
	function applyInterestHandlers(address payable userAddr, uint256 callerID, bool allFlag) external returns (uint256, uint256, uint256, uint256, uint256, uint256) {
    bytes memory callData = abi.encodeWithSelector(
				IHandlerManager
				.applyInterestHandlers.selector,
				userAddr, callerID, allFlag
			);

		(bool result, bytes memory returnData) = handlerManagerAddr.delegatecall(callData);
    assert(result);

    return abi.decode(returnData, (uint256, uint256, uint256, uint256, uint256, uint256));
  }

	/**
	* @dev Reward the user (msg.sender) with the reward token after calculating interest.
	* @return result the interestUpdateReward call in ManagerInterest contract
	*/
	function interestUpdateReward() external returns (bool result) {
		bytes memory callData = abi.encodeWithSelector(
				IHandlerManager
				.interestUpdateReward.selector
			);

		(result, ) = handlerManagerAddr.delegatecall(callData);
    	assert(result);
	}

	/**
	* @dev (Update operation) update the rewards parameters.
	* @param userAddr The address of operator
	* @return result the updateRewardParams call in ManagerInterest contract
	*/
	function updateRewardParams(address payable userAddr) onlyOperators external returns (bool result) {
		bytes memory callData = abi.encodeWithSelector(
				IHandlerManager
				.updateRewardParams.selector,
        userAddr
			);

		(result, ) = handlerManagerAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Claim all rewards for the user
	* @param userAddr The user address
	* @return true (TODO: validate results)
	*/
	function rewardClaimAll(address payable userAddr) external returns (uint256)
	{
    bytes memory callData = abi.encodeWithSelector(
				IHandlerManager
				.rewardClaimAll.selector,
        userAddr
			);

		(bool result, bytes memory returnData) = handlerManagerAddr.delegatecall(callData);
    assert(result);

    return abi.decode(returnData, (uint256));
	}

	/**
	* @dev Claim handler rewards for the user
	* @param handlerID The ID of claim reward handler
	* @param userAddr The user address
	* @return true (TODO: validate results)
	*/
	function claimHandlerReward(uint256 handlerID, address payable userAddr) external returns (uint256) {
		bytes memory callData = abi.encodeWithSelector(
				IHandlerManager
				.claimHandlerReward.selector,
        handlerID, userAddr
			);

		(bool result, bytes memory returnData) = handlerManagerAddr.delegatecall(callData);
    assert(result);

    return abi.decode(returnData, (uint256));
	}

	/**
	* @dev Transfer reward tokens to owner (for administration)
	* @param _amount The amount of the reward token
	* @return result (TODO: validate results)
	*/
	function ownerRewardTransfer(uint256 _amount) onlyOwner external returns (bool result)
	{
		bytes memory callData = abi.encodeWithSelector(
				IHandlerManager
				.ownerRewardTransfer.selector,
        _amount
			);

		(result, ) = handlerManagerAddr.delegatecall(callData);
    assert(result);
	}


	/**
	* @dev Get the token price of the handler
	* @param handlerID The handler ID
	* @return The token price of the handler
	*/
	function getTokenHandlerPrice(uint256 handlerID) external view returns (uint256)
	{
		return _getTokenHandlerPrice(handlerID);
	}

	/**
	* @dev Get the margin call limit of the handler (external)
	* @param handlerID The handler ID
	* @return The margin call limit
	*/
	function getTokenHandlerMarginCallLimit(uint256 handlerID) external view returns (uint256)
	{
		return _getTokenHandlerMarginCallLimit(handlerID);
	}

	/**
	* @dev Get the margin call limit of the handler (internal)
	* @param handlerID The handler ID
	* @return The margin call limit
	*/
	function _getTokenHandlerMarginCallLimit(uint256 handlerID) internal view returns (uint256)
	{
		IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID));
		bytes memory data;
		(, data) = TokenHandler.handlerViewProxy(
			abi.encodeWithSelector(
				IMarketHandler
				.getTokenHandlerMarginCallLimit.selector
			)
		);
		return abi.decode(data, (uint256));
	}

	/**
	* @dev Get the borrow limit of the handler (external)
	* @param handlerID The handler ID
	* @return The borrow limit
	*/
	function getTokenHandlerBorrowLimit(uint256 handlerID) external view returns (uint256)
	{
		return _getTokenHandlerBorrowLimit(handlerID);
	}

	/**
	* @dev Get the borrow limit of the handler (internal)
	* @param handlerID The handler ID
	* @return The borrow limit
	*/
	function _getTokenHandlerBorrowLimit(uint256 handlerID) internal view returns (uint256)
	{
		IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID));

		bytes memory data;
		(, data) = TokenHandler.handlerViewProxy(
			abi.encodeWithSelector(
				IMarketHandler
				.getTokenHandlerBorrowLimit.selector
			)
		);
		return abi.decode(data, (uint256));
	}

	/**
	* @dev Get the handler status of whether the handler is supported or not.
	* @param handlerID The handler ID
	* @return Whether the handler is supported or not
	*/
	function getTokenHandlerSupport(uint256 handlerID) external view returns (bool)
	{
		return dataStorageInstance.getTokenHandlerSupport(handlerID);
	}

	/**
	* @dev Set the length of the handler list
	* @param _tokenHandlerLength The length of the handler list
	* @return true (TODO: validate results)
	*/
	function setTokenHandlersLength(uint256 _tokenHandlerLength) onlyOwner external returns (bool)
	{
		tokenHandlerLength = _tokenHandlerLength;
		return true;
	}

	/**
	* @dev Get the length of the handler list
	* @return the length of the handler list
	*/
	function getTokenHandlersLength() external view returns (uint256)
	{
		return tokenHandlerLength;
	}

	/**
	* @dev Get the handler ID at the index in the handler list
	* @param index The index of the handler list (array)
	* @return The handler ID
	*/
	function getTokenHandlerID(uint256 index) external view returns (uint256)
	{
		return dataStorageInstance.getTokenHandlerID(index);
	}

	/**
	* @dev Get the amount of token that the user can borrow more
	* @param userAddr The address of user
	* @param handlerID The handler ID
	* @return The amount of token that user can borrow more
	*/
	function getUserExtraLiquidityAmount(address payable userAddr, uint256 handlerID) external view returns (uint256)
	{
		return _getUserExtraLiquidityAmount(userAddr, handlerID);
	}

	/**
	* @dev Get the deposit and borrow amount of the user with interest added
	* @param userAddr The address of user
	* @param handlerID The handler ID
	* @return The deposit and borrow amount of the user with interest
	*/
	/* about user market Information function*/
	function getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) external view returns (uint256, uint256)
	{
		return _getUserIntraHandlerAssetWithInterest(userAddr, handlerID);
	}

	/**
	* @dev Get the depositTotalCredit and borrowTotalCredit
	* @param userAddr The address of the user
	* @return depositTotalCredit The amount that users can borrow (i.e. deposit * borrowLimit)
	* @return borrowTotalCredit The sum of borrow amount for all handlers
	*/
	function getUserTotalIntraCreditAsset(address payable userAddr) external view returns (uint256, uint256)
	{
		return _getUserTotalIntraCreditAsset(userAddr);
	}

	/**
	* @dev Get the borrow and margin call limits of the user for all handlers
	* @param userAddr The address of the user
	* @return userTotalBorrowLimitAsset the sum of borrow limit for all handlers
	* @return userTotalMarginCallLimitAsset the sume of margin call limit for handlers
	*/
	function getUserLimitIntraAsset(address payable userAddr) external view returns (uint256, uint256)
	{
		uint256 userTotalBorrowLimitAsset;
		uint256 userTotalMarginCallLimitAsset;

		for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++)
		{
			if (dataStorageInstance.getTokenHandlerSupport(handlerID))
			{
				uint256 depositHandlerAsset;
				uint256 borrowHandlerAsset;
				(depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID);
				uint256 borrowLimit = _getTokenHandlerBorrowLimit(handlerID);
				uint256 marginCallLimit = _getTokenHandlerMarginCallLimit(handlerID);
				uint256 userBorrowLimitAsset = depositHandlerAsset.unifiedMul(borrowLimit);
				uint256 userMarginCallLimitAsset = depositHandlerAsset.unifiedMul(marginCallLimit);
				userTotalBorrowLimitAsset = userTotalBorrowLimitAsset.add(userBorrowLimitAsset);
				userTotalMarginCallLimitAsset = userTotalMarginCallLimitAsset.add(userMarginCallLimitAsset);
			}
			else
			{
				continue;
			}

		}

		return (userTotalBorrowLimitAsset, userTotalMarginCallLimitAsset);
	}


	/**
	* @dev Get the maximum allowed amount to borrow of the user from the given handler
	* @param userAddr The address of the user
	* @param callerID The target handler to borrow
	* @return extraCollateralAmount The maximum allowed amount to borrow from
	  the handler.
	*/
	function getUserCollateralizableAmount(address payable userAddr, uint256 callerID) external view returns (uint256)
	{
		uint256 userTotalBorrowAsset;
		uint256 depositAssetBorrowLimitSum;
		uint256 depositHandlerAsset;
		uint256 borrowHandlerAsset;
		for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++)
		{
			if (dataStorageInstance.getTokenHandlerSupport(handlerID))
			{

				(depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID);
				userTotalBorrowAsset = userTotalBorrowAsset.add(borrowHandlerAsset);
				depositAssetBorrowLimitSum = depositAssetBorrowLimitSum
												.add(
													depositHandlerAsset
													.unifiedMul( _getTokenHandlerBorrowLimit(handlerID) )
												);
			}
		}

		if (depositAssetBorrowLimitSum > userTotalBorrowAsset)
		{
			return depositAssetBorrowLimitSum
					.sub(userTotalBorrowAsset)
					.unifiedDiv( _getTokenHandlerBorrowLimit(callerID) )
					.unifiedDiv( _getTokenHandlerPrice(callerID) );
		}
		return 0;
	}

	/**
	* @dev Partial liquidation for a user
	* @param delinquentBorrower The address of the liquidation target
	* @param liquidateAmount The amount to liquidate
	* @param liquidator The address of the liquidator (liquidation operator)
	* @param liquidateHandlerID The hander ID of the liquidating asset
	* @param rewardHandlerID The handler ID of the reward token for the liquidator
	* @return (uint256, uint256, uint256)
	*/
	function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 liquidateHandlerID, uint256 rewardHandlerID) onlyLiquidationManager external returns (uint256, uint256, uint256)
	{
		address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(liquidateHandlerID);
		IProxy TokenHandler = IProxy(tokenHandlerAddr);
		bytes memory data;

		data = abi.encodeWithSelector(
			IMarketHandler
			.partialLiquidationUser.selector,

			delinquentBorrower,
			liquidateAmount,
			liquidator,
			rewardHandlerID
		);
		(, data) = TokenHandler.handlerProxy(data);

		return abi.decode(data, (uint256, uint256, uint256));
	}

	/**
	* @dev Get the maximum liquidation reward by checking sufficient reward
	  amount for the liquidator.
	* @param delinquentBorrower The address of the liquidation target
	* @param liquidateHandlerID The hander ID of the liquidating asset
	* @param liquidateAmount The amount to liquidate
	* @param rewardHandlerID The handler ID of the reward token for the liquidator
	* @param rewardRatio delinquentBorrowAsset / delinquentDepositAsset
	* @return The maximum reward token amount for the liquidator
	*/
	function getMaxLiquidationReward(address payable delinquentBorrower, uint256 liquidateHandlerID, uint256 liquidateAmount, uint256 rewardHandlerID, uint256 rewardRatio) external view returns (uint256)
	{
		uint256 liquidatePrice = _getTokenHandlerPrice(liquidateHandlerID);
		uint256 rewardPrice = _getTokenHandlerPrice(rewardHandlerID);
		uint256 delinquentBorrowerRewardDeposit;
		(delinquentBorrowerRewardDeposit, ) = _getHandlerAmount(delinquentBorrower, rewardHandlerID);
		uint256 rewardAsset = delinquentBorrowerRewardDeposit.unifiedMul(rewardPrice).unifiedMul(rewardRatio);
		if (liquidateAmount.unifiedMul(liquidatePrice) > rewardAsset)
		{
			return rewardAsset.unifiedDiv(liquidatePrice);
		}
		else
		{
			return liquidateAmount;
		}

	}

	/**
	* @dev Reward the liquidator
	* @param delinquentBorrower The address of the liquidation target
	* @param rewardAmount The amount of reward token
	* @param liquidator The address of the liquidator (liquidation operator)
	* @param handlerID The handler ID of the reward token for the liquidator
	* @return The amount of reward token
	*/
	function partialLiquidationUserReward(address payable delinquentBorrower, uint256 rewardAmount, address payable liquidator, uint256 handlerID) onlyLiquidationManager external returns (uint256)
	{
		address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID);
		IProxy TokenHandler = IProxy(tokenHandlerAddr);
		bytes memory data;
		data = abi.encodeWithSelector(
			IMarketHandler
			.partialLiquidationUserReward.selector,

			delinquentBorrower,
			rewardAmount,
			liquidator
		);
		(, data) = TokenHandler.handlerProxy(data);

		return abi.decode(data, (uint256));
	}

	/**
    * @dev Execute flashloan contract with delegatecall
    * @param handlerID The ID of the token handler to borrow.
    * @param receiverAddress The address of receive callback contract
    * @param amount The amount of borrow through flashloan
    * @param params The encode metadata of user
    * @return Whether or not succeed
    */
 	function flashloan(
      uint256 handlerID,
      address receiverAddress,
      uint256 amount,
      bytes calldata params
    ) external returns (bool) {
      bytes memory callData = abi.encodeWithSelector(
				IManagerFlashloan
				.flashloan.selector,
				handlerID, receiverAddress, amount, params
			);

      (bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData);
      assert(result);

      return abi.decode(returnData, (bool));
    }

	/**
	* @dev Call flashloan logic contract with delegatecall
    * @param handlerID The ID of handler with accumulated flashloan fee
    * @return The amount of fee accumlated to handler
    */
 	function getFeeTotal(uint256 handlerID) external returns (uint256)
	{
		bytes memory callData = abi.encodeWithSelector(
				IManagerFlashloan
				.getFeeTotal.selector,
				handlerID
			);

		(bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData);
		assert(result);

		return abi.decode(returnData, (uint256));
    }

	/**
    * @dev Withdraw accumulated flashloan fee with delegatecall
    * @param handlerID The ID of handler with accumulated flashloan fee
    * @return Whether or not succeed
    */
	function withdrawFlashloanFee(
      uint256 handlerID
    ) external onlyOwner returns (bool) {
    	bytes memory callData = abi.encodeWithSelector(
				IManagerFlashloan
				.withdrawFlashloanFee.selector,
				handlerID
			);

		(bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData);
		assert(result);

		return abi.decode(returnData, (bool));
    }

  /**
    * @dev Get flashloan fee for flashloan amount before make product(BiFi-X)
    * @param handlerID The ID of handler with accumulated flashloan fee
    * @param amount The amount of flashloan amount
    * @param bifiAmount The amount of Bifi amount
    * @return The amount of fee for flashloan amount
    */
  function getFeeFromArguments(
      uint256 handlerID,
      uint256 amount,
      uint256 bifiAmount
    ) external returns (uint256) {
      bytes memory callData = abi.encodeWithSelector(
				IManagerFlashloan
				.getFeeFromArguments.selector,
				handlerID, amount, bifiAmount
			);

      (bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData);
      assert(result);

      return abi.decode(returnData, (uint256));
    }

	/**
	* @dev Get the deposit and borrow amount of the user for the handler (internal)
	* @param userAddr The address of user
	* @param handlerID The handler ID
	* @return The deposit and borrow amount
	*/
	function _getHandlerAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256)
	{
		IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID));
		bytes memory data;
		(, data) = TokenHandler.handlerViewProxy(
			abi.encodeWithSelector(
				IMarketHandler
				.getUserAmount.selector,
				userAddr
			)
		);
		return abi.decode(data, (uint256, uint256));
	}

  	/**
	* @dev Get the deposit and borrow amount with interest of the user for the handler (internal)
	* @param userAddr The address of user
	* @param handlerID The handler ID
	* @return The deposit and borrow amount with interest
	*/
	function _getHandlerAmountWithAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256)
	{
		IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID));
		bytes memory data;
		(, data) = TokenHandler.handlerViewProxy(
			abi.encodeWithSelector(
				IMarketHandler
				.getUserAmountWithInterest.selector,
				userAddr
			)
		);
		return abi.decode(data, (uint256, uint256));
	}

	/**
	* @dev Set the support stauts for the handler
	* @param handlerID the handler ID
	* @param support the support status (boolean)
	* @return result the setter call in contextSetter contract
	*/
	function setHandlerSupport(uint256 handlerID, bool support) onlyOwner public returns (bool result) {
		bytes memory callData = abi.encodeWithSelector(
				IManagerSlotSetter
				.setHandlerSupport.selector,
				handlerID, support
			);

		(result, ) = slotSetterAddr.delegatecall(callData);
    assert(result);
	}

	/**
	* @dev Get owner's address of the manager contract
	* @return The address of owner
	*/
	function getOwner() public view returns (address)
	{
		return owner;
	}

	/**
	* @dev Get the deposit and borrow amount of the user with interest added
	* @param userAddr The address of user
	* @param handlerID The handler ID
	* @return The deposit and borrow amount of the user with interest
	*/
	function _getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256)
	{
		uint256 price = _getTokenHandlerPrice(handlerID);
		IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID));
		uint256 depositAmount;
		uint256 borrowAmount;

		bytes memory data;
		(, data) = TokenHandler.handlerViewProxy(
			abi.encodeWithSelector(
				IMarketHandler.getUserAmountWithInterest.selector,
				userAddr
			)
		);
		(depositAmount, borrowAmount) = abi.decode(data, (uint256, uint256));

		uint256 depositAsset = depositAmount.unifiedMul(price);
		uint256 borrowAsset = borrowAmount.unifiedMul(price);
		return (depositAsset, borrowAsset);
	}

	/**
	* @dev Get the depositTotalCredit and borrowTotalCredit
	* @param userAddr The address of the user
	* @return depositTotalCredit The amount that users can borrow (i.e. deposit * borrowLimit)
	* @return borrowTotalCredit The sum of borrow amount for all handlers
	*/
	function _getUserTotalIntraCreditAsset(address payable userAddr) internal view returns (uint256, uint256)
	{
		uint256 depositTotalCredit;
		uint256 borrowTotalCredit;
		for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++)
		{
			if (dataStorageInstance.getTokenHandlerSupport(handlerID))
			{
				uint256 depositHandlerAsset;
				uint256 borrowHandlerAsset;
				(depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID);
				uint256 borrowLimit = _getTokenHandlerBorrowLimit(handlerID);
				uint256 depositHandlerCredit = depositHandlerAsset.unifiedMul(borrowLimit);
				depositTotalCredit = depositTotalCredit.add(depositHandlerCredit);
				borrowTotalCredit = borrowTotalCredit.add(borrowHandlerAsset);
			}
			else
			{
				continue;
			}

		}

		return (depositTotalCredit, borrowTotalCredit);
	}

	/**
	* @dev Get the amount of token that the user can borrow more
	* @param userAddr The address of user
	* @param handlerID The handler ID
	* @return The amount of token that user can borrow more
	*/
  	function _getUserExtraLiquidityAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256) {
		uint256 depositCredit;
		uint256 borrowCredit;
		(depositCredit, borrowCredit) = _getUserTotalIntraCreditAsset(userAddr);
		if (depositCredit == 0)
		{
			return 0;
		}

		if (depositCredit > borrowCredit)
		{
			return depositCredit.sub(borrowCredit).unifiedDiv(_getTokenHandlerPrice(handlerID));
		}
		else
		{
			return 0;
		}
	}

	function getFeePercent(uint256 handlerID) external view returns (uint256)
	{
	return handlerFlashloan[handlerID].flashFeeRate;
	}

	/**
	* @dev Get the token price for the handler
	* @param handlerID The handler id
	* @return The token price of the handler
	*/
	function _getTokenHandlerPrice(uint256 handlerID) internal view returns (uint256)
	{
		return (oracleProxy.getTokenPrice(handlerID));
	}

	/**
	* @dev Get the address of reward token
	* @return The address of reward token
	*/
	function getRewardErc20() public view returns (address)
	{
		return address(rewardErc20Instance);
	}

	/**
	* @dev Get the reward parameters
	* @return (uint256,uint256,uint256) rewardPerBlock, rewardDecrement, rewardTotalAmount
	*/
	function getGlobalRewardInfo() external view returns (uint256, uint256, uint256)
	{
		IManagerDataStorage _dataStorage = dataStorageInstance;
		return (_dataStorage.getGlobalRewardPerBlock(), _dataStorage.getGlobalRewardDecrement(), _dataStorage.getGlobalRewardTotalAmount());
	}

	function setObserverAddr(address observerAddr) onlyOwner external returns (bool) {
		Observer = IObserver( observerAddr );
	}

	/**
	* @dev fallback function where handler can receive native coin
	*/
	fallback () external payable
	{

	}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"managerDataStorageAddr","type":"address"},{"internalType":"address","name":"oracleProxyAddr","type":"address"},{"internalType":"address","name":"_slotSetterAddr","type":"address"},{"internalType":"address","name":"_handlerManagerAddr","type":"address"},{"internalType":"address","name":"_flashloanAddr","type":"address"},{"internalType":"address","name":"breaker","type":"address"},{"internalType":"address","name":"erc20Addr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"Observer","outputs":[{"internalType":"contract IObserver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"},{"internalType":"bool","name":"allFlag","type":"bool"}],"name":"applyInterestHandlers","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"claimHandlerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"flashloan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flashloanAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCircuitBreaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"bifiAmount","type":"uint256"}],"name":"getFeeFromArguments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getGlobalRewardInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"liquidateHandlerID","type":"uint256"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"uint256","name":"rewardHandlerID","type":"uint256"},{"internalType":"uint256","name":"rewardRatio","type":"uint256"}],"name":"getMaxLiquidationReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardErc20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenHandlerID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerInfo","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerMarginCallLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerSupport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenHandlersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"}],"name":"getUserCollateralizableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getUserExtraLiquidityAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getUserIntraHandlerAssetWithInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"getUserLimitIntraAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"getUserTotalIntraCreditAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"handlerFlashloan","outputs":[{"internalType":"uint256","name":"flashFeeRate","type":"uint256"},{"internalType":"uint256","name":"discountBase","type":"uint256"},{"internalType":"uint256","name":"feeTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"handlerManagerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address","name":"tokenHandlerAddr","type":"address"},{"internalType":"uint256","name":"flashFeeRate","type":"uint256"},{"internalType":"uint256","name":"discountBase","type":"uint256"}],"name":"handlerRegister","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestUpdateReward","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerRewardTransfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"}],"name":"ownershipTransfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"address payable","name":"liquidator","type":"address"},{"internalType":"uint256","name":"liquidateHandlerID","type":"uint256"},{"internalType":"uint256","name":"rewardHandlerID","type":"uint256"}],"name":"partialLiquidationUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address payable","name":"liquidator","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"partialLiquidationUserReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"positionStorageAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"rewardClaimAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"}],"name":"rewardUpdateOfInAction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBreakerTable","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_emergency","type":"bool"}],"name":"setCircuitBreaker","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"uint256","name":"feeBase","type":"uint256"}],"name":"setDiscountBase","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_flashloanAddr","type":"address"}],"name":"setFlashloanAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"uint256","name":"flashFeeRate","type":"uint256"}],"name":"setFlashloanFee","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"setHandlerSupport","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidationManagerAddr","type":"address"}],"name":"setLiquidationManager","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddr","type":"address"}],"name":"setNFTAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"observerAddr","type":"address"}],"name":"setObserverAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adminAddr","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracleProxyAddr","type":"address"}],"name":"setOracleProxy","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_positionStorageAddr","type":"address"}],"name":"setPositionStorageAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setRewardErc20","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_slotSetterAddr","type":"address"}],"name":"setSlotSetterAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenHandlerLength","type":"uint256"}],"name":"setTokenHandlersLength","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_handlerManagerAddr","type":"address"}],"name":"sethandlerManagerAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slotSetterAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenHandlerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"updateRewardParams","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"withdrawFlashloanFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526003805460ff1916905534801561001a57600080fd5b5060405162004c1038038062004c10833981810160405260e081101561003f57600080fd5b5080516020808301516040808501516060860151608087015160a088015160c09098015160008054336001600160a01b03199182161780835560038054610100600160a81b0319166101006001600160a01b039d8e1602179055600480548316998c1699909917909855600580548216938b1693909317909255600780548316958a1695909517909455600880548216938916939093179092556009805490921690871617905591841682526002909252818120805460ff19908116600190811790925593909416815290812080549092169092179055614ae99081906200012790396000f3fe60806040526004361061038c5760003560e01c80637b66a7da116101dc578063c6adddab11610102578063dad2829f116100a0578063e8be60741161006f578063e8be607414610e89578063f18490c714610ece578063f502ca7414610f00578063fe4d27cd14610f155761038c565b8063dad2829f14610d12578063dd8bc8d414610d86578063de96f58e14610dbf578063e521809e14610e565761038c565b8063ce19512c116100dc578063ce19512c14610bc1578063d007242e14610beb578063d3a417a214610ca6578063dac9f9db14610cd95761038c565b8063c6adddab14610b6d578063ca2ec6ea14610b97578063caa6fea414610bac5761038c565b80638da5cb5b1161017a578063a205c6fd11610149578063a205c6fd14610ad7578063a7e55d2214610b0a578063b55c9b0114610b1f578063c188214f14610b345761038c565b80638da5cb5b14610a6857806390cdd94d14610a7d57806397f2b41914610aad5780639e1c53d814610ac25761038c565b80638369b1df116101b65780638369b1df146109f657806387fa699714610a0b578063893d20e814610a205780638b91bd7314610a355761038c565b80637b66a7da146109495780637d170e261461097c5780638178d60a146109af5761038c565b806341418632116102c1578063611dacd31161025f578063740f1e181161022e578063740f1e181461089557806375ff47bf146108aa5780637905b435146108dd57806379c9ecac146109165761038c565b8063611dacd3146107c3578063618a56c2146107ed578063644fc9351461082057806369f3629a1461086b5761038c565b80634dbeb3871161029b5780634dbeb387146106d75780634f81866b14610708578063558a72971461071d57806357daa7b0146107585761038c565b806341418632146106575780634250644914610681578063461fe3a6146106ad5761038c565b806323cda5761161032e57806338f92fc71161030857806338f92fc71461058f5780633b884de6146105c25780633be8b4a5146105fd5780634107f10a1461062d5761038c565b806323cda576146104ef5780632ab0b0eb14610519578063314d59fc146105435761038c565b8063144236501161036a578063144236501461044a57806315ddcdaf1461047d5780631defc035146104a757806320e5f7a6146104da5761038c565b806311ad747b1461038e57806311f151eb146103ca57806313a8be9d14610411575b005b34801561039a57600080fd5b506103b8600480360360208110156103b157600080fd5b5035610f4b565b60408051918252519081900360200190f35b3480156103d657600080fd5b506103fd600480360360208110156103ed57600080fd5b50356001600160a01b0316610f5d565b604080519115158252519081900360200190f35b34801561041d57600080fd5b506103fd6004803603604081101561043457600080fd5b506001600160a01b0381351690602001356110fe565b34801561045657600080fd5b506103fd6004803603602081101561046d57600080fd5b50356001600160a01b0316611385565b34801561048957600080fd5b506103b8600480360360208110156104a057600080fd5b5035611470565b3480156104b357600080fd5b506103fd600480360360208110156104ca57600080fd5b50356001600160a01b03166114f3565b3480156104e657600080fd5b506103b861161b565b3480156104fb57600080fd5b506103fd6004803603602081101561051257600080fd5b5035611621565b34801561052557600080fd5b506103b86004803603602081101561053c57600080fd5b5035611672565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b031661167d565b6040805192835260208301919091528051918290030190f35b34801561059b57600080fd5b506103fd600480360360208110156105b257600080fd5b50356001600160a01b0316611692565b3480156105ce57600080fd5b506103fd600480360360408110156105e557600080fd5b506001600160a01b038135169060200135151561177d565b34801561060957600080fd5b506103fd6004803603604081101561062057600080fd5b50803590602001356118ea565b34801561063957600080fd5b506103fd6004803603602081101561065057600080fd5b50356119d5565b34801561066357600080fd5b506103b86004803603602081101561067a57600080fd5b5035611a52565b34801561068d57600080fd5b506103fd600480360360208110156106a457600080fd5b50351515611a5d565b3480156106b957600080fd5b506103b8600480360360208110156106d057600080fd5b5035611adb565b3480156106e357600080fd5b506106ec611ae6565b604080516001600160a01b039092168252519081900360200190f35b34801561071457600080fd5b506106ec611af5565b34801561072957600080fd5b506103fd6004803603604081101561074057600080fd5b506001600160a01b0381351690602001351515611b04565b34801561076457600080fd5b506107a5600480360360a081101561077b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611bf7565b60408051938452602084019290925282820152519081900360600190f35b3480156107cf57600080fd5b506103fd600480360360208110156107e657600080fd5b5035611ead565b3480156107f957600080fd5b506103fd6004803603602081101561081057600080fd5b50356001600160a01b031661202e565b34801561082c57600080fd5b506103b8600480360360a081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612119565b34801561087757600080fd5b506107a56004803603602081101561088e57600080fd5b5035612192565b3480156108a157600080fd5b506106ec6121b3565b3480156108b657600080fd5b506103fd600480360360208110156108cd57600080fd5b50356001600160a01b03166121c2565b3480156108e957600080fd5b506103b86004803603604081101561090057600080fd5b506001600160a01b0381351690602001356122ad565b34801561092257600080fd5b506103fd6004803603602081101561093957600080fd5b50356001600160a01b03166123d7565b34801561095557600080fd5b506103fd6004803603602081101561096c57600080fd5b50356001600160a01b03166124c2565b34801561098857600080fd5b506105766004803603602081101561099f57600080fd5b50356001600160a01b031661255a565b3480156109bb57600080fd5b506103b8600480360360808110156109d257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612671565b348015610a0257600080fd5b506103b861290c565b348015610a1757600080fd5b506106ec612912565b348015610a2c57600080fd5b506106ec612921565b348015610a4157600080fd5b506103b860048036036020811015610a5857600080fd5b50356001600160a01b0316612930565b348015610a7457600080fd5b506106ec6129ad565b348015610a8957600080fd5b506103fd60048036036040811015610aa057600080fd5b50803590602001356129bc565b348015610ab957600080fd5b506106ec612aa7565b348015610ace57600080fd5b506106ec612ab6565b348015610ae357600080fd5b506103fd60048036036020811015610afa57600080fd5b50356001600160a01b0316612ac5565b348015610b1657600080fd5b506103fd612bb0565b348015610b2b57600080fd5b506106ec612bb9565b348015610b4057600080fd5b506103b860048036036040811015610b5757600080fd5b506001600160a01b038135169060200135612bc8565b348015610b7957600080fd5b506103fd60048036036020811015610b9057600080fd5b5035612bdb565b348015610ba357600080fd5b506107a5612cbf565b348015610bb857600080fd5b506103fd612e27565b348015610bcd57600080fd5b506103b860048036036020811015610be457600080fd5b5035612e30565b348015610bf757600080fd5b50610c1560048036036020811015610c0e57600080fd5b5035612ea9565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c69578181015183820152602001610c51565b50505050905090810190601f168015610c965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610cb257600080fd5b506103fd60048036036020811015610cc957600080fd5b50356001600160a01b0316613265565b348015610ce557600080fd5b506103b860048036036040811015610cfc57600080fd5b50803590602001356001600160a01b0316613350565b348015610d1e57600080fd5b50610d5360048036036060811015610d3557600080fd5b506001600160a01b0381351690602081013590604001351515613467565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610d9257600080fd5b5061057660048036036040811015610da957600080fd5b506001600160a01b0381351690602001356135c3565b348015610dcb57600080fd5b506103fd60048036036080811015610de257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b811115610e1857600080fd5b820183602082011115610e2a57600080fd5b803590602001918460018302840111600160201b83111715610e4b57600080fd5b5090925090506135db565b348015610e6257600080fd5b506103fd60048036036020811015610e7957600080fd5b50356001600160a01b0316613751565b348015610e9557600080fd5b506103fd60048036036080811015610eac57600080fd5b508035906001600160a01b03602082013516906040810135906060013561383c565b348015610eda57600080fd5b506103fd60048036036040811015610ef157600080fd5b508035906020013515156139b5565b348015610f0c57600080fd5b506103fd613aa4565b348015610f2157600080fd5b506103b860048036036060811015610f3857600080fd5b5080359060208101359060400135613b7f565b6000908152600d602052604090205490565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461100d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fd2578181015183820152602001610fba565b50505050905090810190601f168015610fff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166311f151eb60e01b1781526007549351835193949092169284929182918083835b602083106110865780518252601f199092019160209182019101611067565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b505080925050816110f857fe5b50919050565b6000611108614a58565b60035460408051636803921760e11b81526004810186905281516101009093046001600160a01b03169263d007242e92602480840193919291829003018186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d604081101561117f57600080fd5b5080516020918201516001600160a01b031691830191909152158015825261137957602080820151604080516001600160a01b038881166024808401919091528351808403820181526044938401855280870180516001600160e01b031663c8474ce560e01b17815294516321daf55f60e11b81526004810197885281519281019290925280519596928716956343b5eabe959194849301919080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156112c057600080fd5b815160208301805160405192949293830192919084600160201b8211156112e657600080fd5b9083019060208201858111156112fb57600080fd5b8251600160201b81118282018810171561131457600080fd5b82525081516020918201929091019080838360005b83811015611341578181015183820152602001611329565b50505050905090810190601f16801561136e5780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146113f85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316630144236560e41b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600354604080516315ddcdaf60e01b815260048101849052905160009261010090046001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b1580156114c157600080fd5b505afa1580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b505192915050565b3360008181526001602052604081205490919060ff168061152157506000546001600160a01b038281169116145b61152a57600080fd5b604080516001600160a01b0380861660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631defc03560e01b1781526008549351835193949092169284929182918083835b602083106115a25780518252601f199092019160209182019101611583565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b5050809350508261161457fe5b5050919050565b600c5481565b600354604080516311e6d2bb60e11b815260048101849052905160009261010090046001600160a01b0316916323cda576916024808301926020929190829003018186803b1580156114c157600080fd5b600061137f82613c9a565b60008061168983613ce7565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117055760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166338f92fc760e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117f05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b0316631dc426f360e11b1781526007549351835193949092169284929182918083835b602083106118715780518252601f199092019160209182019101611852565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146118d1576040519150601f19603f3d011682016040523d82523d6000602084013e6118d6565b606091505b505080925050816118e357fe5b5092915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461195d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b0316633be8b4a560e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611a485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050600c55600190565b600061137f82613dd6565b6000611a67614043565b6040805183151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316634250644960e01b1781526007549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600061137f826140c0565b600a546001600160a01b031681565b6007546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611b775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b031663558a729760e01b178152600754935183519394909216928492918291808383602083106118715780518252601f199092019160209182019101611852565b6000806000611c046141ce565b60035460408051631b677ffb60e11b815260048101889052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611d35578181015183820152602001611d1d565b50505050905090810190601f168015611d625780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611dbe57600080fd5b815160208301805160405192949293830192919084600160201b821115611de457600080fd5b908301906020820185811115611df957600080fd5b8251600160201b811182820188101715611e1257600080fd5b82525081516020918201929091019080838360005b83811015611e3f578181015183820152602001611e27565b50505050905090810190601f168015611e6c5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020830191506060811015611e8c57600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611f205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663611dacd360e01b1781526009549251825192936000936060936001600160a01b0390921692869290918291908083835b60208310611f9d5780518252601f199092019160209182019101611f7e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611ffd576040519150601f19603f3d011682016040523d82523d6000602084013e612002565b606091505b50915091508161200e57fe5b80806020019051602081101561202357600080fd5b505195945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146120a15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166330c52b6160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60008061212586613c9a565b9050600061213285613c9a565b9050600061214089876142d4565b5090506000612159866121538486614562565b90614562565b9050806121668986614562565b1115612181576121768185614599565b945050505050612189565b879450505050505b95945050505050565b600d6020526000908152604090208054600182015460029092015490919083565b600b546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146122355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166375ff47bf60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b6000806000806000805b600c5481101561238e57600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d602081101561234457600080fd5b5051156123865761235588826145d0565b90935091506123648583614890565b945061238361237c612375836140c0565b8590614562565b8590614890565b93505b6001016122b7565b50838311156123ca576123bf6123a387613c9a565b6123b96123af896140c0565b6123b987896148ce565b90614599565b94505050505061137f565b5060009695505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461244a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631e727b2b60e21b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146125355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50600680546001600160a01b0319166001600160a01b03939093169290921790915590565b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125c657600080fd5b505afa1580156125da573d6000803e3d6000fd5b505050506040513d60208110156125f057600080fd5b50511561265e5760008061260488846145d0565b90925090506000612614846140c0565b9050600061262185613dd6565b9050600061262f8584614562565b9050600061263d8684614562565b90506126498983614890565b98506126558882614890565b97505050505050505b600101612563565b509092509050915091565b600061267b6141ce565b60035460408051631b677ffb60e11b815260048101859052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b838110156127a8578181015183820152602001612790565b50505050905090810190601f1680156127d55780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561283157600080fd5b815160208301805160405192949293830192919084600160201b82111561285757600080fd5b90830190602082018581111561286c57600080fd5b8251600160201b81118282018810171561288557600080fd5b82525081516020918201929091019080838360005b838110156128b257818101518382015260200161289a565b50505050905090810190601f1680156128df5780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156128fe57600080fd5b505198975050505050505050565b600c5490565b6009546001600160a01b031681565b6000546001600160a01b031690565b604080516001600160a01b0380841660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638b91bd7360e01b17815260085493518351600095869460609491169286929091829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b6000546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612a2f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b03166390cdd94d60e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b6005546001600160a01b031690565b6008546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612b385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663a205c6fd60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60035460ff1690565b6006546001600160a01b031681565b6000612bd483836148f4565b9392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612c4e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663c6adddab60e01b1781526008549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600080600080600360019054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1657600080fd5b505afa158015612d2a573d6000803e3d6000fd5b505050506040513d6020811015612d4057600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b158015612d8257600080fd5b505afa158015612d96573d6000803e3d6000fd5b505050506040513d6020811015612dac57600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b158015612dee57600080fd5b505afa158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b50519195509350915050909192565b60035460ff1681565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316633386544b60e21b1781526009549251825160009485936060936001600160a01b0390921692869291829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b60008060606000806060600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f0c57600080fd5b505afa158015612f20573d6000803e3d6000fd5b505050506040513d6020811015612f3657600080fd5b50511561325857600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b8381101561304d578181015183820152602001613035565b50505050905090810190601f16801561307a5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156130d457600080fd5b815160208301805160405192949293830192919084600160201b8211156130fa57600080fd5b90830190602082018581111561310f57600080fd5b8251600160201b81118282018810171561312857600080fd5b82525081516020918201929091019080838360005b8381101561315557818101518382015260200161313d565b50505050905090810190601f1680156131825780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156131a157600080fd5b8101908080516040519392919084600160201b8211156131c057600080fd5b9083019060208201858111156131d557600080fd5b8251600160201b8111828201881017156131ee57600080fd5b82525081516020918201929091019080838360005b8381101561321b578181015183820152602001613203565b50505050905090810190601f1680156132485780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146132d85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166369d20bd160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60408051602481018490526001600160a01b0380841660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663dac9f9db60e01b1781526008549351835160009586946060949116928692909182918083835b602083106133d55780518252601f1990920191602091820191016133b6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613435576040519150601f19603f3d011682016040523d82523d6000602084013e61343a565b606091505b50915091508161344657fe5b80806020019051602081101561345b57600080fd5b50519695505050505050565b604080516001600160a01b0380861660248301526044820185905283151560648084019190915283518084039091018152608490920183526020820180516001600160e01b031663dad2829f60e01b17815260085493518351600095869586958695869586959394869460609491909116928692918291908083835b602083106135025780518252601f1990920191602091820191016134e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613562576040519150601f19603f3d011682016040523d82523d6000602084013e613567565b606091505b50915091508161357357fe5b8080602001905160c081101561358857600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b5099509750909550935050505093975093979195509350565b6000806135d084846145d0565b915091509250929050565b6000606063de96f58e60e01b878787878760405160240180868152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600083820181905260408051601f909301601f1990811690950183810390950183529384526020820180516001600160e01b03166001600160e01b0319909d169c909c178c5260095493518251929d50909b60609b506001600160a01b0390941699508c9850965086955091935090915081905083835b602083106136bc5780518252601f19909201916020918201910161369d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461371c576040519150601f19603f3d011682016040523d82523d6000602084013e613721565b606091505b50915091508161372d57fe5b80806020019051602081101561374257600080fd5b50519998505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146137c45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316637290c04f60e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146138af5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602481018790526001600160a01b0380871660448301526064820186905260848083018690528351808403909101815260a490920183526020820180516001600160e01b0316633a2f981d60e21b1781526007549351835193949092169284929182918083835b6020831061393a5780518252601f19909201916020918201910161391b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b505080925050816139ac57fe5b50949350505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314613a285760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516024810185905283151560448083019190915282518083039091018152606490910182526020810180516001600160e01b031663f18490c760e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b60408051600481526024810182526020810180516001600160e01b0316633d40b29d60e21b178152600854925182516000946001600160a01b0316928492918291908083835b60208310613b095780518252601f199092019160209182019101613aea565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613b69576040519150601f19603f3d011682016040523d82523d6000602084013e613b6e565b606091505b50508092505081613b7b57fe5b5090565b604080516024810185905260448101849052606480820184905282518083039091018152608490910182526020810180516001600160e01b031663fe4d27cd60e01b1781526009549251825160009485936060936001600160a01b039092169286929182918083835b60208310613c075780518252601f199092019160209182019101613be8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613c67576040519150601f19603f3d011682016040523d82523d6000602084013e613c6c565b606091505b509150915081613c7857fe5b808060200190516020811015613c8d57600080fd5b5051979650505050505050565b600480546040805163c457fb3760e01b8152928301849052516000926001600160a01b039092169163c457fb37916024808301926020929190829003018186803b1580156114c157600080fd5b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d5357600080fd5b505afa158015613d67573d6000803e3d6000fd5b505050506040513d6020811015613d7d57600080fd5b505115613dce57600080613d9188846145d0565b90925090506000613da1846140c0565b90506000613daf8483614562565b9050613dbb8782614890565b9650613dc78684614890565b9550505050505b600101613cf0565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e3257600080fd5b505afa158015613e46573d6000803e3d6000fd5b505050506040513d6020811015613e5c57600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b83811015613ee5578181015183820152602001613ecd565b50505050905090810190601f168015613f125780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613f6c57600080fd5b815160208301805160405192949293830192919084600160201b821115613f9257600080fd5b908301906020820185811115613fa757600080fd5b8251600160201b811182820188101715613fc057600080fd5b82525081516020918201929091019080838360005b83811015613fed578181015183820152602001613fd5565b50505050905090810190601f16801561401a5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020808401925081101561403957600080fd5b5051949350505050565b3360009081526002602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166140bd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561411c57600080fd5b505afa158015614130573d6000803e3d6000fd5b505050506040513d602081101561414657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d1289493839260449091019190808383600083811015613ee5578181015183820152602001613ecd565b60035460408051632836093360e21b81529051339261010090046001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561421757600080fd5b505afa15801561422b573d6000803e3d6000fd5b505050506040513d602081101561424157600080fd5b50516001600160a01b038281169116148061426957506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906142d05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050565b6000806000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561433257600080fd5b505afa158015614346573d6000803e3d6000fd5b505050506040513d602081101561435c57600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b838110156143f55781810151838201526020016143dd565b50505050905090810190601f1680156144225780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561443f57600080fd5b505afa158015614453573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561447c57600080fd5b815160208301805160405192949293830192919084600160201b8211156144a257600080fd5b9083019060208201858111156144b757600080fd5b8251600160201b8111828201881017156144d057600080fd5b82525081516020918201929091019080838360005b838110156144fd5781810151838201526020016144e5565b50505050905090810190601f16801561452a5780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561454c57600080fd5b5080516020909101519097909650945050505050565b6000612bd46145718484614949565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b81525061499c565b6000612bd46145b084670de0b6b3a7640000614949565b83604051806040016040528060018152602001601960fa1b81525061499c565b60008060006145de84613c9a565b90506000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561463b57600080fd5b505afa15801561464f573d6000803e3d6000fd5b505050506040513d602081101561466557600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b838110156146ff5781810151838201526020016146e7565b50505050905090810190601f16801561472c5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561474957600080fd5b505afa15801561475d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561478657600080fd5b815160208301805160405192949293830192919084600160201b8211156147ac57600080fd5b9083019060208201858111156147c157600080fd5b8251600160201b8111828201881017156147da57600080fd5b82525081516020918201929091019080838360005b838110156148075781810151838201526020016147ef565b50505050905090810190601f1680156148345780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561485657600080fd5b508051602090910151909350915060006148708487614562565b9050600061487e8488614562565b919b919a509098505050505050505050565b600082820183811015612bd4576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b6000612bd48383604051806040016040528060018152602001607360f81b8152506149fe565b600080600061490285613ce7565b9092509050816149175760009250505061137f565b8082111561493e5761493561492b85613c9a565b6123b984846148ce565b9250505061137f565b60009250505061137f565b6000826149585750600061137f565b8282028284828161496557fe5b0414612bd4576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b600081836149eb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b508284816149f557fe5b04949350505050565b60008184841115614a505760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b505050900390565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082015260e08101829052610100810182905261012081018290526101408101919091529056fea26469706673582212209c27d725402a01cdac29142126c54e32700ba307fb85f2df74cabc8b0ee048c664736f6c634300060c003300000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a0000000000000000000000006ba1ddd63a5680b7c666b74a50be28b24d507beb000000000000000000000000cd9632707ec422759be2a5b348f8178ff280a45300000000000000000000000054b932b5512d984ac6c02ebe4f32ad032c41b1b5000000000000000000000000e2f26b242107f4c6ee48039555d7211d018ace37000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80637b66a7da116101dc578063c6adddab11610102578063dad2829f116100a0578063e8be60741161006f578063e8be607414610e89578063f18490c714610ece578063f502ca7414610f00578063fe4d27cd14610f155761038c565b8063dad2829f14610d12578063dd8bc8d414610d86578063de96f58e14610dbf578063e521809e14610e565761038c565b8063ce19512c116100dc578063ce19512c14610bc1578063d007242e14610beb578063d3a417a214610ca6578063dac9f9db14610cd95761038c565b8063c6adddab14610b6d578063ca2ec6ea14610b97578063caa6fea414610bac5761038c565b80638da5cb5b1161017a578063a205c6fd11610149578063a205c6fd14610ad7578063a7e55d2214610b0a578063b55c9b0114610b1f578063c188214f14610b345761038c565b80638da5cb5b14610a6857806390cdd94d14610a7d57806397f2b41914610aad5780639e1c53d814610ac25761038c565b80638369b1df116101b65780638369b1df146109f657806387fa699714610a0b578063893d20e814610a205780638b91bd7314610a355761038c565b80637b66a7da146109495780637d170e261461097c5780638178d60a146109af5761038c565b806341418632116102c1578063611dacd31161025f578063740f1e181161022e578063740f1e181461089557806375ff47bf146108aa5780637905b435146108dd57806379c9ecac146109165761038c565b8063611dacd3146107c3578063618a56c2146107ed578063644fc9351461082057806369f3629a1461086b5761038c565b80634dbeb3871161029b5780634dbeb387146106d75780634f81866b14610708578063558a72971461071d57806357daa7b0146107585761038c565b806341418632146106575780634250644914610681578063461fe3a6146106ad5761038c565b806323cda5761161032e57806338f92fc71161030857806338f92fc71461058f5780633b884de6146105c25780633be8b4a5146105fd5780634107f10a1461062d5761038c565b806323cda576146104ef5780632ab0b0eb14610519578063314d59fc146105435761038c565b8063144236501161036a578063144236501461044a57806315ddcdaf1461047d5780631defc035146104a757806320e5f7a6146104da5761038c565b806311ad747b1461038e57806311f151eb146103ca57806313a8be9d14610411575b005b34801561039a57600080fd5b506103b8600480360360208110156103b157600080fd5b5035610f4b565b60408051918252519081900360200190f35b3480156103d657600080fd5b506103fd600480360360208110156103ed57600080fd5b50356001600160a01b0316610f5d565b604080519115158252519081900360200190f35b34801561041d57600080fd5b506103fd6004803603604081101561043457600080fd5b506001600160a01b0381351690602001356110fe565b34801561045657600080fd5b506103fd6004803603602081101561046d57600080fd5b50356001600160a01b0316611385565b34801561048957600080fd5b506103b8600480360360208110156104a057600080fd5b5035611470565b3480156104b357600080fd5b506103fd600480360360208110156104ca57600080fd5b50356001600160a01b03166114f3565b3480156104e657600080fd5b506103b861161b565b3480156104fb57600080fd5b506103fd6004803603602081101561051257600080fd5b5035611621565b34801561052557600080fd5b506103b86004803603602081101561053c57600080fd5b5035611672565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b031661167d565b6040805192835260208301919091528051918290030190f35b34801561059b57600080fd5b506103fd600480360360208110156105b257600080fd5b50356001600160a01b0316611692565b3480156105ce57600080fd5b506103fd600480360360408110156105e557600080fd5b506001600160a01b038135169060200135151561177d565b34801561060957600080fd5b506103fd6004803603604081101561062057600080fd5b50803590602001356118ea565b34801561063957600080fd5b506103fd6004803603602081101561065057600080fd5b50356119d5565b34801561066357600080fd5b506103b86004803603602081101561067a57600080fd5b5035611a52565b34801561068d57600080fd5b506103fd600480360360208110156106a457600080fd5b50351515611a5d565b3480156106b957600080fd5b506103b8600480360360208110156106d057600080fd5b5035611adb565b3480156106e357600080fd5b506106ec611ae6565b604080516001600160a01b039092168252519081900360200190f35b34801561071457600080fd5b506106ec611af5565b34801561072957600080fd5b506103fd6004803603604081101561074057600080fd5b506001600160a01b0381351690602001351515611b04565b34801561076457600080fd5b506107a5600480360360a081101561077b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611bf7565b60408051938452602084019290925282820152519081900360600190f35b3480156107cf57600080fd5b506103fd600480360360208110156107e657600080fd5b5035611ead565b3480156107f957600080fd5b506103fd6004803603602081101561081057600080fd5b50356001600160a01b031661202e565b34801561082c57600080fd5b506103b8600480360360a081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612119565b34801561087757600080fd5b506107a56004803603602081101561088e57600080fd5b5035612192565b3480156108a157600080fd5b506106ec6121b3565b3480156108b657600080fd5b506103fd600480360360208110156108cd57600080fd5b50356001600160a01b03166121c2565b3480156108e957600080fd5b506103b86004803603604081101561090057600080fd5b506001600160a01b0381351690602001356122ad565b34801561092257600080fd5b506103fd6004803603602081101561093957600080fd5b50356001600160a01b03166123d7565b34801561095557600080fd5b506103fd6004803603602081101561096c57600080fd5b50356001600160a01b03166124c2565b34801561098857600080fd5b506105766004803603602081101561099f57600080fd5b50356001600160a01b031661255a565b3480156109bb57600080fd5b506103b8600480360360808110156109d257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612671565b348015610a0257600080fd5b506103b861290c565b348015610a1757600080fd5b506106ec612912565b348015610a2c57600080fd5b506106ec612921565b348015610a4157600080fd5b506103b860048036036020811015610a5857600080fd5b50356001600160a01b0316612930565b348015610a7457600080fd5b506106ec6129ad565b348015610a8957600080fd5b506103fd60048036036040811015610aa057600080fd5b50803590602001356129bc565b348015610ab957600080fd5b506106ec612aa7565b348015610ace57600080fd5b506106ec612ab6565b348015610ae357600080fd5b506103fd60048036036020811015610afa57600080fd5b50356001600160a01b0316612ac5565b348015610b1657600080fd5b506103fd612bb0565b348015610b2b57600080fd5b506106ec612bb9565b348015610b4057600080fd5b506103b860048036036040811015610b5757600080fd5b506001600160a01b038135169060200135612bc8565b348015610b7957600080fd5b506103fd60048036036020811015610b9057600080fd5b5035612bdb565b348015610ba357600080fd5b506107a5612cbf565b348015610bb857600080fd5b506103fd612e27565b348015610bcd57600080fd5b506103b860048036036020811015610be457600080fd5b5035612e30565b348015610bf757600080fd5b50610c1560048036036020811015610c0e57600080fd5b5035612ea9565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c69578181015183820152602001610c51565b50505050905090810190601f168015610c965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610cb257600080fd5b506103fd60048036036020811015610cc957600080fd5b50356001600160a01b0316613265565b348015610ce557600080fd5b506103b860048036036040811015610cfc57600080fd5b50803590602001356001600160a01b0316613350565b348015610d1e57600080fd5b50610d5360048036036060811015610d3557600080fd5b506001600160a01b0381351690602081013590604001351515613467565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610d9257600080fd5b5061057660048036036040811015610da957600080fd5b506001600160a01b0381351690602001356135c3565b348015610dcb57600080fd5b506103fd60048036036080811015610de257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b811115610e1857600080fd5b820183602082011115610e2a57600080fd5b803590602001918460018302840111600160201b83111715610e4b57600080fd5b5090925090506135db565b348015610e6257600080fd5b506103fd60048036036020811015610e7957600080fd5b50356001600160a01b0316613751565b348015610e9557600080fd5b506103fd60048036036080811015610eac57600080fd5b508035906001600160a01b03602082013516906040810135906060013561383c565b348015610eda57600080fd5b506103fd60048036036040811015610ef157600080fd5b508035906020013515156139b5565b348015610f0c57600080fd5b506103fd613aa4565b348015610f2157600080fd5b506103b860048036036060811015610f3857600080fd5b5080359060208101359060400135613b7f565b6000908152600d602052604090205490565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461100d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fd2578181015183820152602001610fba565b50505050905090810190601f168015610fff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166311f151eb60e01b1781526007549351835193949092169284929182918083835b602083106110865780518252601f199092019160209182019101611067565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b505080925050816110f857fe5b50919050565b6000611108614a58565b60035460408051636803921760e11b81526004810186905281516101009093046001600160a01b03169263d007242e92602480840193919291829003018186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d604081101561117f57600080fd5b5080516020918201516001600160a01b031691830191909152158015825261137957602080820151604080516001600160a01b038881166024808401919091528351808403820181526044938401855280870180516001600160e01b031663c8474ce560e01b17815294516321daf55f60e11b81526004810197885281519281019290925280519596928716956343b5eabe959194849301919080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156112c057600080fd5b815160208301805160405192949293830192919084600160201b8211156112e657600080fd5b9083019060208201858111156112fb57600080fd5b8251600160201b81118282018810171561131457600080fd5b82525081516020918201929091019080838360005b83811015611341578181015183820152602001611329565b50505050905090810190601f16801561136e5780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146113f85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316630144236560e41b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600354604080516315ddcdaf60e01b815260048101849052905160009261010090046001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b1580156114c157600080fd5b505afa1580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b505192915050565b3360008181526001602052604081205490919060ff168061152157506000546001600160a01b038281169116145b61152a57600080fd5b604080516001600160a01b0380861660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631defc03560e01b1781526008549351835193949092169284929182918083835b602083106115a25780518252601f199092019160209182019101611583565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b5050809350508261161457fe5b5050919050565b600c5481565b600354604080516311e6d2bb60e11b815260048101849052905160009261010090046001600160a01b0316916323cda576916024808301926020929190829003018186803b1580156114c157600080fd5b600061137f82613c9a565b60008061168983613ce7565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117055760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166338f92fc760e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117f05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b0316631dc426f360e11b1781526007549351835193949092169284929182918083835b602083106118715780518252601f199092019160209182019101611852565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146118d1576040519150601f19603f3d011682016040523d82523d6000602084013e6118d6565b606091505b505080925050816118e357fe5b5092915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461195d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b0316633be8b4a560e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611a485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050600c55600190565b600061137f82613dd6565b6000611a67614043565b6040805183151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316634250644960e01b1781526007549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600061137f826140c0565b600a546001600160a01b031681565b6007546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611b775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b031663558a729760e01b178152600754935183519394909216928492918291808383602083106118715780518252601f199092019160209182019101611852565b6000806000611c046141ce565b60035460408051631b677ffb60e11b815260048101889052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611d35578181015183820152602001611d1d565b50505050905090810190601f168015611d625780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611dbe57600080fd5b815160208301805160405192949293830192919084600160201b821115611de457600080fd5b908301906020820185811115611df957600080fd5b8251600160201b811182820188101715611e1257600080fd5b82525081516020918201929091019080838360005b83811015611e3f578181015183820152602001611e27565b50505050905090810190601f168015611e6c5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020830191506060811015611e8c57600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611f205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663611dacd360e01b1781526009549251825192936000936060936001600160a01b0390921692869290918291908083835b60208310611f9d5780518252601f199092019160209182019101611f7e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611ffd576040519150601f19603f3d011682016040523d82523d6000602084013e612002565b606091505b50915091508161200e57fe5b80806020019051602081101561202357600080fd5b505195945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146120a15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166330c52b6160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60008061212586613c9a565b9050600061213285613c9a565b9050600061214089876142d4565b5090506000612159866121538486614562565b90614562565b9050806121668986614562565b1115612181576121768185614599565b945050505050612189565b879450505050505b95945050505050565b600d6020526000908152604090208054600182015460029092015490919083565b600b546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146122355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166375ff47bf60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b6000806000806000805b600c5481101561238e57600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d602081101561234457600080fd5b5051156123865761235588826145d0565b90935091506123648583614890565b945061238361237c612375836140c0565b8590614562565b8590614890565b93505b6001016122b7565b50838311156123ca576123bf6123a387613c9a565b6123b96123af896140c0565b6123b987896148ce565b90614599565b94505050505061137f565b5060009695505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461244a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631e727b2b60e21b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146125355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50600680546001600160a01b0319166001600160a01b03939093169290921790915590565b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125c657600080fd5b505afa1580156125da573d6000803e3d6000fd5b505050506040513d60208110156125f057600080fd5b50511561265e5760008061260488846145d0565b90925090506000612614846140c0565b9050600061262185613dd6565b9050600061262f8584614562565b9050600061263d8684614562565b90506126498983614890565b98506126558882614890565b97505050505050505b600101612563565b509092509050915091565b600061267b6141ce565b60035460408051631b677ffb60e11b815260048101859052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b838110156127a8578181015183820152602001612790565b50505050905090810190601f1680156127d55780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561283157600080fd5b815160208301805160405192949293830192919084600160201b82111561285757600080fd5b90830190602082018581111561286c57600080fd5b8251600160201b81118282018810171561288557600080fd5b82525081516020918201929091019080838360005b838110156128b257818101518382015260200161289a565b50505050905090810190601f1680156128df5780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156128fe57600080fd5b505198975050505050505050565b600c5490565b6009546001600160a01b031681565b6000546001600160a01b031690565b604080516001600160a01b0380841660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638b91bd7360e01b17815260085493518351600095869460609491169286929091829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b6000546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612a2f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b03166390cdd94d60e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b6005546001600160a01b031690565b6008546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612b385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663a205c6fd60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60035460ff1690565b6006546001600160a01b031681565b6000612bd483836148f4565b9392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612c4e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663c6adddab60e01b1781526008549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600080600080600360019054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1657600080fd5b505afa158015612d2a573d6000803e3d6000fd5b505050506040513d6020811015612d4057600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b158015612d8257600080fd5b505afa158015612d96573d6000803e3d6000fd5b505050506040513d6020811015612dac57600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b158015612dee57600080fd5b505afa158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b50519195509350915050909192565b60035460ff1681565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316633386544b60e21b1781526009549251825160009485936060936001600160a01b0390921692869291829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b60008060606000806060600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f0c57600080fd5b505afa158015612f20573d6000803e3d6000fd5b505050506040513d6020811015612f3657600080fd5b50511561325857600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b8381101561304d578181015183820152602001613035565b50505050905090810190601f16801561307a5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156130d457600080fd5b815160208301805160405192949293830192919084600160201b8211156130fa57600080fd5b90830190602082018581111561310f57600080fd5b8251600160201b81118282018810171561312857600080fd5b82525081516020918201929091019080838360005b8381101561315557818101518382015260200161313d565b50505050905090810190601f1680156131825780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156131a157600080fd5b8101908080516040519392919084600160201b8211156131c057600080fd5b9083019060208201858111156131d557600080fd5b8251600160201b8111828201881017156131ee57600080fd5b82525081516020918201929091019080838360005b8381101561321b578181015183820152602001613203565b50505050905090810190601f1680156132485780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146132d85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166369d20bd160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60408051602481018490526001600160a01b0380841660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663dac9f9db60e01b1781526008549351835160009586946060949116928692909182918083835b602083106133d55780518252601f1990920191602091820191016133b6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613435576040519150601f19603f3d011682016040523d82523d6000602084013e61343a565b606091505b50915091508161344657fe5b80806020019051602081101561345b57600080fd5b50519695505050505050565b604080516001600160a01b0380861660248301526044820185905283151560648084019190915283518084039091018152608490920183526020820180516001600160e01b031663dad2829f60e01b17815260085493518351600095869586958695869586959394869460609491909116928692918291908083835b602083106135025780518252601f1990920191602091820191016134e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613562576040519150601f19603f3d011682016040523d82523d6000602084013e613567565b606091505b50915091508161357357fe5b8080602001905160c081101561358857600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b5099509750909550935050505093975093979195509350565b6000806135d084846145d0565b915091509250929050565b6000606063de96f58e60e01b878787878760405160240180868152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600083820181905260408051601f909301601f1990811690950183810390950183529384526020820180516001600160e01b03166001600160e01b0319909d169c909c178c5260095493518251929d50909b60609b506001600160a01b0390941699508c9850965086955091935090915081905083835b602083106136bc5780518252601f19909201916020918201910161369d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461371c576040519150601f19603f3d011682016040523d82523d6000602084013e613721565b606091505b50915091508161372d57fe5b80806020019051602081101561374257600080fd5b50519998505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146137c45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316637290c04f60e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146138af5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602481018790526001600160a01b0380871660448301526064820186905260848083018690528351808403909101815260a490920183526020820180516001600160e01b0316633a2f981d60e21b1781526007549351835193949092169284929182918083835b6020831061393a5780518252601f19909201916020918201910161391b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b505080925050816139ac57fe5b50949350505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314613a285760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516024810185905283151560448083019190915282518083039091018152606490910182526020810180516001600160e01b031663f18490c760e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b60408051600481526024810182526020810180516001600160e01b0316633d40b29d60e21b178152600854925182516000946001600160a01b0316928492918291908083835b60208310613b095780518252601f199092019160209182019101613aea565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613b69576040519150601f19603f3d011682016040523d82523d6000602084013e613b6e565b606091505b50508092505081613b7b57fe5b5090565b604080516024810185905260448101849052606480820184905282518083039091018152608490910182526020810180516001600160e01b031663fe4d27cd60e01b1781526009549251825160009485936060936001600160a01b039092169286929182918083835b60208310613c075780518252601f199092019160209182019101613be8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613c67576040519150601f19603f3d011682016040523d82523d6000602084013e613c6c565b606091505b509150915081613c7857fe5b808060200190516020811015613c8d57600080fd5b5051979650505050505050565b600480546040805163c457fb3760e01b8152928301849052516000926001600160a01b039092169163c457fb37916024808301926020929190829003018186803b1580156114c157600080fd5b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d5357600080fd5b505afa158015613d67573d6000803e3d6000fd5b505050506040513d6020811015613d7d57600080fd5b505115613dce57600080613d9188846145d0565b90925090506000613da1846140c0565b90506000613daf8483614562565b9050613dbb8782614890565b9650613dc78684614890565b9550505050505b600101613cf0565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e3257600080fd5b505afa158015613e46573d6000803e3d6000fd5b505050506040513d6020811015613e5c57600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b83811015613ee5578181015183820152602001613ecd565b50505050905090810190601f168015613f125780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613f6c57600080fd5b815160208301805160405192949293830192919084600160201b821115613f9257600080fd5b908301906020820185811115613fa757600080fd5b8251600160201b811182820188101715613fc057600080fd5b82525081516020918201929091019080838360005b83811015613fed578181015183820152602001613fd5565b50505050905090810190601f16801561401a5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020808401925081101561403957600080fd5b5051949350505050565b3360009081526002602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166140bd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561411c57600080fd5b505afa158015614130573d6000803e3d6000fd5b505050506040513d602081101561414657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d1289493839260449091019190808383600083811015613ee5578181015183820152602001613ecd565b60035460408051632836093360e21b81529051339261010090046001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561421757600080fd5b505afa15801561422b573d6000803e3d6000fd5b505050506040513d602081101561424157600080fd5b50516001600160a01b038281169116148061426957506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906142d05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050565b6000806000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561433257600080fd5b505afa158015614346573d6000803e3d6000fd5b505050506040513d602081101561435c57600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b838110156143f55781810151838201526020016143dd565b50505050905090810190601f1680156144225780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561443f57600080fd5b505afa158015614453573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561447c57600080fd5b815160208301805160405192949293830192919084600160201b8211156144a257600080fd5b9083019060208201858111156144b757600080fd5b8251600160201b8111828201881017156144d057600080fd5b82525081516020918201929091019080838360005b838110156144fd5781810151838201526020016144e5565b50505050905090810190601f16801561452a5780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561454c57600080fd5b5080516020909101519097909650945050505050565b6000612bd46145718484614949565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b81525061499c565b6000612bd46145b084670de0b6b3a7640000614949565b83604051806040016040528060018152602001601960fa1b81525061499c565b60008060006145de84613c9a565b90506000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561463b57600080fd5b505afa15801561464f573d6000803e3d6000fd5b505050506040513d602081101561466557600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b838110156146ff5781810151838201526020016146e7565b50505050905090810190601f16801561472c5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561474957600080fd5b505afa15801561475d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561478657600080fd5b815160208301805160405192949293830192919084600160201b8211156147ac57600080fd5b9083019060208201858111156147c157600080fd5b8251600160201b8111828201881017156147da57600080fd5b82525081516020918201929091019080838360005b838110156148075781810151838201526020016147ef565b50505050905090810190601f1680156148345780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561485657600080fd5b508051602090910151909350915060006148708487614562565b9050600061487e8488614562565b919b919a509098505050505050505050565b600082820183811015612bd4576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b6000612bd48383604051806040016040528060018152602001607360f81b8152506149fe565b600080600061490285613ce7565b9092509050816149175760009250505061137f565b8082111561493e5761493561492b85613c9a565b6123b984846148ce565b9250505061137f565b60009250505061137f565b6000826149585750600061137f565b8282028284828161496557fe5b0414612bd4576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b600081836149eb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b508284816149f557fe5b04949350505050565b60008184841115614a505760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b505050900390565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082015260e08101829052610100810182905261012081018290526101408101919091529056fea26469706673582212209c27d725402a01cdac29142126c54e32700ba307fb85f2df74cabc8b0ee048c664736f6c634300060c0033

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

00000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a0000000000000000000000006ba1ddd63a5680b7c666b74a50be28b24d507beb000000000000000000000000cd9632707ec422759be2a5b348f8178ff280a45300000000000000000000000054b932b5512d984ac6c02ebe4f32ad032c41b1b5000000000000000000000000e2f26b242107f4c6ee48039555d7211d018ace37000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81

-----Decoded View---------------
Arg [0] : managerDataStorageAddr (address): 0x34E45203669aADd0d6ac342538AA7b62C9128f4a
Arg [1] : oracleProxyAddr (address): 0x6bA1DDd63A5680B7C666b74a50be28B24D507BeB
Arg [2] : _slotSetterAddr (address): 0xCD9632707EC422759bE2A5b348f8178ff280A453
Arg [3] : _handlerManagerAddr (address): 0x54B932B5512D984AC6c02ebe4f32aD032C41b1b5
Arg [4] : _flashloanAddr (address): 0xE2F26b242107F4C6eE48039555d7211D018AcE37
Arg [5] : breaker (address): 0xd297c9A45AC9851003448C52c2B2b72c11688465
Arg [6] : erc20Addr (address): 0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a
Arg [1] : 0000000000000000000000006ba1ddd63a5680b7c666b74a50be28b24d507beb
Arg [2] : 000000000000000000000000cd9632707ec422759be2a5b348f8178ff280a453
Arg [3] : 00000000000000000000000054b932b5512d984ac6c02ebe4f32ad032c41b1b5
Arg [4] : 000000000000000000000000e2f26b242107f4c6ee48039555d7211d018ace37
Arg [5] : 000000000000000000000000d297c9a45ac9851003448c52c2b2b72c11688465
Arg [6] : 0000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81


Deployed Bytecode Sourcemap

19951:31760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50423:132;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50423:132:0;;:::i;:::-;;;;;;;;;;;;;;;;23748:310;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23748:310:0;-1:-1:-1;;;;;23748:310:0;;:::i;:::-;;;;;;;;;;;;;;;;;;28318:507;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28318:507:0;;;;;;;;:::i;21865:309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21865:309:0;-1:-1:-1;;;;;21865:309:0;;:::i;35139:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35139:137:0;;:::i;30288:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30288:318:0;-1:-1:-1;;;;;30288:318:0;;:::i;17333:33::-;;;;;;;;;;;;;:::i;34295:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34295:152:0;;:::i;32333:132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32333:132:0;;:::i;36444:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36444:163:0;-1:-1:-1;;;;;36444:163:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27800:337;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27800:337:0;-1:-1:-1;;;;;27800:337:0;;:::i;22920:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22920:318:0;;;;;;;;;;:::i;25678:335::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25678:335:0;;;;;;;:::i;34611:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34611:163:0;;:::i;32612:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32612:152:0;;:::i;23441:302::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23441:302:0;;;;:::i;33444:144::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33444:144:0;;:::i;17266:34::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17266:34:0;;;;;;;;;;;;;;17148:29;;;;;;;;;;;;;:::i;21362:314::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21362:314:0;;;;;;;;;;:::i;39827:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39827:701:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44371:388;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44371:388:0;;:::i;24394:306::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24394:306:0;-1:-1:-1;;;;;24394:306:0;;:::i;41051:764::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41051:764:0;;;;;;;;;;;;;;;;;;;;;;;:::i;17621:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17621:60:0;;:::i;17305:22::-;;;;;;;;;;;;;:::i;22369:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22369:295:0;-1:-1:-1;;;;;22369:295:0;;:::i;38323:1064::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38323:1064:0;;;;;;;;:::i;25040:282::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25040:282:0;-1:-1:-1;;;;;25040:282:0;;:::i;51462:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51462:127:0;-1:-1:-1;;;;;51462:127:0;;:::i;36907:1127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36907:1127:0;-1:-1:-1;;;;;36907:1127:0;;:::i;42170:605::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42170:605:0;;;;;;;;;;;;;;;;;;;;:::i;34877:103::-;;;;;;;;;;;;;:::i;17218:28::-;;;;;;;;;;;;;:::i;47519:74::-;;;;;;;;;;;;;:::i;30741:373::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30741:373:0;-1:-1:-1;;;;;30741:373:0;;:::i;16790:20::-;;;;;;;;;;;;;:::i;25327:346::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25327:346:0;;;;;;;:::i;50931:103::-;;;;;;;;;;;;;:::i;17181:33::-;;;;;;;;;;;;;:::i;24705:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24705:330:0;-1:-1:-1;;;;;24705:330:0;;:::i;26102:86::-;;;;;;;;;;;;;:::i;17117:25::-;;;;;;;;;;;;;:::i;35489:182::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35489:182:0;;;;;;;;:::i;31884:308::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31884:308:0;;:::i;51174:283::-;;;;;;;;;;;;;:::i;16907:29::-;;;;;;;;;;;;;:::i;43825:351::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43825:351:0;;:::i;26339:659::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26339:659:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;26339:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21052:305;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21052:305:0;-1:-1:-1;;;;;21052:305:0;;:::i;31305:407::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31305:407:0;;;;;;-1:-1:-1;;;;;31305:407:0;;:::i;29124:523::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29124:523:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35952:209;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35952:209:0;;;;;;;;:::i;43133:487::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43133:487:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43133:487:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43133:487:0;;;;;;;;;;-1:-1:-1;43133:487:0;;-1:-1:-1;43133:487:0;-1:-1:-1;43133:487:0;:::i;24063:326::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24063:326:0;-1:-1:-1;;;;;24063:326:0;;:::i;27195:416::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27195:416:0;;;-1:-1:-1;;;;;27195:416:0;;;;;;;;;;;;;;;:::i;47095:322::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47095:322:0;;;;;;;;;:::i;29828:266::-;;;;;;;;;;;;;:::i;45089:465::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45089:465:0;;;;;;;;;;;;:::i;50423:132::-;50488:7;50510:27;;;:16;:27;;;;;:40;;50423:132::o;23748:310::-;23828:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23871:105:0::1;::::0;;-1:-1:-1;;;;;23871:105:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23871:105:0::1;-1:-1:-1::0;;;23871:105:0::1;::::0;;23997:14:::1;::::0;:37;;;;23871:105;;23997:14;;::::1;::::0;23871:105;;23997:37;;;;;23871:105;23997:37:::1;;;;;;::::0;;;;-1:-1:-1;;23997:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23984:50;;;;;24046:6;24039:14;;;;18585:1;23748:310:::0;;;:::o;28318:507::-;28412:4;28425:31;;:::i;:::-;28503:19;;:49;;;-1:-1:-1;;;28503:49:0;;;;;;;;;;:19;;;;-1:-1:-1;;;;;28503:19:0;;:39;;:49;;;;;;;;;;;;;:19;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28503:49:0;;;;;;;-1:-1:-1;;;;;28461:91:0;28483:16;;;28461:91;;;;;;;;;28557:246;;28638:16;;;;;28688:103;;;-1:-1:-1;;;;;28688:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28688:103:0;-1:-1:-1;;;28688:103:0;;;28661:136;;-1:-1:-1;;;28661:136:0;;;;;;;;;;;;;;;;;;;28638:16;;28661:20;;;;;;28688:103;;28661:136;;;;28688:103;28661:136;;28688:103;28591:19;28661:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28661:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28661:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28661:136:0;;;;;;-1:-1:-1;28661:136:0;;;;;;;;;;-1:-1:-1;28661:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28557:246;;28816:4;28809:11;;;28318:507;;;;;:::o;21865:309::-;21942:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21986:105:0::1;::::0;;-1:-1:-1;;;;;21986:105:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21986:105:0::1;-1:-1:-1::0;;;21986:105:0::1;::::0;;22111:14:::1;::::0;:37;;;;21986:105;;22111:14;;::::1;::::0;21986:105;;22111:37;;;;;21986:105;22111:37:::1;;;;;::::0;;;;-1:-1:-1;;22111:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;35139:137:::0;35227:19;;:44;;;-1:-1:-1;;;35227:44:0;;;;;;;;;;-1:-1:-1;;35227:19:0;;;-1:-1:-1;;;;;35227:19:0;;:37;;:44;;;;;;;;;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35227:44:0;;35139:137;-1:-1:-1;;35139:137:0:o;30288:318::-;18731:10;30374:11;18754:17;;;:9;:17;;;;;;30374:11;;18731:10;18754:17;;;:36;;-1:-1:-1;18785:5:0;;-1:-1:-1;;;;;18775:15:0;;;18785:5;;18775:15;18754:36;18746:45;;;;;;30416:103:::1;::::0;;-1:-1:-1;;;;;30416:103:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;30416:103:0::1;-1:-1:-1::0;;;30416:103:0::1;::::0;;30539:18:::1;::::0;:41;;;;30416:103;;30539:18;;::::1;::::0;30416:103;;30539:41;;;;;30416:103;30539:41:::1;;;;;;::::0;;;;-1:-1:-1;;30539:41:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30526:54;;;;;30594:6;30587:14;;;;18796:1;30288:318:::0;;;;:::o;17333:33::-;;;;:::o;34295:152::-;34389:19;;:53;;;-1:-1:-1;;;34389:53:0;;;;;;;;;;-1:-1:-1;;34389:19:0;;;-1:-1:-1;;;;;34389:19:0;;:42;;:53;;;;;;;;;;;;;;:19;:53;;;;;;;;;;32333:132;32405:7;32428:32;32450:9;32428:21;:32::i;36444:163::-;36531:7;36540;36563:39;36593:8;36563:29;:39::i;:::-;36556:46;;;;36444:163;;;:::o;27800:337::-;27891:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27935:119:0::1;::::0;;-1:-1:-1;;;;;27935:119:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;27935:119:0::1;-1:-1:-1::0;;;27935:119:0::1;::::0;;28074:14:::1;::::0;:37;;;;27935:119;;28074:14;;::::1;::::0;27935:119;;28074:37;;;;;27935:119;28074:37:::1;;;;;::::0;;;;-1:-1:-1;;28074:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;22920:318:::0;23004:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23048:107:0::1;::::0;;-1:-1:-1;;;;;23048:107:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23048:107:0::1;-1:-1:-1::0;;;23048:107:0::1;::::0;;23175:14:::1;::::0;:37;;;;23048:107;;23175:14;;::::1;::::0;23048:107;;23175:37;;;;;23048:107;23175:37:::1;;;;;;::::0;;;;-1:-1:-1;;23175:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23162:50;;;;;23226:6;23219:14;;;;18585:1;22920:318:::0;;;;:::o;25678:335::-;25767:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25810:121:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25810:121:0::1;-1:-1:-1::0;;;25810:121:0::1;::::0;;25952:14:::1;::::0;:37;;;;25810:121;;-1:-1:-1;;;;;25952:14:0::1;::::0;25810:121;;25952:37;;;;25810:121;25952:37:::1;;;;;::::0;;;;-1:-1:-1;;25952:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;34611:163:::0;34700:4;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34713:18:0::1;:40:::0;34765:4:::1;::::0;34611:163::o;32612:152::-;32694:7;32717:42;32749:9;32717:31;:42::i;23441:302::-;23515:11;19523:12;:10;:12::i;:::-;23557:103:::1;::::0;;;::::1;;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23557:103:0::1;-1:-1:-1::0;;;23557:103:0::1;::::0;;23680:14:::1;::::0;:37;;;;23557:103;;-1:-1:-1;;;;;23680:14:0::1;::::0;23557:103;;23680:37;;;;23557:103;23680:37:::1;;;;;::::0;;;;-1:-1:-1;;23680:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;33444:144:::0;33522:7;33545:38;33573:9;33545:27;:38::i;17266:34::-;;;-1:-1:-1;;;;;17266:34:0;;:::o;17148:29::-;;;-1:-1:-1;;;;;17148:29:0;;:::o;21362:314::-;21449:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21491:102:0::1;::::0;;-1:-1:-1;;;;;21491:102:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21491:102:0::1;-1:-1:-1::0;;;21491:102:0::1;::::0;;21613:14:::1;::::0;:37;;;;21491:102;;21613:14;;::::1;::::0;21491:102;;21613:37;;;;;21491:102;21613:37:::1;;;;;::::0;;;;-1:-1:-1;;21613:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;39827:701:::0;40042:7;40051;40060;19059:23;:21;:23::i;:::-;40103:19:::1;::::0;:59:::1;::::0;;-1:-1:-1;;;40103:59:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;40103:19:0::1;::::0;::::1;-1:-1:-1::0;;;;;40103:19:0::1;::::0;:39:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;:19;:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40103:59:0;40249:168:::1;::::0;;-1:-1:-1;;;;;40249:168:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;40103:59:::1;40249:168:::0;;::::1;::::0;;-1:-1:-1;;;;;40249:168:0::1;-1:-1:-1::0;;;40249:168:0::1;::::0;;40433:31;;-1:-1:-1;;;;;;40433:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;40103:59;;-1:-1:-1;40103:59:0;;40249:168;;40433:25;;::::1;::::0;::::1;::::0;40249:168;;40433:31;;;;;;;;40249:168;40167:19:::1;40433:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40433:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;40433:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;40433:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;40433:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;40433:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40433:31:0::1;::::0;-1:-1:-1;;40478:45:0;;40422:42;;-1:-1:-1;;40478:45:0::1;::::0;::::1;::::0;-1:-1:-1;40478:45:0::1;::::0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;40478:45:0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;40478:45:0;-1:-1:-1;39827:701:0;-1:-1:-1;;;;;;;;;39827:701:0:o;44371:388::-;44462:4;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44500:104:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;44500:104:0::1;-1:-1:-1::0;;;44500:104:0::1;::::0;;44652:13:::1;::::0;:36;;;;44500:104;;-1:-1:-1;;44476:21:0::1;::::0;-1:-1:-1;;;;;44652:13:0;;::::1;::::0;44500:104;;44652:36;;;;44500:104;44652:36;;44500:104;44652:36:::1;;;;;;::::0;;;;-1:-1:-1;;44652:36:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44611:77;;;;44700:6;44693:14;;;;44732:10;44721:30;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44721:30:0;;44371:388;-1:-1:-1;;;;;44371:388:0:o;24394:306::-;24472:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24515:103:0::1;::::0;;-1:-1:-1;;;;;24515:103:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24515:103:0::1;-1:-1:-1::0;;;24515:103:0::1;::::0;;24639:14:::1;::::0;:37;;;;24515:103;;24639:14;;::::1;::::0;24515:103;;24639:37;;;;;24515:103;24639:37:::1;;;;;::::0;;;;-1:-1:-1;;24639:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;41051:764:::0;41242:7;41258:22;41283:41;41305:18;41283:21;:41::i;:::-;41258:66;;41329:19;41351:38;41373:15;41351:21;:38::i;:::-;41329:60;;41394:39;41476:54;41494:18;41514:15;41476:17;:54::i;:::-;-1:-1:-1;41438:92:0;-1:-1:-1;41535:19:0;41557:79;41624:11;41557:55;41438:92;41600:11;41557:42;:55::i;:::-;:66;;:79::i;:::-;41535:101;-1:-1:-1;41535:101:0;41645:42;:15;41672:14;41645:26;:42::i;:::-;:56;41641:168;;;41719:38;:11;41742:14;41719:22;:38::i;:::-;41712:45;;;;;;;;41641:168;41788:15;41781:22;;;;;;41051:764;;;;;;;;:::o;17621:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17305:22::-;;;-1:-1:-1;;;;;17305:22:0;;:::o;22369:295::-;22438:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22482:99:0::1;::::0;;-1:-1:-1;;;;;22482:99:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;22482:99:0::1;-1:-1:-1::0;;;22482:99:0::1;::::0;;22601:14:::1;::::0;:37;;;;22482:99;;22601:14;;::::1;::::0;22482:99;;22601:37;;;;;22482:99;22601:37:::1;;;;;::::0;;;;-1:-1:-1;;22601:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;38323:1064:::0;38429:7;38445:28;38478:34;38517:27;38549:26;38585:17;38580:536;38616:18;;38604:9;:30;38580:536;;;38662:19;;;;;;;;;-1:-1:-1;;;;;38662:19:0;-1:-1:-1;;;;;38662:42:0;;38705:9;38662:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38662:53:0;38658:453;;;38774:58;38812:8;38822:9;38774:37;:58::i;:::-;38730:102;;-1:-1:-1;38730:102:0;-1:-1:-1;38862:44:0;:20;38730:102;38862:24;:44::i;:::-;38839:67;;38942:162;39002:87;39049:38;39077:9;39049:27;:38::i;:::-;39002:19;;:45;:87::i;:::-;38942:26;;:44;:162::i;:::-;38913:191;;38658:453;38636:11;;38580:536;;;;39155:20;39126:26;:49;39122:248;;;39193:171;39331:31;39353:8;39331:21;:31::i;:::-;39193:118;39272:37;39300:8;39272:27;:37::i;:::-;39193:59;:26;39231:20;39193:37;:59::i;:::-;:77;;:118::i;:171::-;39186:178;;;;;;;;39122:248;-1:-1:-1;39381:1:0;;38323:1064;-1:-1:-1;;;;;;38323:1064:0:o;25040:282::-;25106:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25149:91:0::1;::::0;;-1:-1:-1;;;;;25149:91:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25149:91:0::1;-1:-1:-1::0;;;25149:91:0::1;::::0;;25261:14:::1;::::0;:37;;;;25149:91;;25261:14;;::::1;::::0;25149:91;;25261:37;;;;;25149:91;25261:37:::1;;;;;::::0;;;;-1:-1:-1;;25261:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51462:127:::0;51537:4;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51548:8:0::1;:36:::0;;-1:-1:-1;;;;;;51548:36:0::1;-1:-1:-1::0;;;;;51548:36:0;;;::::1;::::0;;;::::1;::::0;;;;51462:127::o;36907:1127::-;36988:7;36997;37013:33;37051:37;37100:17;37095:863;37131:18;;37119:9;:30;37095:863;;;37177:19;;;;;;;;;-1:-1:-1;;;;;37177:19:0;-1:-1:-1;;;;;37177:42:0;;37220:9;37177:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37177:53:0;37173:778;;;37243:27;37277:26;37354:58;37392:8;37402:9;37354:37;:58::i;:::-;37310:102;;-1:-1:-1;37310:102:0;-1:-1:-1;37419:19:0;37441:38;37469:9;37441:27;:38::i;:::-;37419:60;;37486:23;37512:42;37544:9;37512:31;:42::i;:::-;37486:68;-1:-1:-1;37561:28:0;37592:43;:19;37623:11;37592:30;:43::i;:::-;37561:74;-1:-1:-1;37642:32:0;37677:47;:19;37708:15;37677:30;:47::i;:::-;37642:82;-1:-1:-1;37759:51:0;:25;37789:20;37759:29;:51::i;:::-;37731:79;-1:-1:-1;37849:59:0;:29;37883:24;37849:33;:59::i;:::-;37817:91;;37173:778;;;;;;;37151:11;;37095:863;;;-1:-1:-1;37972:25:0;;-1:-1:-1;37999:29:0;-1:-1:-1;36907:1127:0;;;:::o;42170:605::-;42354:7;19059:23;:21;:23::i;:::-;42397:19:::1;::::0;:50:::1;::::0;;-1:-1:-1;;;42397:50:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;42397:19:0::1;::::0;::::1;-1:-1:-1::0;;;;;42397:19:0::1;::::0;:39:::1;::::0;:50;;;;;::::1;::::0;;;;;;;;:19;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42397:50:0;42532:150:::1;::::0;;-1:-1:-1;;;;;42532:150:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;42397:50:::1;42532:150:::0;;::::1;::::0;;-1:-1:-1;;;;;42532:150:0::1;-1:-1:-1::0;;;42532:150:0::1;::::0;;42698:31;;-1:-1:-1;;;;;;42698:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;42397:50;;-1:-1:-1;42397:50:0;;42532:150;;42698:25;;::::1;::::0;::::1;::::0;42532:150;;42698:31;;;;;;;;42532:150;42452:19:::1;42698:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;42698:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;42698:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;42698:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;42698:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;42698:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;42698:31:0::1;::::0;-1:-1:-1;;42743:27:0;;42687:42;;-1:-1:-1;;42743:27:0::1;::::0;;::::1;::::0;-1:-1:-1;42743:27:0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;42743:27:0;;42170:605;-1:-1:-1;;;;;;;;42170:605:0:o;34877:103::-;34957:18;;34877:103;:::o;17218:28::-;;;-1:-1:-1;;;;;17218:28:0;;:::o;47519:74::-;47560:7;47583:5;-1:-1:-1;;;;;47583:5:0;47519:74;:::o;30741:373::-;30851:99;;;-1:-1:-1;;;;;30851:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30851:99:0;-1:-1:-1;;;30851:99:0;;;30998:18;;:41;;;;30809:7;;;;30827:21;;30998:18;;;30851:99;;30998:41;;;;;;30851:99;30998:41;;;;;;;;;-1:-1:-1;;30998:41:0;;;;;;;;;;;;16790:20;;;-1:-1:-1;;;;;16790:20:0;;:::o;25327:346::-;25421:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25464:127:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25464:127:0::1;-1:-1:-1::0;;;25464:127:0::1;::::0;;25612:14:::1;::::0;:37;;;;25464:127;;-1:-1:-1;;;;;25612:14:0::1;::::0;25464:127;;25612:37;;;;25464:127;25612:37:::1;;;;;::::0;;;;-1:-1:-1;;25612:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;50931:103:::0;51009:19;;-1:-1:-1;;;;;51009:19:0;50931:103;:::o;17181:33::-;;;-1:-1:-1;;;;;17181:33:0;;:::o;24705:330::-;24795:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24838:115:0::1;::::0;;-1:-1:-1;;;;;24838:115:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24838:115:0::1;-1:-1:-1::0;;;24838:115:0::1;::::0;;24974:14:::1;::::0;:37;;;;24838:115;;24974:14;;::::1;::::0;24838:115;;24974:37;;;;;24838:115;24974:37:::1;;;;;::::0;;;;-1:-1:-1;;24974:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;26102:86:::0;26174:9;;;;26102:86;:::o;17117:25::-;;;-1:-1:-1;;;;;17117:25:0;;:::o;35489:182::-;35594:7;35617:49;35646:8;35656:9;35617:28;:49::i;:::-;35610:56;35489:182;-1:-1:-1;;;35489:182:0:o;31884:308::-;31958:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32002:103:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;32002:103:0::1;-1:-1:-1::0;;;32002:103:0::1;::::0;;32125:18:::1;::::0;:41;;;;32002:103;;-1:-1:-1;;;;;32125:18:0::1;::::0;32002:103;;32125:41;;;;32002:103;32125:41:::1;;;;;::::0;;;;-1:-1:-1;;32125:41:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51174:283:::0;51228:7;51237;51246;51262:32;51297:19;;;;;;;;;-1:-1:-1;;;;;51297:19:0;51262:54;;51329:12;-1:-1:-1;;;;;51329:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51329:38:0;51369:39;;;-1:-1:-1;;;51369:39:0;;;;-1:-1:-1;;;;;51369:37:0;;;;;:39;;;;;51329:38;;51369:39;;;;;;;:37;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51369:39:0;51410:41;;;-1:-1:-1;;;51410:41:0;;;;-1:-1:-1;;;;;51410:39:0;;;;;:41;;;;;51369:39;;51410:41;;;;;;;:39;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51410:41:0;51321:131;;-1:-1:-1;51321:131:0;-1:-1:-1;51410:41:0;-1:-1:-1;;51174:283:0;;;:::o;16907:29::-;;;;;;:::o;43825:351::-;43923:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43923:95:0;-1:-1:-1;;;43923:95:0;;;44066:13;;:36;;;;43883:7;;;;43899:21;;-1:-1:-1;;;;;44066:13:0;;;;43923:95;;44066:36;;;;;43923:95;44066:36;;;;;;;;;-1:-1:-1;;44066:36:0;;;;;;;;;;;;26339:659;26410:4;26416:7;26425:13;26447:12;26464:24;26493:23;26525:19;;;;;;;;;-1:-1:-1;;;;;26525:19:0;-1:-1:-1;;;;;26525:42:0;;26568:9;26525:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26525:53:0;26521:421;;;26608:19;;;;;;;;;-1:-1:-1;;;;;26608:19:0;-1:-1:-1;;;;;26608:39:0;;26648:9;26608:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26608:50:0;26786:80;;;;;;;;;;;;;26608:50;26786:80;;;;;-1:-1:-1;;;;;26786:80:0;-1:-1:-1;;;26786:80:0;;;26750:122;;-1:-1:-1;;;26750:122:0;;;;;;;;;;;;;;;;;;;26608:50;;-1:-1:-1;26608:50:0;;26716:17;;-1:-1:-1;;;;;26750:29:0;;;;;26786:80;;26750:122;;;;;;;;26786:80;26750:122;;26786:80;26664:19;26750:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26750:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26750:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26750:122:0;;;;;;-1:-1:-1;26750:122:0;;;;;;;;;;-1:-1:-1;26750:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26750:122:0;;-1:-1:-1;;26890:26:0;;26739:133;;-1:-1:-1;;26890:26:0;;;;;-1:-1:-1;26890:26:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26890:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26890:26:0;;;;;;-1:-1:-1;26890:26:0;;;;;;;;;;-1:-1:-1;26890:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26878:38;;26932:4;26922:14;;26521:421;;;26956:7;;26965:16;;-1:-1:-1;26956:7:0;;-1:-1:-1;26339:659:0;-1:-1:-1;;26339:659:0:o;21052:305::-;21129:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21173:99:0::1;::::0;;-1:-1:-1;;;;;21173:99:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21173:99:0::1;-1:-1:-1::0;;;21173:99:0::1;::::0;;21294:14:::1;::::0;:37;;;;21173:99;;21294:14;;::::1;::::0;21173:99;;21294:37;;;;;21173:99;21294:37:::1;;;;;::::0;;;;-1:-1:-1;;21294:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;31305:407:::0;31434:114;;;;;;;;;-1:-1:-1;;;;;31434:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31434:114:0;-1:-1:-1;;;31434:114:0;;;31596:18;;:41;;;;31396:7;;;;31410:21;;31596:18;;;31434:114;;31596:41;;;;;;31434:114;31596:41;;;;;;;;;;-1:-1:-1;;31596:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31555:82;;;;31651:6;31644:14;;;;31685:10;31674:33;;;;;;;;;;;;;;;-1:-1:-1;31674:33:0;;31305:407;-1:-1:-1;;;;;;31305:407:0:o;29124:523::-;29316:121;;;-1:-1:-1;;;;;29316:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29316:121:0;-1:-1:-1;;;29316:121:0;;;29485:18;;:41;;;;29231:7;;;;;;;;;;;;29316:121;;29231:7;;29292:21;;29485:18;;;;;29316:121;;29485:41;;;29316:121;29485:41;;29316:121;29485:41;;;;;;;;;;-1:-1:-1;;29485:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29444:82;;;;29540:6;29533:14;;;;29574:10;29563:78;;;;;;;;;;;;;;;-1:-1:-1;29563:78:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29563:78:0;;-1:-1:-1;29563:78:0;-1:-1:-1;29563:78:0;-1:-1:-1;29563:78:0;;-1:-1:-1;29563:78:0;-1:-1:-1;;;;29124:523:0;;;;;;;;;;:::o;35952:209::-;36066:7;36075;36098:58;36136:8;36146:9;36098:37;:58::i;:::-;36091:65;;;;35952:209;;;;;:::o;43133:487::-;43288:4;43303:21;43356:42;;;43405:9;43416:15;43433:6;43441;;43327:126;;;;;;;;;;;-1:-1:-1;;;;;43327:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43327:126:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43327:126:0;-1:-1:-1;;;;;;43327:126:0;;;;;;;;;43505:13;;:36;;;;43327:126;;-1:-1:-1;43327:126:0;;43478:23;;-1:-1:-1;;;;;;43505:13:0;;;;-1:-1:-1;43327:126:0;;-1:-1:-1;43505:36:0;-1:-1:-1;43505:36:0;;-1:-1:-1;43327:126:0;;-1:-1:-1;43505:36:0;;-1:-1:-1;43505:36:0;;-1:-1:-1;43505:36:0;43327:126;43505:36;;;;;;;;;;-1:-1:-1;;43505:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43464:77;;;;43557:6;43550:14;;;;43593:10;43582:30;;;;;;;;;;;;;;;-1:-1:-1;43582:30:0;;43133:487;-1:-1:-1;;;;;;;;;43133:487:0:o;24063:326::-;24151:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24194:113:0::1;::::0;;-1:-1:-1;;;;;24194:113:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24194:113:0::1;-1:-1:-1::0;;;24194:113:0::1;::::0;;24328:14:::1;::::0;:37;;;;24194:113;;24328:14;;::::1;::::0;24194:113;;24328:37;;;;;24194:113;24328:37:::1;;;;;::::0;;;;-1:-1:-1;;24328:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;27195:416:::0;27337:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27379:150:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;27379:150:0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;27379:150:0::1;-1:-1:-1::0;;;27379:150:0::1;::::0;;27550:14:::1;::::0;:37;;;;27379:150;;27550:14;;::::1;::::0;27379:150;;27550:37;;;;;27379:150;27550:37:::1;;;;;;::::0;;;;-1:-1:-1;;27550:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27537:50;;;;;27599:6;27592:14;;;;18585:1;27195:416:::0;;;;;;:::o;47095:322::-;47181:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47223:111:0::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;47223:111:0::1;-1:-1:-1::0;;;47223:111:0::1;::::0;;47354:14:::1;::::0;:37;;;;47223:111;;-1:-1:-1;;;;;47354:14:0::1;::::0;47223:111;;47354:37;;;;47223:111;47354:37:::1;;;;;::::0;;;;-1:-1:-1;;47354:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;29828:266:::0;29920:86;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29920:86:0;-1:-1:-1;;;29920:86:0;;;30026:18;;:41;;;;29878:11;;-1:-1:-1;;;;;30026:18:0;;29920:86;;30026:41;;;29920:86;30026:41;;29920:86;30026:41;;;;;;;;;;-1:-1:-1;;30026:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30013:54;;;;;30082:6;30075:14;;;;29828:266;;:::o;45089:465::-;45261:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45261:123:0;-1:-1:-1;;;45261:123:0;;;45436:13;;:36;;;;45219:7;;;;45237:21;;-1:-1:-1;;;;;45436:13:0;;;;45261:123;;45436:36;;;;;45261:123;45436:36;;;;;;;;;;-1:-1:-1;;45436:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45395:77;;;;45488:6;45481:14;;;;45524:10;45513:33;;;;;;;;;;;;;;;-1:-1:-1;45513:33:0;;45089:465;-1:-1:-1;;;;;;;45089:465:0:o;50695:139::-;50792:11;;;:36;;;-1:-1:-1;;;50792:36:0;;;;;;;;;50768:7;;-1:-1:-1;;;;;50792:11:0;;;;:25;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;48849:886;48937:7;48946;48962:26;48993:25;49028:17;49023:655;49059:18;;49047:9;:30;49023:655;;;49105:19;;;;;;;;;-1:-1:-1;;;;;49105:19:0;-1:-1:-1;;;;;49105:42:0;;49148:9;49105:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49105:53:0;49101:570;;;49171:27;49205:26;49282:58;49320:8;49330:9;49282:37;:58::i;:::-;49238:102;;-1:-1:-1;49238:102:0;-1:-1:-1;49347:19:0;49369:38;49397:9;49369:27;:38::i;:::-;49347:60;-1:-1:-1;49414:28:0;49445:43;:19;49347:60;49445:30;:43::i;:::-;49414:74;-1:-1:-1;49516:44:0;:18;49414:74;49516:22;:44::i;:::-;49495:65;-1:-1:-1;49587:41:0;:17;49609:18;49587:21;:41::i;:::-;49567:61;;49101:570;;;;;49079:11;;49023:655;;32911:396;32994:7;33010:19;33039;;;;;;;;;-1:-1:-1;;;;;33039:19:0;-1:-1:-1;;;;;33039:39:0;;33079:9;33039:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33039:50:0;33163:95;;;;;;;;;;;;;33039:50;33163:95;;;;;-1:-1:-1;;;;;33163:95:0;-1:-1:-1;;;33163:95:0;;;33128:135;;-1:-1:-1;;;33128:135:0;;;;;;;;;;;;;;;;;;;33039:50;;-1:-1:-1;33095:17:0;;-1:-1:-1;;;;;33128:29:0;;;;;33163:95;33128:135;;;;;;;33163:95;33128:135;;33163:95;;33128:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33128:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33128:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33128:135:0;;;;;;-1:-1:-1;33128:135:0;;;;;;;;;;-1:-1:-1;33128:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33128:135:0;;-1:-1:-1;;33275:27:0;;33117:146;;-1:-1:-1;;33275:27:0;;;;;-1:-1:-1;33275:27:0;;;;;;;;;-1:-1:-1;33275:27:0;;32911:396;-1:-1:-1;;;;32911:396:0:o;19551:98::-;19613:10;19600:24;;;;:12;:24;;;;;;;;;:29;19631:12;;;;;;;;19600:29;19631:12;;-1:-1:-1;;;19631:12:0;;;;;;;19600:29;;19592:52;;;;-1:-1:-1;;;19592:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19551:98::o;33725:390::-;33804:7;33820:19;33849;;;;;;;;;-1:-1:-1;;;;;33849:19:0;-1:-1:-1;;;;;33849:39:0;;33889:9;33849:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33849:50:0;33975:91;;;;;;;;;;;;;33849:50;33975:91;;;;;-1:-1:-1;;;;;33975:91:0;-1:-1:-1;;;33975:91:0;;;33940:131;;-1:-1:-1;;;33940:131:0;;;;;;;;;;;;;;;;;;;33849:50;;-1:-1:-1;33907:17:0;;-1:-1:-1;;;;;33940:29:0;;;;;33975:91;33940:131;;;;;;;33975:91;33940:131;;33975:91;;33940:131;;;;;;;;;;;;;;;;;;19098:213;19207:19;;:47;;;-1:-1:-1;;;19207:47:0;;;;19170:10;;19207:19;;;-1:-1:-1;;;;;19207:19:0;;:45;;:47;;;;;;;;;;;;;;:19;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19207:47:0;-1:-1:-1;;;;;19194:60:0;;;;;;;19193:86;;-1:-1:-1;19273:5:0;;-1:-1:-1;;;;;19260:18:0;;;19273:5;;19260:18;19193:86;19281:24;;;;;;;;;;;;;-1:-1:-1;;;19281:24:0;;;19185:121;;;;;-1:-1:-1;;;19185:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19098:213;:::o;45770:424::-;45865:7;45874;45890:19;45919;;;;;;;;;-1:-1:-1;;;;;45919:19:0;-1:-1:-1;;;;;45919:39:0;;45959:9;45919:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45919:50:0;46043:93;;;-1:-1:-1;;;;;46043:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;45919:50;46043:93;;;;;-1:-1:-1;;;;;46043:93:0;-1:-1:-1;;;46043:93:0;;;46008:133;;-1:-1:-1;;;46008:133:0;;;;;;;;;;;;;;;;;;;45919:50;;-1:-1:-1;45975:17:0;;46008:29;;;;;;46043:93;;46008:133;;;;;;;;46043:93;-1:-1:-1;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46008:133:0;;;;;;-1:-1:-1;46008:133:0;;;;;;;;;;-1:-1:-1;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45997:144;;;;;;46164:4;46153:36;;;;;;;;;;;;;;;-1:-1:-1;46153:36:0;;;;;;;;;;;-1:-1:-1;45770:424:0;-1:-1:-1;;;;;45770:424:0:o;5159:128::-;5224:7;5247:35;5252:10;5257:1;5260;5252:4;:10::i;:::-;4004:8;5247:35;;;;;;;;;;;;;-1:-1:-1;;;5247:35:0;;;:4;:35::i;5026:128::-;5091:7;5114:35;5119:21;5124:1;4004:8;5119:4;:21::i;:::-;5142:1;5114:35;;;;;;;;;;;;;-1:-1:-1;;;5114:35:0;;;:4;:35::i;47828:738::-;47943:7;47952;47968:13;47984:32;48006:9;47984:21;:32::i;:::-;47968:48;;48021:19;48050;;;;;;;;;-1:-1:-1;;;;;48050:19:0;-1:-1:-1;;;;;48050:39:0;;48090:9;48050:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48050:50:0;48227:99;;;-1:-1:-1;;;;;48227:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;48050:50;48227:99;;;;;-1:-1:-1;;;;;48227:99:0;-1:-1:-1;;;48227:99:0;;;48192:139;;-1:-1:-1;;;48192:139:0;;;;;;;;;;;;;;;;;;;48050:50;;-1:-1:-1;48106:21:0;;;;48159:17;;48192:29;;;;;;:139;;;;;48227:99;48192:139;;48227:99;48106:21;48192:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48192:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48192:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48192:139:0;;;;;;-1:-1:-1;48192:139:0;;;;;;;;;;-1:-1:-1;48192:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48181:150;;;;;;48379:4;48368:36;;;;;;;;;;;;;;;-1:-1:-1;48368:36:0;;;;;;;;;-1:-1:-1;48368:36:0;-1:-1:-1;48411:20:0;48434:31;48368:36;48459:5;48434:24;:31::i;:::-;48411:54;-1:-1:-1;48470:19:0;48492:30;:12;48516:5;48492:23;:30::i;:::-;48535:12;;;;-1:-1:-1;47828:738:0;;-1:-1:-1;;;;;;;;;47828:738:0:o;4071:134::-;4129:7;4157:5;;;4175:6;;;;4167:20;;;;;-1:-1:-1;;;4167:20:0;;;;;;;;;;;;-1:-1:-1;;;4167:20:0;;;;;;;;;;;;;;4210:101;4268:7;4291:15;4296:1;4299;4291:15;;;;;;;;;;;;;-1:-1:-1;;;4291:15:0;;;:4;:15::i;49950:468::-;50056:7;50070:21;50096:20;50153:39;50183:8;50153:29;:39::i;:::-;50121:71;;-1:-1:-1;50121:71:0;-1:-1:-1;50201:18:0;50197:47;;50237:1;50230:8;;;;;;50197:47;50270:12;50254:13;:28;50250:164;;;50300:76;50343:32;50365:9;50343:21;:32::i;:::-;50300:31;:13;50318:12;50300:17;:31::i;:76::-;50293:83;;;;;;50250:164;50407:1;50400:8;;;;;;4682:181;4741:7;4761:6;4757:35;;-1:-1:-1;4785:1:0;4778:8;;4757:35;4810:4;;;4813:1;4810;:4;:1;4828:5;;;;;4827:12;4819:26;;;;;-1:-1:-1;;;4819:26:0;;;;;;;;;;;;-1:-1:-1;;;4819:26:0;;;;;;;;;;;;;;4868:153;4955:7;4986:12;4979:5;4971:28;;;;-1:-1:-1;;;4971:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5015:1;5011;:5;;;;;;;4868:153;-1:-1:-1;;;;4868:153:0:o;4523:154::-;4610:7;4642:12;4634:6;;;;4626:29;;;;-1:-1:-1;;;4626:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4667:5:0;;;4523:154::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://9c27d725402a01cdac29142126c54e32700ba307fb85f2df74cabc8b0ee048c6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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