Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LoanTokenLogicWeth
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-14 */ /** * Copyright 2017-2020, bZeroX, LLC <https://bzx.network/>. All Rights Reserved. * Licensed under the Apache License, Version 2.0. */ pragma solidity 0.5.17; pragma experimental ABIEncoderV2; interface IWeth { function deposit() external payable; function withdraw(uint256 wad) external; } contract IERC20 { string public name; uint8 public decimals; string public symbol; function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function allowance(address _owner, address _spender) public view returns (uint256); function approve(address _spender, uint256 _value) public returns (bool); function transfer(address _to, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract IWethERC20 is IWeth, IERC20 {} /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { return divCeil(a, b, "SafeMath: division by zero"); } /** * @dev Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); if (a == 0) { return 0; } uint256 c = ((a - 1) / b) + 1; return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min256(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a < _b ? _a : _b; } } /** * @title SignedSafeMath * @dev Signed math operations with safety checks that revert on error. */ library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } } /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs. /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056 uint256 internal constant REENTRANCY_GUARD_FREE = 1; /// @dev Constant for locked guard state uint256 internal constant REENTRANCY_GUARD_LOCKED = 2; /** * @dev We use a single lock for the whole contract. */ uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE; /** * @dev Prevents a contract from calling itself, directly or indirectly. * If you mark a function `nonReentrant`, you should also * mark it `external`. Calling one `nonReentrant` function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and an `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant"); reentrancyLock = REENTRANCY_GUARD_LOCKED; _; reentrancyLock = REENTRANCY_GUARD_FREE; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "unauthorized"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface ProtocolLike { function borrowOrTradeFromPool( bytes32 loanParamsId, bytes32 loanId, // if 0, start a new loan bool isTorqueLoan, uint256 initialMargin, address[4] calldata sentAddresses, // lender: must match loan if loanId provided // borrower: must match loan if loanId provided // receiver: receiver of funds (address(0) assumes borrower address) // manager: delegated manager of loan unless address(0) uint256[5] calldata sentValues, // newRate: new loan interest rate // newPrincipal: new loan size (borrowAmount + any borrowed interest) // torqueInterest: new amount of interest to escrow for Torque loan (determines initial loan length) // loanTokenReceived: total loanToken deposit (amount not sent to borrower in the case of Torque loans) // collateralTokenReceived: total collateralToken deposit bytes calldata loanDataBytes) external payable returns (uint256 newPrincipal, uint256 newCollateral); function getTotalPrincipal( address lender, address loanToken) external view returns (uint256); function withdrawAccruedInterest( address loanToken) external; function getLenderInterestData( address lender, address loanToken) external view returns ( uint256 interestPaid, uint256 interestPaidDate, uint256 interestOwedPerDay, uint256 interestUnPaid, uint256 interestFeePercent, uint256 principalTotal); function priceFeeds() external view returns (address); function getEstimatedMarginExposure( address loanToken, address collateralToken, uint256 loanTokenSent, uint256 collateralTokenSent, uint256 interestRate, uint256 newPrincipal) external view returns (uint256); function getRequiredCollateralByParams( bytes32 loanParamsId, address loanToken, address collateralToken, uint256 newPrincipal, bool isTorqueLoan) external view returns (uint256 collateralAmountRequired); function getBorrowAmountByParams( bytes32 loanParamsId, address loanToken, address collateralToken, uint256 collateralTokenAmount, bool isTorqueLoan) external view returns (uint256 borrowAmount); function isLoanPool( address loanPool) external view returns (bool); function lendingFeePercent() external view returns (uint256); } interface FeedsLike { function queryRate( address sourceTokenAddress, address destTokenAddress) external view returns (uint256 rate, uint256 precision); } contract ITokenHolderLike { function balanceOf(address _who) public view returns (uint256); function freeUpTo(uint256 value) public returns (uint256); function freeFromUpTo(address from, uint256 value) public returns (uint256); } contract GasTokenUser { ITokenHolderLike constant public gasToken = ITokenHolderLike(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c); ITokenHolderLike constant public tokenHolder = ITokenHolderLike(0x55Eb3DD3f738cfdda986B8Eff3fa784477552C61); modifier usesGasToken(address holder) { if (holder == address(0)) { holder = address(tokenHolder); } if (gasToken.balanceOf(holder) != 0) { uint256 gasCalcValue = gasleft(); _; gasCalcValue = (_gasUsed(gasCalcValue) + 14154) / 41947; if (holder == address(tokenHolder)) { tokenHolder.freeUpTo( gasCalcValue ); } else { tokenHolder.freeFromUpTo( holder, gasCalcValue ); } } else { _; } } function _gasUsed( uint256 startingGas) internal view returns (uint256) { return 21000 + startingGas - gasleft() + 16 * msg.data.length; } } contract Pausable { // keccak256("Pausable_FunctionPause") bytes32 internal constant Pausable_FunctionPause = 0xa7143c84d793a15503da6f19bf9119a2dac94448ca45d77c8bf08f57b2e91047; modifier pausable(bytes4 sig) { require(!_isPaused(sig), "unauthorized"); _; } function _isPaused( bytes4 sig) internal view returns (bool isPaused) { bytes32 slot = keccak256(abi.encodePacked(sig, Pausable_FunctionPause)); assembly { isPaused := sload(slot) } } } contract LoanTokenBase is ReentrancyGuard, Ownable, Pausable { uint256 internal constant WEI_PRECISION = 10**18; uint256 internal constant WEI_PERCENT_PRECISION = 10**20; int256 internal constant sWEI_PRECISION = 10**18; string public name; string public symbol; uint8 public decimals; // uint88 for tight packing -> 8 + 88 + 160 = 256 uint88 internal lastSettleTime_; address public loanTokenAddress; uint256 public baseRate; uint256 public rateMultiplier; uint256 public lowUtilBaseRate; uint256 public lowUtilRateMultiplier; uint256 public targetLevel; uint256 public kinkLevel; uint256 public maxScaleRate; uint256 internal _flTotalAssetSupply; uint256 public checkpointSupply; uint256 public initialPrice; mapping (uint256 => bytes32) public loanParamsIds; // mapping of keccak256(collateralToken, isTorqueLoan) to loanParamsId mapping (address => uint256) internal checkpointPrices_; // price of token at last user checkpoint } contract AdvancedTokenStorage is LoanTokenBase { using SafeMath for uint256; event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); event Mint( address indexed minter, uint256 tokenAmount, uint256 assetAmount, uint256 price ); event Burn( address indexed burner, uint256 tokenAmount, uint256 assetAmount, uint256 price ); mapping(address => uint256) internal balances; mapping (address => mapping (address => uint256)) internal allowed; uint256 internal totalSupply_; function totalSupply() public view returns (uint256) { return totalSupply_; } function balanceOf( address _owner) public view returns (uint256) { return balances[_owner]; } function allowance( address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } } contract AdvancedToken is AdvancedTokenStorage { using SafeMath for uint256; function approve( address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function increaseApproval( address _spender, uint256 _addedValue) public returns (bool) { uint256 _allowed = allowed[msg.sender][_spender] .add(_addedValue); allowed[msg.sender][_spender] = _allowed; emit Approval(msg.sender, _spender, _allowed); return true; } function decreaseApproval( address _spender, uint256 _subtractedValue) public returns (bool) { uint256 _allowed = allowed[msg.sender][_spender]; if (_subtractedValue >= _allowed) { _allowed = 0; } else { _allowed -= _subtractedValue; } allowed[msg.sender][_spender] = _allowed; emit Approval(msg.sender, _spender, _allowed); return true; } function _mint( address _to, uint256 _tokenAmount, uint256 _assetAmount, uint256 _price) internal returns (uint256) { require(_to != address(0), "15"); uint256 _balance = balances[_to] .add(_tokenAmount); balances[_to] = _balance; totalSupply_ = totalSupply_ .add(_tokenAmount); emit Mint(_to, _tokenAmount, _assetAmount, _price); emit Transfer(address(0), _to, _tokenAmount); return _balance; } function _burn( address _who, uint256 _tokenAmount, uint256 _assetAmount, uint256 _price) internal returns (uint256) { uint256 _balance = balances[_who].sub(_tokenAmount, "16"); // a rounding error may leave dust behind, so we clear this out if (_balance <= 10) { _tokenAmount = _tokenAmount.add(_balance); _balance = 0; } balances[_who] = _balance; totalSupply_ = totalSupply_.sub(_tokenAmount); emit Burn(_who, _tokenAmount, _assetAmount, _price); emit Transfer(_who, address(0), _tokenAmount); return _balance; } } contract LoanTokenLogicStandard is AdvancedToken, GasTokenUser { using SafeMath for uint256; using SignedSafeMath for int256; modifier settlesInterest() { _settleInterest(); _; } address internal target_; uint256 public constant VERSION = 6; address internal constant arbitraryCaller = 0x000F400e6818158D541C3EBE45FE3AA0d47372FF; address public constant bZxContract = 0xD8Ee69652E4e4838f2531732a46d1f7F584F0b7f; address public constant wethToken = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; bytes32 internal constant iToken_ProfitSoFar = 0x37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb6; // keccak256("iToken_ProfitSoFar") bytes32 internal constant iToken_LowerAdminAddress = 0x7ad06df6a0af6bd602d90db766e0d5f253b45187c3717a0f9026ea8b10ff0d4b; // keccak256("iToken_LowerAdminAddress") bytes32 internal constant iToken_LowerAdminContract = 0x34b31cff1dbd8374124bd4505521fc29cab0f9554a5386ba7d784a4e611c7e31; // keccak256("iToken_LowerAdminContract") constructor( address _newOwner) public { transferOwnership(_newOwner); } function() external { revert("fallback not allowed"); } /* Public functions */ function mint( address receiver, uint256 depositAmount) external nonReentrant returns (uint256) // mintAmount { return _mintToken( receiver, depositAmount ); } function burn( address receiver, uint256 burnAmount) external nonReentrant returns (uint256 loanAmountPaid) { loanAmountPaid = _burnToken( burnAmount ); if (loanAmountPaid != 0) { _safeTransfer(loanTokenAddress, receiver, loanAmountPaid, "5"); } } function flashBorrow( uint256 borrowAmount, address borrower, address target, string calldata signature, bytes calldata data) external payable nonReentrant pausable(msg.sig) settlesInterest returns (bytes memory) { require(borrowAmount != 0, "38"); // save before balances uint256 beforeEtherBalance = address(this).balance.sub(msg.value); uint256 beforeAssetsBalance = _underlyingBalance() .add(totalAssetBorrow()); // lock totalAssetSupply for duration of flash loan _flTotalAssetSupply = beforeAssetsBalance; // transfer assets to calling contract _safeTransfer(loanTokenAddress, borrower, borrowAmount, "39"); bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // arbitrary call (bool success, bytes memory returnData) = arbitraryCaller.call.value(msg.value)( abi.encodeWithSelector( 0xde064e0d, // sendCall(address,bytes) target, callData ) ); require(success, "call failed"); // unlock totalAssetSupply _flTotalAssetSupply = 0; // verifies return of flash loan require( address(this).balance >= beforeEtherBalance && _underlyingBalance() .add(totalAssetBorrow()) >= beforeAssetsBalance, "40" ); return returnData; } // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function borrow( bytes32 loanId, // 0 if new loan uint256 withdrawAmount, uint256 initialLoanDuration, // duration in seconds uint256 collateralTokenSent, // if 0, loanId must be provided; any ETH sent must equal this value address collateralTokenAddress, // if address(0), this means ETH and ETH must be sent with the call or loanId must be provided address borrower, address receiver, bytes memory /*loanDataBytes*/) // arbitrary order data (for future use) public payable nonReentrant returns (uint256, uint256) // returns new principal and new collateral added to loan { return _borrow( loanId, withdrawAmount, initialLoanDuration, collateralTokenSent, collateralTokenAddress, borrower, receiver, "" ); } // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function borrowWithGasToken( bytes32 loanId, // 0 if new loan uint256 withdrawAmount, uint256 initialLoanDuration, // duration in seconds uint256 collateralTokenSent, // if 0, loanId must be provided; any ETH sent must equal this value address collateralTokenAddress, // if address(0), this means ETH and ETH must be sent with the call or loanId must be provided address borrower, address receiver, address gasTokenUser, // specifies an address that has given spend approval for gas/chi token bytes memory /*loanDataBytes*/) // arbitrary order data (for future use) public payable nonReentrant usesGasToken(gasTokenUser) returns (uint256, uint256) // returns new principal and new collateral added to loan { return _borrow( loanId, withdrawAmount, initialLoanDuration, collateralTokenSent, collateralTokenAddress, borrower, receiver, "" ); } // Called to borrow and immediately get into a position // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function marginTrade( bytes32 loanId, // 0 if new loan uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress, address trader, bytes memory loanDataBytes) // arbitrary order data public payable nonReentrant returns (uint256, uint256) // returns new principal and new collateral added to trade { return _marginTrade( loanId, leverageAmount, loanTokenSent, collateralTokenSent, collateralTokenAddress, trader, loanDataBytes ); } // Called to borrow and immediately get into a position // ***** NOTE: Reentrancy is allowed here to allow flashloan use cases ***** function marginTradeWithGasToken( bytes32 loanId, // 0 if new loan uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress, address trader, address gasTokenUser, // specifies an address that has given spend approval for gas/chi token bytes memory loanDataBytes) // arbitrary order data public payable nonReentrant usesGasToken(gasTokenUser) returns (uint256, uint256) // returns new principal and new collateral added to trade { return _marginTrade( loanId, leverageAmount, loanTokenSent, collateralTokenSent, collateralTokenAddress, trader, loanDataBytes ); } function transfer( address _to, uint256 _value) external returns (bool) { return _internalTransferFrom( msg.sender, _to, _value, uint256(-1) ); } function transferFrom( address _from, address _to, uint256 _value) external returns (bool) { return _internalTransferFrom( _from, _to, _value, allowed[_from][msg.sender] /*ProtocolLike(bZxContract).isLoanPool(msg.sender) ? uint256(-1) : allowed[_from][msg.sender]*/ ); } function _internalTransferFrom( address _from, address _to, uint256 _value, uint256 _allowanceAmount) internal returns (bool) { if (_allowanceAmount != uint256(-1)) { allowed[_from][msg.sender] = _allowanceAmount.sub(_value, "14"); } require(_to != address(0), "15"); uint256 _balancesFrom = balances[_from]; uint256 _balancesFromNew = _balancesFrom .sub(_value, "16"); balances[_from] = _balancesFromNew; uint256 _balancesTo = balances[_to]; uint256 _balancesToNew = _balancesTo .add(_value); balances[_to] = _balancesToNew; // handle checkpoint update uint256 _currentPrice = tokenPrice(); _updateCheckpoints( _from, _balancesFrom, _balancesFromNew, _currentPrice ); _updateCheckpoints( _to, _balancesTo, _balancesToNew, _currentPrice ); emit Transfer(_from, _to, _value); return true; } function _updateCheckpoints( address _user, uint256 _oldBalance, uint256 _newBalance, uint256 _currentPrice) internal { bytes32 slot = keccak256( abi.encodePacked(_user, iToken_ProfitSoFar) ); int256 _currentProfit; if (_newBalance == 0) { _currentPrice = 0; } else if (_oldBalance != 0) { _currentProfit = _profitOf( slot, _oldBalance, _currentPrice, checkpointPrices_[_user] ); } assembly { sstore(slot, _currentProfit) } checkpointPrices_[_user] = _currentPrice; } /* Public View functions */ function profitOf( address user) public view returns (int256) { bytes32 slot = keccak256( abi.encodePacked(user, iToken_ProfitSoFar) ); return _profitOf( slot, balances[user], tokenPrice(), checkpointPrices_[user] ); } function _profitOf( bytes32 slot, uint256 _balance, uint256 _currentPrice, uint256 _checkpointPrice) internal view returns (int256 profitSoFar) { if (_checkpointPrice == 0) { return 0; } assembly { profitSoFar := sload(slot) } profitSoFar = int256(_currentPrice) .sub(int256(_checkpointPrice)) .mul(int256(_balance)) .div(sWEI_PRECISION) .add(profitSoFar); } function tokenPrice() public view returns (uint256) // price { uint256 interestUnPaid; if (lastSettleTime_ != uint88(block.timestamp)) { (,interestUnPaid) = _getAllInterest(); } return _tokenPrice(_totalAssetSupply(interestUnPaid)); } function checkpointPrice( address _user) public view returns (uint256) // price { return checkpointPrices_[_user]; } function marketLiquidity() public view returns (uint256) { uint256 totalSupply = _totalAssetSupply(0); uint256 totalBorrow = totalAssetBorrow(); if (totalSupply > totalBorrow) { return totalSupply - totalBorrow; } } function avgBorrowInterestRate() public view returns (uint256) { return _avgBorrowInterestRate(totalAssetBorrow()); } // the minimum rate the next base protocol borrower will receive for variable-rate loans function borrowInterestRate() public view returns (uint256) { return _nextBorrowInterestRate(0); } function nextBorrowInterestRate( uint256 borrowAmount) public view returns (uint256) { return _nextBorrowInterestRate(borrowAmount); } // interest that lenders are currently receiving when supplying to the pool function supplyInterestRate() public view returns (uint256) { return totalSupplyInterestRate(_totalAssetSupply(0)); } function nextSupplyInterestRate( uint256 supplyAmount) public view returns (uint256) { return totalSupplyInterestRate(_totalAssetSupply(0).add(supplyAmount)); } function totalSupplyInterestRate( uint256 assetSupply) public view returns (uint256) { uint256 assetBorrow = totalAssetBorrow(); if (assetBorrow != 0) { return _supplyInterestRate( assetBorrow, assetSupply ); } } function totalAssetBorrow() public view returns (uint256) { return ProtocolLike(bZxContract).getTotalPrincipal( address(this), loanTokenAddress ); } function totalAssetSupply() public view returns (uint256) { uint256 interestUnPaid; if (lastSettleTime_ != uint88(block.timestamp)) { (,interestUnPaid) = _getAllInterest(); } return _totalAssetSupply(interestUnPaid); } function getMaxEscrowAmount( uint256 leverageAmount) public view returns (uint256) { uint256 initialMargin = SafeMath.div(WEI_PRECISION * WEI_PERCENT_PRECISION, leverageAmount); return marketLiquidity() .mul(initialMargin) .div(_adjustValue( WEI_PERCENT_PRECISION, // maximum possible interest (100%) 2419200, // 28 day duration for margin trades initialMargin)); } // returns the user's balance of underlying token function assetBalanceOf( address _owner) public view returns (uint256) { return balanceOf(_owner) .mul(tokenPrice()) .div(WEI_PRECISION); } function getEstimatedMarginDetails( uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress) // address(0) means ETH public view returns (uint256 principal, uint256 collateral, uint256 interestRate) { if (collateralTokenAddress == address(0)) { collateralTokenAddress = wethToken; } uint256 totalDeposit = _totalDeposit( collateralTokenAddress, collateralTokenSent, loanTokenSent ); (principal, interestRate) = _getMarginBorrowAmountAndRate( leverageAmount, totalDeposit ); if (principal > _underlyingBalance()) { return (0, 0, 0); } loanTokenSent = loanTokenSent .add(principal); collateral = ProtocolLike(bZxContract).getEstimatedMarginExposure( loanTokenAddress, collateralTokenAddress, loanTokenSent, collateralTokenSent, interestRate, principal ); } function getDepositAmountForBorrow( uint256 borrowAmount, uint256 initialLoanDuration, // duration in seconds address collateralTokenAddress) // address(0) means ETH public view returns (uint256) // depositAmount { if (borrowAmount != 0) { (,,uint256 newBorrowAmount) = _getInterestRateAndBorrowAmount( borrowAmount, totalAssetSupply(), initialLoanDuration ); if (newBorrowAmount <= _underlyingBalance()) { return ProtocolLike(bZxContract).getRequiredCollateralByParams( loanParamsIds[uint256(keccak256(abi.encodePacked( collateralTokenAddress, true )))], loanTokenAddress, collateralTokenAddress != address(0) ? collateralTokenAddress : wethToken, newBorrowAmount, true // isTorqueLoan ).add(10); // some dust to compensate for rounding errors } } } function getBorrowAmountForDeposit( uint256 depositAmount, uint256 initialLoanDuration, // duration in seconds address collateralTokenAddress) // address(0) means ETH public view returns (uint256 borrowAmount) { if (depositAmount != 0) { borrowAmount = ProtocolLike(bZxContract).getBorrowAmountByParams( loanParamsIds[uint256(keccak256(abi.encodePacked( collateralTokenAddress, true )))], loanTokenAddress, collateralTokenAddress != address(0) ? collateralTokenAddress : wethToken, depositAmount, true // isTorqueLoan ); (,,borrowAmount) = _getInterestRateAndBorrowAmount( borrowAmount, totalAssetSupply(), initialLoanDuration ); if (borrowAmount > _underlyingBalance()) { borrowAmount = 0; } } } /* Internal functions */ function _mintToken( address receiver, uint256 depositAmount) internal settlesInterest returns (uint256 mintAmount) { require (depositAmount != 0, "17"); uint256 currentPrice = _tokenPrice(_totalAssetSupply(0)); mintAmount = depositAmount .mul(WEI_PRECISION) .div(currentPrice); if (msg.value == 0) { _safeTransferFrom(loanTokenAddress, msg.sender, address(this), depositAmount, "18"); } else { require(msg.value == depositAmount, "18"); IWeth(wethToken).deposit.value(depositAmount)(); } _updateCheckpoints( receiver, balances[receiver], _mint(receiver, mintAmount, depositAmount, currentPrice), // newBalance currentPrice ); } function _burnToken( uint256 burnAmount) internal settlesInterest returns (uint256 loanAmountPaid) { require(burnAmount != 0, "19"); if (burnAmount > balanceOf(msg.sender)) { require(burnAmount == uint256(-1), "32"); burnAmount = balanceOf(msg.sender); } uint256 currentPrice = _tokenPrice(_totalAssetSupply(0)); uint256 loanAmountOwed = burnAmount .mul(currentPrice) .div(WEI_PRECISION); uint256 loanAmountAvailableInContract = _underlyingBalance(); loanAmountPaid = loanAmountOwed; require(loanAmountPaid <= loanAmountAvailableInContract, "37"); _updateCheckpoints( msg.sender, balances[msg.sender], _burn(msg.sender, burnAmount, loanAmountPaid, currentPrice), // newBalance currentPrice ); } function _borrow( bytes32 loanId, // 0 if new loan uint256 withdrawAmount, uint256 initialLoanDuration, // duration in seconds uint256 collateralTokenSent, // if 0, loanId must be provided; any ETH sent must equal this value address collateralTokenAddress, // if address(0), this means ETH and ETH must be sent with the call or loanId must be provided address borrower, address receiver, bytes memory /*loanDataBytes*/) // arbitrary order data (for future use) internal pausable(msg.sig) settlesInterest returns (uint256, uint256) // returns new principal and new collateral added to loan { require(withdrawAmount != 0, "6"); require(msg.value == 0 || msg.value == collateralTokenSent, "7"); require(collateralTokenSent != 0 || loanId != 0, "8"); require(collateralTokenAddress != address(0) || msg.value != 0 || loanId != 0, "9"); // ensures authorized use of existing loan require(loanId == 0 || msg.sender == borrower, "13"); if (collateralTokenAddress == address(0)) { collateralTokenAddress = wethToken; } require(collateralTokenAddress != loanTokenAddress, "10"); address[4] memory sentAddresses; uint256[5] memory sentAmounts; sentAddresses[0] = address(this); // lender sentAddresses[1] = borrower; sentAddresses[2] = receiver; //sentAddresses[3] = address(0); // manager //sentAmounts[0] = 0; // interestRate (found later) //sentAmounts[1] = 0; // borrowAmount (found later) //sentAmounts[2] = 0; // interestInitialAmount (found later) //sentAmounts[3] = 0; // loanTokenSent sentAmounts[4] = collateralTokenSent; // interestRate, interestInitialAmount, borrowAmount (newBorrowAmount) (sentAmounts[0], sentAmounts[2], sentAmounts[1]) = _getInterestRateAndBorrowAmount( withdrawAmount, _totalAssetSupply(0), // interest is settled above initialLoanDuration ); return _borrowOrTrade( loanId, withdrawAmount, 0, // leverageAmount (calculated later) collateralTokenAddress, sentAddresses, sentAmounts, "" // loanDataBytes ); } function _marginTrade( bytes32 loanId, // 0 if new loan uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, address collateralTokenAddress, address trader, bytes memory loanDataBytes) internal pausable(msg.sig) settlesInterest returns (uint256, uint256) // returns new principal and new collateral added to trade { // ensures authorized use of existing loan require(loanId == 0 || msg.sender == trader, "13"); if (collateralTokenAddress == address(0)) { collateralTokenAddress = wethToken; } require(collateralTokenAddress != loanTokenAddress, "11"); uint256 totalDeposit = _totalDeposit( collateralTokenAddress, collateralTokenSent, loanTokenSent ); require(totalDeposit != 0, "12"); address[4] memory sentAddresses; uint256[5] memory sentAmounts; sentAddresses[0] = address(this); // lender sentAddresses[1] = trader; sentAddresses[2] = trader; //sentAddresses[3] = address(0); // manager //sentAmounts[0] = 0; // interestRate (found later) //sentAmounts[1] = 0; // borrowAmount (found later) //sentAmounts[2] = 0; // interestInitialAmount (interest is calculated based on fixed-term loan) sentAmounts[3] = loanTokenSent; sentAmounts[4] = collateralTokenSent; (sentAmounts[1], sentAmounts[0]) = _getMarginBorrowAmountAndRate( // borrowAmount, interestRate leverageAmount, totalDeposit ); return _borrowOrTrade( loanId, 0, // withdrawAmount leverageAmount, collateralTokenAddress, sentAddresses, sentAmounts, loanDataBytes ); } function _settleInterest() internal { uint88 ts = uint88(block.timestamp); if (lastSettleTime_ != ts) { ProtocolLike(bZxContract).withdrawAccruedInterest( loanTokenAddress ); lastSettleTime_ = ts; } } function _totalDeposit( address collateralTokenAddress, uint256 collateralTokenSent, uint256 loanTokenSent) internal view returns (uint256 totalDeposit) { totalDeposit = loanTokenSent; if (collateralTokenSent != 0) { (uint256 sourceToDestRate, uint256 sourceToDestPrecision) = FeedsLike(ProtocolLike(bZxContract).priceFeeds()).queryRate( collateralTokenAddress, loanTokenAddress ); if (sourceToDestRate != 0) { totalDeposit = collateralTokenSent .mul(sourceToDestRate) .div(sourceToDestPrecision) .add(totalDeposit); } } } function _getInterestRateAndBorrowAmount( uint256 borrowAmount, uint256 assetSupply, uint256 initialLoanDuration) // duration in seconds internal view returns (uint256 interestRate, uint256 interestInitialAmount, uint256 newBorrowAmount) { interestRate = _nextBorrowInterestRate2( borrowAmount, assetSupply ); // newBorrowAmount = borrowAmount * 10^18 / (10^18 - (interestRate * initialLoanDuration * 10^18 / (31536000 * 10^20))) newBorrowAmount = borrowAmount .mul(WEI_PRECISION) .div( SafeMath.sub(WEI_PRECISION, interestRate .mul(initialLoanDuration) .mul(WEI_PRECISION) .div(31536000 * WEI_PERCENT_PRECISION) // 365 * 86400 * WEI_PERCENT_PRECISION ) ); interestInitialAmount = newBorrowAmount .sub(borrowAmount); } // returns newPrincipal function _borrowOrTrade( bytes32 loanId, uint256 withdrawAmount, uint256 leverageAmount, address collateralTokenAddress, address[4] memory sentAddresses, uint256[5] memory sentAmounts, bytes memory loanDataBytes) internal returns (uint256, uint256) { require (sentAmounts[1] <= _underlyingBalance() && // newPrincipal sentAddresses[1] != address(0), // borrower "24" ); if (sentAddresses[2] == address(0)) { sentAddresses[2] = sentAddresses[1]; // receiver = borrower } // handle transfers prior to adding newPrincipal to loanTokenSent uint256 msgValue = _verifyTransfers( collateralTokenAddress, sentAddresses, sentAmounts, withdrawAmount ); // adding the loan token portion from the lender to loanTokenSent sentAmounts[3] = sentAmounts[3] .add(sentAmounts[1]); // newPrincipal if (withdrawAmount != 0) { // withdrawAmount already sent to the borrower, so we aren't sending it to the protocol sentAmounts[3] = sentAmounts[3] .sub(withdrawAmount); } bool isTorqueLoan = withdrawAmount != 0 ? true : false; bytes32 loanParamsId = loanParamsIds[uint256(keccak256(abi.encodePacked( collateralTokenAddress, isTorqueLoan )))]; // converting to initialMargin if (leverageAmount != 0) { leverageAmount = SafeMath.div(WEI_PRECISION * WEI_PERCENT_PRECISION, leverageAmount); } (sentAmounts[1], sentAmounts[4]) = ProtocolLike(bZxContract).borrowOrTradeFromPool.value(msgValue)( // newPrincipal, newCollateral loanParamsId, loanId, isTorqueLoan, leverageAmount, // initialMargin sentAddresses, sentAmounts, loanDataBytes ); require (sentAmounts[1] != 0, "25"); return (sentAmounts[1], sentAmounts[4]); // newPrincipal, newCollateral } // sentAddresses[0]: lender // sentAddresses[1]: borrower // sentAddresses[2]: receiver // sentAddresses[3]: manager // sentAmounts[0]: interestRate // sentAmounts[1]: newPrincipal // sentAmounts[2]: interestInitialAmount // sentAmounts[3]: loanTokenSent // sentAmounts[4]: collateralTokenSent function _verifyTransfers( address collateralTokenAddress, address[4] memory sentAddresses, uint256[5] memory sentAmounts, uint256 withdrawalAmount) internal returns (uint256 msgValue) { address _wethToken = wethToken; address _loanTokenAddress = loanTokenAddress; address receiver = sentAddresses[2]; uint256 newPrincipal = sentAmounts[1]; uint256 loanTokenSent = sentAmounts[3]; uint256 collateralTokenSent = sentAmounts[4]; require(_loanTokenAddress != collateralTokenAddress, "26"); msgValue = msg.value; if (withdrawalAmount != 0) { // withdrawOnOpen == true _safeTransfer(_loanTokenAddress, receiver, withdrawalAmount, "27"); if (newPrincipal > withdrawalAmount) { _safeTransfer(_loanTokenAddress, bZxContract, newPrincipal - withdrawalAmount, "27"); } } else { _safeTransfer(_loanTokenAddress, bZxContract, newPrincipal, "27"); } if (collateralTokenSent != 0) { if (collateralTokenAddress == _wethToken && msgValue != 0 && msgValue >= collateralTokenSent) { IWeth(_wethToken).deposit.value(collateralTokenSent)(); _safeTransfer(collateralTokenAddress, bZxContract, collateralTokenSent, "28"); msgValue -= collateralTokenSent; } else { _safeTransferFrom(collateralTokenAddress, msg.sender, bZxContract, collateralTokenSent, "28"); } } if (loanTokenSent != 0) { _safeTransferFrom(_loanTokenAddress, msg.sender, bZxContract, loanTokenSent, "29"); } } function _safeTransfer( address token, address to, uint256 amount, string memory errorMsg) internal { _callOptionalReturn( token, abi.encodeWithSelector(IERC20(token).transfer.selector, to, amount), errorMsg ); } function _safeTransferFrom( address token, address from, address to, uint256 amount, string memory errorMsg) internal { _callOptionalReturn( token, abi.encodeWithSelector(IERC20(token).transferFrom.selector, from, to, amount), errorMsg ); } function _callOptionalReturn( address token, bytes memory data, string memory errorMsg) internal { (bool success, bytes memory returndata) = token.call(data); require(success, errorMsg); if (returndata.length != 0) { require(abi.decode(returndata, (bool)), errorMsg); } } function _underlyingBalance() internal view returns (uint256) { return IERC20(loanTokenAddress).balanceOf(address(this)); } /* Internal View functions */ function _tokenPrice( uint256 assetSupply) internal view returns (uint256) { uint256 totalTokenSupply = totalSupply_; return totalTokenSupply != 0 ? assetSupply .mul(WEI_PRECISION) .div(totalTokenSupply) : initialPrice; } function _avgBorrowInterestRate( uint256 assetBorrow) internal view returns (uint256) { if (assetBorrow != 0) { (uint256 interestOwedPerDay,) = _getAllInterest(); return interestOwedPerDay .mul(365 * WEI_PERCENT_PRECISION) .div(assetBorrow); } } // next supply interest adjustment function _supplyInterestRate( uint256 assetBorrow, uint256 assetSupply) internal view returns (uint256) { if (assetBorrow != 0 && assetSupply >= assetBorrow) { return _avgBorrowInterestRate(assetBorrow) .mul(_utilizationRate(assetBorrow, assetSupply)) .mul(SafeMath.sub(WEI_PERCENT_PRECISION, ProtocolLike(bZxContract).lendingFeePercent())) .div(WEI_PERCENT_PRECISION * WEI_PERCENT_PRECISION); } } function _nextBorrowInterestRate( uint256 borrowAmount) internal view returns (uint256) { uint256 interestUnPaid; if (borrowAmount != 0) { if (lastSettleTime_ != uint88(block.timestamp)) { (,interestUnPaid) = _getAllInterest(); } uint256 balance = _underlyingBalance() .add(interestUnPaid); if (borrowAmount > balance) { borrowAmount = balance; } } return _nextBorrowInterestRate2( borrowAmount, _totalAssetSupply(interestUnPaid) ); } function _nextBorrowInterestRate2( uint256 newBorrowAmount, uint256 assetSupply) internal view returns (uint256 nextRate) { uint256 utilRate = _utilizationRate( totalAssetBorrow().add(newBorrowAmount), assetSupply ); uint256 thisMinRate; uint256 thisMaxRate; uint256 thisBaseRate = baseRate; uint256 thisRateMultiplier = rateMultiplier; uint256 thisTargetLevel = targetLevel; uint256 thisKinkLevel = kinkLevel; uint256 thisMaxScaleRate = maxScaleRate; if (utilRate < thisTargetLevel) { // target targetLevel utilization when utilization is under targetLevel utilRate = thisTargetLevel; } if (utilRate > thisKinkLevel) { // scale rate proportionally up to 100% uint256 thisMaxRange = WEI_PERCENT_PRECISION - thisKinkLevel; // will not overflow utilRate -= thisKinkLevel; if (utilRate > thisMaxRange) utilRate = thisMaxRange; thisMaxRate = thisRateMultiplier .add(thisBaseRate) .mul(thisKinkLevel) .div(WEI_PERCENT_PRECISION); nextRate = utilRate .mul(SafeMath.sub(thisMaxScaleRate, thisMaxRate)) .div(thisMaxRange) .add(thisMaxRate); } else { nextRate = utilRate .mul(thisRateMultiplier) .div(WEI_PERCENT_PRECISION) .add(thisBaseRate); thisMinRate = thisBaseRate; thisMaxRate = thisRateMultiplier .add(thisBaseRate); if (nextRate < thisMinRate) nextRate = thisMinRate; else if (nextRate > thisMaxRate) nextRate = thisMaxRate; } } function _getAllInterest() internal view returns ( uint256 interestOwedPerDay, uint256 interestUnPaid) { // interestPaid, interestPaidDate, interestOwedPerDay, interestUnPaid, interestFeePercent, principalTotal uint256 interestFeePercent; (,,interestOwedPerDay,interestUnPaid,interestFeePercent,) = ProtocolLike(bZxContract).getLenderInterestData( address(this), loanTokenAddress ); interestUnPaid = interestUnPaid .mul(SafeMath.sub(WEI_PERCENT_PRECISION, interestFeePercent)) .div(WEI_PERCENT_PRECISION); } function _getMarginBorrowAmountAndRate( uint256 leverageAmount, uint256 depositAmount) internal view returns (uint256 borrowAmount, uint256 interestRate) { uint256 initialMargin = SafeMath.div(WEI_PRECISION * WEI_PERCENT_PRECISION, leverageAmount); interestRate = _nextBorrowInterestRate2( depositAmount .mul(WEI_PERCENT_PRECISION) .div(initialMargin), _totalAssetSupply(0) ); // assumes that loan, collateral, and interest token are the same borrowAmount = depositAmount .mul(WEI_PERCENT_PRECISION * WEI_PERCENT_PRECISION) .div(_adjustValue( interestRate, 2419200, // 28 day duration for margin trades initialMargin)) .div(initialMargin); } function _totalAssetSupply( uint256 interestUnPaid) internal view returns (uint256) // assetSupply { if (totalSupply_ != 0) { uint256 assetsBalance = _flTotalAssetSupply; // temporary locked totalAssetSupply during a flash loan transaction if (assetsBalance == 0) { assetsBalance = _underlyingBalance() .add(totalAssetBorrow()); } return assetsBalance .add(interestUnPaid); } } function _adjustValue( uint256 interestRate, uint256 maxDuration, uint256 marginAmount) internal pure returns (uint256) { return maxDuration != 0 ? interestRate .mul(WEI_PERCENT_PRECISION) .mul(maxDuration) .div(31536000) // 86400 * 365 .div(marginAmount) .add(WEI_PERCENT_PRECISION) : WEI_PERCENT_PRECISION; } function _utilizationRate( uint256 assetBorrow, uint256 assetSupply) internal pure returns (uint256) { if (assetBorrow != 0 && assetSupply != 0) { // U = total_borrow / total_supply return assetBorrow .mul(WEI_PERCENT_PRECISION) .div(assetSupply); } } /* Owner-Only functions */ function updateSettings( address settingsTarget, bytes memory callData) public { if (msg.sender != owner()) { address _lowerAdmin; address _lowerAdminContract; assembly { _lowerAdmin := sload(iToken_LowerAdminAddress) _lowerAdminContract := sload(iToken_LowerAdminContract) } require(msg.sender == _lowerAdmin && settingsTarget == _lowerAdminContract); } address currentTarget = target_; target_ = settingsTarget; (bool result,) = address(this).call(callData); uint256 size; uint256 ptr; assembly { size := returndatasize ptr := mload(0x40) returndatacopy(ptr, 0, size) if eq(result, 0) { revert(ptr, size) } } target_ = currentTarget; assembly { return(ptr, size) } } } contract LoanTokenLogicWeth is LoanTokenLogicStandard { constructor( address _newOwner) public LoanTokenLogicStandard(_newOwner) {} function mintWithEther( address receiver) external payable nonReentrant returns (uint256 mintAmount) { return _mintToken( receiver, msg.value ); } function burnToEther( address receiver, uint256 burnAmount) external nonReentrant returns (uint256 loanAmountPaid) { loanAmountPaid = _burnToken( burnAmount ); if (loanAmountPaid != 0) { IWethERC20(wethToken).withdraw(loanAmountPaid); Address.sendValue( receiver, loanAmountPaid ); } } /* Internal functions */ // sentAddresses[0]: lender // sentAddresses[1]: borrower // sentAddresses[2]: receiver // sentAddresses[3]: manager // sentAmounts[0]: interestRate // sentAmounts[1]: newPrincipal // sentAmounts[2]: interestInitialAmount // sentAmounts[3]: loanTokenSent // sentAmounts[4]: collateralTokenSent function _verifyTransfers( address collateralTokenAddress, address[4] memory sentAddresses, uint256[5] memory sentAmounts, uint256 withdrawalAmount) internal returns (uint256 msgValue) { address _wethToken = wethToken; address _loanTokenAddress = _wethToken; address receiver = sentAddresses[2]; uint256 newPrincipal = sentAmounts[1]; uint256 loanTokenSent = sentAmounts[3]; uint256 collateralTokenSent = sentAmounts[4]; require(_loanTokenAddress != collateralTokenAddress, "26"); msgValue = msg.value; if (withdrawalAmount != 0) { // withdrawOnOpen == true IWethERC20(_wethToken).withdraw(withdrawalAmount); Address.sendValue( receiver, withdrawalAmount ); if (newPrincipal > withdrawalAmount) { _safeTransfer(_loanTokenAddress, bZxContract, newPrincipal - withdrawalAmount, "27"); } } else { _safeTransfer(_loanTokenAddress, bZxContract, newPrincipal, "27"); } if (collateralTokenSent != 0) { _safeTransferFrom(collateralTokenAddress, msg.sender, bZxContract, collateralTokenSent, "28"); } if (loanTokenSent != 0) { if (msgValue != 0 && msgValue >= loanTokenSent) { IWeth(_wethToken).deposit.value(loanTokenSent)(); _safeTransfer(_loanTokenAddress, bZxContract, loanTokenSent, "29"); msgValue -= loanTokenSent; } else { _safeTransferFrom(_loanTokenAddress, msg.sender, bZxContract, loanTokenSent, "29"); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"assetBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"avgBorrowInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxContract","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"borrowInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"gasTokenUser","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"borrowWithGasToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"loanAmountPaid","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"burnToEther","outputs":[{"internalType":"uint256","name":"loanAmountPaid","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"checkpointPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"checkpointSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashBorrow","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gasToken","outputs":[{"internalType":"contract ITokenHolderLike","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"}],"name":"getBorrowAmountForDeposit","outputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"uint256","name":"initialLoanDuration","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"}],"name":"getDepositAmountForBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"leverageAmount","type":"uint256"},{"internalType":"uint256","name":"loanTokenSent","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"}],"name":"getEstimatedMarginDetails","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"leverageAmount","type":"uint256"}],"name":"getMaxEscrowAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kinkLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanParamsIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lowUtilBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lowUtilRateMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"leverageAmount","type":"uint256"},{"internalType":"uint256","name":"loanTokenSent","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"bytes","name":"loanDataBytes","type":"bytes"}],"name":"marginTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"uint256","name":"leverageAmount","type":"uint256"},{"internalType":"uint256","name":"loanTokenSent","type":"uint256"},{"internalType":"uint256","name":"collateralTokenSent","type":"uint256"},{"internalType":"address","name":"collateralTokenAddress","type":"address"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"address","name":"gasTokenUser","type":"address"},{"internalType":"bytes","name":"loanDataBytes","type":"bytes"}],"name":"marginTradeWithGasToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"marketLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxScaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"mintWithEther","outputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"nextBorrowInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"supplyAmount","type":"uint256"}],"name":"nextSupplyInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"profitOf","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rateMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supplyInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"targetLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenHolder","outputs":[{"internalType":"contract ITokenHolderLike","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssetBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"assetSupply","type":"uint256"}],"name":"totalSupplyInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"settingsTarget","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"name":"updateSettings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wethToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260016000553480156200001657600080fd5b50604051620053b9380380620053b98339810160408190526200003991620001b6565b8060006200004f6001600160e01b03620000a816565b600180546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062005399833981519152908290a350620000a0816001600160e01b03620000ac16565b5050620002a9565b3390565b620000bf6001600160e01b03620000fe16565b620000e75760405162461bcd60e51b8152600401620000de9062000265565b60405180910390fd5b620000fb816001600160e01b036200012f16565b50565b6001546000906001600160a01b0316620001206001600160e01b03620000a816565b6001600160a01b031614905090565b6001600160a01b038116620001585760405162461bcd60e51b8152600401620000de9062000253565b6001546040516001600160a01b038084169216906000805160206200539983398151915290600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b8051620001b08162000292565b92915050565b600060208284031215620001c957600080fd5b6000620001d78484620001a3565b949350505050565b6000620001ee60268362000277565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600062000238600c8362000277565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b60208082528101620001b081620001df565b60208082528101620001b08162000229565b90815260200190565b60006001600160a01b038216620001b0565b6200029d8162000280565b8114620000fb57600080fd5b6150e080620002b96000396000f3fe6080604052600436106103765760003560e01c806370a08231116101d1578063995363d311610102578063d65a5021116100a0578063eebc50811161006f578063eebc50811461094e578063ef2b0b391461096e578063f2fde38b14610983578063ffa1ad74146109a357610376565b8063d65a5021146108d9578063d73dd623146108f9578063d759dbeb14610919578063dd62ed3e1461092e57610376565b8063b9fe1a8f116100dc578063b9fe1a8f1461087c578063ba0e43bf1461089c578063c5bf0e9d146108b1578063c91d59fe146108c457610376565b8063995363d3146108275780639dc29fac1461083c578063a9059cbb1461085c57610376565b80638325a1c01161016f5780638f32d59b116101495780638f32d59b146107d55780638f6ede1f146107ea5780638fb807c5146107fd57806395d89b411461081257610376565b80638325a1c014610798578063890a62a0146107ad5780638da5cb5b146107c057610376565b80637e37c08c116101ab5780637e37c08c1461072e5780637ff9b5961461074357806381a6b25014610758578063829b38f41461077857610376565b806370a08231146106e4578063797bf385146107045780637b7933b41461071957610376565b8063313ce567116102ab5780634b57b0be11610249578063612ef80b11610223578063612ef80b14610660578063631a3ef81461067557806366188463146106955780636b40cd40146106b557610376565b80634b57b0be1461060957806354198ce91461062b57806356e07d701461064b57610376565b80633885daf8116102855780633885daf81461059f57806340c10f19146105b2578063420a83e7146105d257806344a4a003146105f457610376565b8063313ce567146105485780633291c11a1461056a578063330691ac1461058a57610376565b806318160ddd1161031857806320f6d07c116102f257806320f6d07c146104de57806323b872dd146104f3578063284e2f56146105135780632ea295fa1461053557610376565b806318160ddd1461049f5780631d0806ae146104b45780631f68f20a146104c957610376565b8063095ea7b311610354578063095ea7b31461041c57806309ec6b6b14610449578063124168981461045e57806314dfe7921461047e57610376565b806304797930146103a457806306b3efd6146103da57806306fdde03146103fa575b34801561038257600080fd5b5060405162461bcd60e51b815260040161039b90614e7e565b60405180910390fd5b3480156103b057600080fd5b506103c46103bf3660046141f8565b6109b8565b6040516103d19190614c04565b60405180910390f35b3480156103e657600080fd5b506103c46103f5366004613d2d565b610afa565b34801561040657600080fd5b5061040f610b3c565b6040516103d19190614ccf565b34801561042857600080fd5b5061043c610437366004613e38565b610bc7565b6040516103d19190614bf6565b34801561045557600080fd5b506103c4610c32565b34801561046a57600080fd5b506103c46104793660046140de565b610c47565b61049161048c36600461402a565b610c72565b6040516103d1929190614efe565b3480156104ab57600080fd5b506103c4610cc0565b3480156104c057600080fd5b506103c4610cc6565b3480156104d557600080fd5b506103c4610ccc565b3480156104ea57600080fd5b506103c4610cd2565b3480156104ff57600080fd5b5061043c61050e366004613da3565b610d69565b34801561051f57600080fd5b5061053361052e366004613df0565b610da4565b005b610491610543366004613f62565b610eea565b34801561055457600080fd5b5061055d610f4c565b6040516103d19190614f27565b34801561057657600080fd5b506103c46105853660046140de565b610f55565b34801561059657600080fd5b506103c4610f67565b6104916105ad366004613f62565b610f6d565b3480156105be57600080fd5b506103c46105cd366004613e38565b6111e5565b3480156105de57600080fd5b506105e7611226565b6040516103d19190614ce0565b34801561060057600080fd5b506103c461123e565b34801561061557600080fd5b5061061e611250565b6040516103d19190614b10565b34801561063757600080fd5b506103c4610646366004613d2d565b611268565b34801561065757600080fd5b506103c4611309565b34801561066c57600080fd5b506103c461130f565b34801561068157600080fd5b506103c46106903660046141f8565b611340565b3480156106a157600080fd5b5061043c6106b0366004613e38565b611495565b3480156106c157600080fd5b506106d56106d036600461423b565b611538565b6040516103d193929190614f0c565b3480156106f057600080fd5b506103c46106ff366004613d2d565b61165c565b34801561071057600080fd5b5061061e611677565b34801561072557600080fd5b506103c461168d565b34801561073a57600080fd5b506103c4611693565b34801561074f57600080fd5b506103c4611699565b34801561076457600080fd5b506103c4610773366004613e38565b6116ed565b34801561078457600080fd5b506103c46107933660046140de565b61179a565b3480156107a457600080fd5b506103c46117df565b6104916107bb366004613e86565b6117eb565b3480156107cc57600080fd5b5061061e611a84565b3480156107e157600080fd5b5061043c611a93565b6103c46107f8366004613d2d565b611ab9565b34801561080957600080fd5b506103c4611aec565b34801561081e57600080fd5b5061040f611b32565b34801561083357600080fd5b5061061e611b8d565b34801561084857600080fd5b506103c4610857366004613e38565b611b9f565b34801561086857600080fd5b5061043c610877366004613e38565b611c13565b34801561088857600080fd5b506103c46108973660046140de565b611c23565b3480156108a857600080fd5b506103c4611c2e565b61040f6108bf36600461411a565b611c34565b3480156108d057600080fd5b506105e7611ecb565b3480156108e557600080fd5b506103c46108f43660046140de565b611edd565b34801561090557600080fd5b5061043c610914366004613e38565b611ef0565b34801561092557600080fd5b506103c4611f81565b34801561093a57600080fd5b506103c4610949366004613d69565b611f87565b34801561095a57600080fd5b506103c4610969366004613d2d565b611fb2565b34801561097a57600080fd5b506103c4611fcd565b34801561098f57600080fd5b5061053361099e366004613d2d565b611fd3565b3480156109af57600080fd5b506103c4612003565b60008315610af35760008051602061507e8339815191526001600160a01b0316631eca6377600f60008560016040516020016109f5929190614a67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546004546001600160a01b03600160601b9091048116908616610a515773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610a53565b855b8860016040518663ffffffff1660e01b8152600401610a76959493929190614c12565b60206040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ac691908101906140fc565b9050610ada81610ad4611aec565b85612008565b9250610ae891506120869050565b811115610af3575060005b9392505050565b6000610b34670de0b6b3a7640000610b28610b13611699565b610b1c8661165c565b9063ffffffff6120be16565b9063ffffffff6120f816565b90505b919050565b6002805460408051602060018416156101000260001901909316849004601f81018490048402820184019092528181529291830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b505050505081565b3360008181526012602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610c20908690614c04565b60405180910390a35060015b92915050565b6000610c41610479600061213a565b90505b90565b600080610c52610cd2565b90508015610c6c57610c64818461216c565b915050610b37565b50919050565b600080600160005414610c975760405162461bcd60e51b815260040161039b90614e9e565b6002600055610cab8989898989898961223d565b6001600055909a909950975050505050505050565b60135490565b600e5481565b60055481565b6004805460405163250f447f60e11b815260009260008051602061507e83398151915292634a1e88fe92610d19923092600160601b90046001600160a01b03169101614b1e565b60206040518083038186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c4191908101906140fc565b6001600160a01b0383166000908152601260209081526040808320338452909152812054610d9c9085908590859061239f565b949350505050565b610dac611a84565b6001600160a01b0316336001600160a01b031614610e3d577f7ad06df6a0af6bd602d90db766e0d5f253b45187c3717a0f9026ea8b10ff0d4b547f34b31cff1dbd8374124bd4505521fc29cab0f9554a5386ba7d784a4e611c7e3154336001600160a01b038316148015610e315750806001600160a01b0316846001600160a01b0316145b610e3a57600080fd5b50505b601480546001600160a01b038481166001600160a01b03198316179092556040519116906000903090610e71908590614af9565b6000604051808303816000865af19150503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b50506040519091503d90816000823e82610ecb578181fd5b601480546001600160a01b0319166001600160a01b0386161790558181f35b600080600160005414610f0f5760405162461bcd60e51b815260040161039b90614e9e565b6002600081905550610f368a8a8a8a8a8a8a60405180602001604052806000815250612540565b6001600055909b909a5098505050505050505050565b60045460ff1681565b600f6020526000908152604090205481565b60065481565b600080600160005414610f925760405162461bcd60e51b815260040161039b90614e9e565b6002600055836001600160a01b038116610fbd57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a0823190610fee908490600401614b10565b60206040518083038186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061103e91908101906140fc565b156111bc5760005a90506110578c8c8c8c8c8c8b61223d565b9350935061a3db61106782612741565b61374a018161107257fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c611415611129576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b936906110d1908490600401614c04565b602060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061112391908101906140fc565b506111b6565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906111629085908590600401614bdb565b602060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111b491908101906140fc565b505b506111d0565b6111cb8b8b8b8b8b8b8a61223d565b925092505b50600160005590999098509650505050505050565b60006001600054146112095760405162461bcd60e51b815260040161039b90614e9e565b60026000556112188383612756565b90505b600160005592915050565b7355eb3dd3f738cfdda986b8eff3fa784477552c6181565b6000610c4161124b610cd2565b6128b2565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600080827f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb660001b6040516020016112a1929190614a8d565b604051602081830303815290604052805190602001209050610af38160116000866001600160a01b03166001600160a01b03168152602001908152602001600020546112eb611699565b6001600160a01b0387166000908152601060205260409020546128e5565b600a5481565b60008061131c600061213a565b90506000611328610cd2565b90508082111561133b5790039050610c44565b505090565b60008315610af357600061135c85611356611aec565b86612008565b92505050611368612086565b811161148d57611485600a60008051602061507e8339815191526001600160a01b03166368c1a115600f60008860016040516020016113a8929190614a67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546004546001600160a01b03600160601b90910481169089166114045773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611406565b885b8760016040518663ffffffff1660e01b8152600401611429959493929190614c12565b60206040518083038186803b15801561144157600080fd5b505afa158015611455573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061147991908101906140fc565b9063ffffffff61294816565b915050610af3565b509392505050565b3360009081526012602090815260408083206001600160a01b03861684529091528120548083106114c8575060006114cc565b8290035b3360008181526012602090815260408083206001600160a01b03891680855292529182902084905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611526908590614c04565b60405180910390a35060019392505050565b600080806001600160a01b0384166115625773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc293505b600061156f85878961296d565b905061157b8882612ab0565b9094509150611588612086565b84111561159f575060009250829150819050611652565b6115af878563ffffffff61294816565b6004805460405163d67f707760e01b815292995060008051602061507e8339815191529263d67f7077926115fe92600160601b90046001600160a01b0316918a918d918d918a918d9101614b61565b60206040518083038186803b15801561161657600080fd5b505afa15801561162a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061164e91908101906140fc565b9250505b9450945094915050565b6001600160a01b031660009081526011602052604090205490565b600454600160601b90046001600160a01b031681565b600d5481565b60085481565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b0316146116d6576116d2612b41565b9150505b6116e76116e28261213a565b612c17565b91505090565b60006001600054146117115760405162461bcd60e51b815260040161039b90614e9e565b600260005561171f82612c46565b9050801561121b57604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9061175e908490600401614c04565b600060405180830381600087803b15801561177857600080fd5b505af115801561178c573d6000803e3d6000fd5b5050505061121b8382612d39565b6000806117b76f4b3b4ca85a86c47a098a224000000000846120f8565b9050610af36117d368056bc75e2d631000006224ea0084612dda565b610b2883610b1c61130f565b6000610c416000612e1b565b6000806001600054146118105760405162461bcd60e51b815260040161039b90614e9e565b6002600055836001600160a01b03811661183b57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a082319061186c908490600401614b10565b60206040518083038186803b15801561188457600080fd5b505afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118bc91908101906140fc565b15611a4a5760005a90506118e58d8d8d8d8d8d8d60405180602001604052806000815250612540565b9350935061a3db6118f582612741565b61374a018161190057fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c6114156119b7576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b9369061195f908490600401614c04565b602060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b191908101906140fc565b50611a44565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906119f09085908590600401614bdb565b602060405180830381600087803b158015611a0a57600080fd5b505af1158015611a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a4291908101906140fc565b505b50611a6e565b611a698c8c8c8c8c8c8c60405180602001604052806000815250612540565b925092505b506001600055909a909950975050505050505050565b6001546001600160a01b031690565b6001546000906001600160a01b0316611aaa612e76565b6001600160a01b031614905090565b6000600160005414611add5760405162461bcd60e51b815260040161039b90614e9e565b600260005561121b8234612756565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b031614611b2957611b25612b41565b9150505b6116e78161213a565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b60008051602061507e83398151915281565b6000600160005414611bc35760405162461bcd60e51b815260040161039b90614e9e565b6002600055611bd182612c46565b9050801561121b5761121b6004600c9054906101000a90046001600160a01b03168483604051806040016040528060018152602001603560f81b815250612e7a565b6000610af333848460001961239f565b6000610b3482612e1b565b60095481565b6060600160005414611c585760405162461bcd60e51b815260040161039b90614e9e565b60026000908155356001600160e01b031916611c7381612eda565b15611c905760405162461bcd60e51b815260040161039b90614e2e565b611c98612f33565b88611cb55760405162461bcd60e51b815260040161039b90614eae565b6000611cc7473463ffffffff612fed16565b90506000611cde611cd6610cd2565b611479612086565b905080600c81905550611d226004600c9054906101000a90046001600160a01b03168b8d60405180604001604052806002815260200161333960f01b815250612e7a565b606087611d685786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611da392505050565b8888604051611d78929190614aec565b604051908190038120611d919189908990602001614acf565b60405160208183030381529060405290505b60006060720f400e6818158d541c3ebe45fe3aa0d47372ff6001600160a01b03163463de064e0d8e86604051602401611ddd929190614bbb565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611e169190614af9565b60006040518083038185875af1925050503d8060008114611e53576040519150601f19603f3d011682016040523d82523d6000602084013e611e58565b606091505b509150915081611e7a5760405162461bcd60e51b815260040161039b90614e5e565b6000600c55478511801590611e99575083611e96611cd6610cd2565b10155b611eb55760405162461bcd60e51b815260040161039b90614dde565b60016000559d9c50505050505050505050505050565b6d4946c0e9f43f4dee607b0ef1fa1c81565b6000610b3461047983611479600061213a565b3360009081526012602090815260408083206001600160a01b03861684529091528120548190611f26908463ffffffff61294816565b3360008181526012602090815260408083206001600160a01b038a168085529252918290208490559051929350917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611526908590614c04565b60075481565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b6001600160a01b031660009081526010602052604090205490565b600b5481565b611fdb611a93565b611ff75760405162461bcd60e51b815260040161039b90614e2e565b6120008161302f565b50565b600681565b600080600061201786866130b1565b9250612069612051670de0b6b3a764000061204c6b0a3098c68eb9427db8000000610b2883610b1c8a8c63ffffffff6120be16565b612fed565b610b2888670de0b6b3a764000063ffffffff6120be16565b905061207b818763ffffffff612fed16565b915093509350939050565b600480546040516370a0823160e01b8152600092600160601b9092046001600160a01b0316916370a0823191610d1991309101614b10565b6000826120cd57506000610c2c565b828202828482816120da57fe5b0414610af35760405162461bcd60e51b815260040161039b90614e1e565b6000610af383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131c7565b6000601354600014610b3757600c548061215c57612159611cd6610cd2565b90505b610c64818463ffffffff61294816565b6000821580159061217d5750828210155b15610c2c5761223668056bc75e2d631000008002610b2861222068056bc75e2d6310000060008051602061507e8339815191526001600160a01b0316634699f8466040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e857600080fd5b505afa1580156121fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061204c91908101906140fc565b610b1c61222d88886131fe565b610b1c896128b2565b9050610c2c565b6000806000356001600160e01b03191661225681612eda565b156122735760405162461bcd60e51b815260040161039b90614e2e565b61227b612f33565b8915806122905750336001600160a01b038616145b6122ac5760405162461bcd60e51b815260040161039b90614d9e565b6001600160a01b0386166122d25773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc295505b6004546001600160a01b03878116600160601b9092041614156123075760405162461bcd60e51b815260040161039b90614d8e565b600061231487898b61296d565b9050806123335760405162461bcd60e51b815260040161039b90614dbe565b61233b613c1d565b612343613c3b565b3082526001600160a01b038816602083018190526040830152606081018b9052608081018a90526123748c84612ab0565b8252602082015261238b8d60008e8c86868d613230565b955095505050505097509795505050505050565b600060001982146123fb576040805180820190915260028152610c4d60f21b60208201526123d6908390859063ffffffff61343a16565b6001600160a01b03861660009081526012602090815260408083203384529091529020555b6001600160a01b0384166124215760405162461bcd60e51b815260040161039b90614cfe565b6001600160a01b03851660009081526011602090815260408083205481518083019092526002825261189b60f11b9282019290925290919061246c908390879063ffffffff61343a16565b6001600160a01b038089166000908152601160205260408082208490559189168152908120549192506124a5828863ffffffff61294816565b6001600160a01b03891660009081526011602052604081208290559091506124cb611699565b90506124d98a868684613466565b6124e589848484613466565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516125289190614c04565b60405180910390a35060019998505050505050505050565b6000806000356001600160e01b03191661255981612eda565b156125765760405162461bcd60e51b815260040161039b90614e2e565b61257e612f33565b8961259b5760405162461bcd60e51b815260040161039b90614ece565b3415806125a757508734145b6125c35760405162461bcd60e51b815260040161039b90614d4e565b871515806125d057508a15155b6125ec5760405162461bcd60e51b815260040161039b90614ede565b6001600160a01b03871615158061260257503415155b8061260c57508a15155b6126285760405162461bcd60e51b815260040161039b90614e8e565b8a158061263d5750336001600160a01b038716145b6126595760405162461bcd60e51b815260040161039b90614d9e565b6001600160a01b03871661267f5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc296505b6004546001600160a01b03888116600160601b9092041614156126b45760405162461bcd60e51b815260040161039b90614cee565b6126bc613c1d565b6126c4613c3b565b3082526001600160a01b03888116602084015287166040830152608081018a90526126f98c6126f3600061213a565b8d612008565b60208085019190915260408085019290925291835280519182019052600080825261272d918f918f918d9087908790613230565b945094505050509850989650505050505050565b6000601036025a836152080103019050919050565b6000612760612f33565b8161277d5760405162461bcd60e51b815260040161039b90614dfe565b600061278c6116e2600061213a565b90506127aa81610b2885670de0b6b3a764000063ffffffff6120be16565b9150346127f2576127ed6004600c9054906101000a90046001600160a01b031633308660405180604001604052806002815260200161062760f31b81525061351c565b61287a565b8234146128115760405162461bcd60e51b815260040161039b90614e0e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050505b6001600160a01b0384166000908152601160205260409020546128ab9085906128a582868887613547565b84613466565b5092915050565b60008115610b375760006128c4612b41565b509050610c6483610b28836907baab4146b63dd0000063ffffffff6120be16565b6000816128f457506000610d9c565b50835461293f81612933670de0b6b3a76400006129278861291b898963ffffffff61366816565b9063ffffffff6136ae16565b9063ffffffff61371916565b9063ffffffff61377d16565b95945050505050565b600082820183811015610af35760405162461bcd60e51b815260040161039b90614d1e565b808215610af35760008060008051602061507e8339815191526001600160a01b03166378d849ed6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129be57600080fd5b505afa1580156129d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129f69190810190613d4b565b60048054604051630a7549df60e21b81526001600160a01b03938416936329d5277c93612a31938c93600160601b9091049092169101614b1e565b604080518083038186803b158015612a4857600080fd5b505afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a8091908101906141c8565b9150915081600014612aa757612aa48361147983610b28898763ffffffff6120be16565b92505b50509392505050565b60008080612ace6f4b3b4ca85a86c47a098a224000000000866120f8565b9050612aff612af082610b288768056bc75e2d6310000063ffffffff6120be16565b612afa600061213a565b6130b1565b9150612b3781610b28612b16856224ea0086612dda565b610b2888701d6329f1c35ca4bfabb9f561000000000063ffffffff6120be16565b9250509250929050565b60048054604051630d1979fb60e41b81526000928392839260008051602061507e8339815191529263d1979fb092612b8d923092600160601b9092046001600160a01b03169101614b1e565b60c06040518083038186803b158015612ba557600080fd5b505afa158015612bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bdd919081019061429c565b5091965094509250612c10915068056bc75e2d631000009050610b28612c038285612fed565b859063ffffffff6120be16565b9150509091565b60135460009080612c2a57600e54610af3565b610af381610b2885670de0b6b3a764000063ffffffff6120be16565b6000612c50612f33565b81612c6d5760405162461bcd60e51b815260040161039b90614e3e565b612c763361165c565b821115612caa576000198214612c9e5760405162461bcd60e51b815260040161039b90614dee565b612ca73361165c565b91505b6000612cb96116e2600061213a565b90506000612cd9670de0b6b3a7640000610b28868563ffffffff6120be16565b90506000612ce5612086565b905081935080841115612d0a5760405162461bcd60e51b815260040161039b90614d6e565b33600081815260116020526040902054612d319190612d2b828989896137c3565b86613466565b505050919050565b80471015612d595760405162461bcd60e51b815260040161039b90614d5e565b6000826001600160a01b031682604051612d7290614b05565b60006040518083038185875af1925050503d8060008114612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b5050905080612dd55760405162461bcd60e51b815260040161039b90614d3e565b505050565b600082612df05768056bc75e2d63100000610d9c565b610d9c68056bc75e2d6310000061147984610b286301e133808189610b1c8c8863ffffffff6120be16565b6000808215612e6957600454426001600160581b039081166101009092041614612e4b57612e47612b41565b9150505b6000612e5982611479612086565b905080841115612e67578093505b505b610af383612afa8361213a565b3390565b604051612ed490859063a9059cbb60e01b90612e9c9087908790602401614bdb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152836138e8565b50505050565b600080827fa7143c84d793a15503da6f19bf9119a2dac94448ca45d77c8bf08f57b2e9104760001b604051602001612f13929190614ab3565b60408051601f198184030181529190528051602090910120549392505050565b60045442906001600160581b0380831661010090920416146120005760048054604051630740ff7d60e51b815260008051602061507e8339815191529263e81fefa092612f9292600160601b9091046001600160a01b03169101614b10565b600060405180830381600087803b158015612fac57600080fd5b505af1158015612fc0573d6000803e3d6000fd5b5050600480546001600160581b038516610100026bffffffffffffffffffffff0019909116179055505050565b6000610af383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061343a565b6001600160a01b0381166130555760405162461bcd60e51b815260040161039b90614d0e565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000806130c96130c385611479610cd2565b846131fe565b600554600654600954600a54600b54949550600094859493929190828810156130f0578297505b8188111561316357968190039668056bc75e2d6310000082900380891115613116578098505b61313768056bc75e2d63100000610b2885610b1c898b63ffffffff61294816565b965061315b8761147983610b2861314e878d612fed565b8e9063ffffffff6120be16565b9950506131b9565b6131848561147968056bc75e2d63100000610b288c8963ffffffff6120be16565b9850939550859361319b848663ffffffff61294816565b9550868910156131ad578698506131b9565b858911156131b9578598505b505050505050505092915050565b600081836131e85760405162461bcd60e51b815260040161039b9190614ccf565b5060008385816131f457fe5b0495945050505050565b6000821580159061320e57508115155b15610c2c5761223682610b288568056bc75e2d6310000063ffffffff6120be16565b60008061323b612086565b60208501511180159061325a575060208501516001600160a01b031615155b6132765760405162461bcd60e51b815260040161039b90614d7e565b60408501516001600160a01b031661329c5760208501516001600160a01b031660408601525b60006132aa8787878c6139ae565b602086015160608701519192506132c19190612948565b606086015288156132e15760608501516132db908a612fed565b60608601525b6000896132ef5760006132f2565b60015b90506000600f60008a8460405160200161330d929190614a67565b6040516020818303038152906040528051906020012060001c81526020019081526020016000205490508960001461335c576133596f4b3b4ca85a86c47a098a2240000000008b6120f8565b99505b60008051602061507e8339815191526001600160a01b031663585314cf84838f868f8e8e8e6040518963ffffffff1660e01b81526004016133a39796959493929190614c5e565b60408051808303818588803b1580156133bb57600080fd5b505af11580156133cf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506133f491908101906141c8565b60808901526020880181905261341c5760405162461bcd60e51b815260040161039b90614dce565b50505060208401516080909401519399939850929650505050505050565b6000818484111561345e5760405162461bcd60e51b815260040161039b9190614ccf565b505050900390565b60405160009061349c9086907f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb690602001614a8d565b604051602081830303815290604052805190602001209050600083600014156134c857600092506134f9565b84156134f9576001600160a01b0386166000908152601060205260409020546134f6908390879086906128e5565b90505b90556001600160a01b039093166000908152601060205260409020929092555050565b6040516135409086906323b872dd60e01b90612e9c90889088908890602401614b39565b5050505050565b60006001600160a01b03851661356f5760405162461bcd60e51b815260040161039b90614cfe565b6001600160a01b038516600090815260116020526040812054613598908663ffffffff61294816565b6001600160a01b03871660009081526011602052604090208190556013549091506135c9908663ffffffff61294816565b6013556040516001600160a01b038716907fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9061360b90889088908890614f0c565b60405180910390a2856001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516136579190614c04565b60405180910390a395945050505050565b600081830381831280159061367d5750838113155b80613692575060008312801561369257508381135b610af35760405162461bcd60e51b815260040161039b90614ebe565b6000826136bd57506000610c2c565b826000191480156136d15750600160ff1b82145b156136ee5760405162461bcd60e51b815260040161039b90614e6e565b828202828482816136fb57fe5b0514610af35760405162461bcd60e51b815260040161039b90614e6e565b6000816137385760405162461bcd60e51b815260040161039b90614eee565b8160001914801561374c5750600160ff1b83145b156137695760405162461bcd60e51b815260040161039b90614dae565b600082848161377457fe5b05949350505050565b60008282018183128015906137925750838112155b806137a757506000831280156137a757508381125b610af35760405162461bcd60e51b815260040161039b90614d2e565b6040805180820182526002815261189b60f11b6020808301919091526001600160a01b0387166000908152601190915291822054829161380b9190879063ffffffff61343a16565b9050600a811161382c57613825858263ffffffff61294816565b9450600090505b6001600160a01b038616600090815260116020526040902081905560135461385a908663ffffffff612fed16565b6013556040516001600160a01b038716907f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449061389c90889088908890614f0c565b60405180910390a260006001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516136579190614c04565b60006060846001600160a01b0316846040516139049190614af9565b6000604051808303816000865af19150503d8060008114613941576040519150601f19603f3d011682016040523d82523d6000602084013e613946565b606091505b509150915081839061396b5760405162461bcd60e51b815260040161039b9190614ccf565b5080511561354057808060200190516139879190810190613e68565b83906139a65760405162461bcd60e51b815260040161039b9190614ccf565b505050505050565b604083015160208301516060840151608085015160009373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc293849391929091906001600160a01b038b16851415613a0b5760405162461bcd60e51b815260040161039b90614e4e565b3496508715613abf57604051632e1a7d4d60e01b81526001600160a01b03871690632e1a7d4d90613a40908b90600401614c04565b600060405180830381600087803b158015613a5a57600080fd5b505af1158015613a6e573d6000803e3d6000fd5b50505050613a7c8489612d39565b87831115613aba57613aba8560008051602061507e8339815191528a860360405180604001604052806002815260200161323760f01b815250612e7a565b613af3565b613af38560008051602061507e8339815191528560405180604001604052806002815260200161323760f01b815250612e7a565b8015613b2e57613b2e8b3360008051602061507e8339815191528460405180604001604052806002815260200161064760f31b81525061351c565b8115613c0f578615801590613b435750818710155b15613bda57856001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015613b8357600080fd5b505af1158015613b97573d6000803e3d6000fd5b5050505050613bd08560008051602061507e8339815191528460405180604001604052806002815260200161323960f01b815250612e7a565b8187039650613c0f565b613c0f853360008051602061507e8339815191528560405180604001604052806002815260200161323960f01b81525061351c565b505050505050949350505050565b60405180608001604052806004906020820280388339509192915050565b6040518060a001604052806005906020820280388339509192915050565b8035610c2c81615057565b8051610c2c81615057565b8051610c2c8161506b565b8035610c2c81615074565b60008083601f840112613c9757600080fd5b50813567ffffffffffffffff811115613caf57600080fd5b602083019150836001820283011115613cc757600080fd5b9250929050565b600082601f830112613cdf57600080fd5b8135613cf2613ced82614f5c565b614f35565b91508082526020830160208301858383011115613d0e57600080fd5b613d19838284614fdd565b50505092915050565b8051610c2c81615074565b600060208284031215613d3f57600080fd5b6000610d9c8484613c59565b600060208284031215613d5d57600080fd5b6000610d9c8484613c64565b60008060408385031215613d7c57600080fd5b6000613d888585613c59565b9250506020613d9985828601613c59565b9150509250929050565b600080600060608486031215613db857600080fd5b6000613dc48686613c59565b9350506020613dd586828701613c59565b9250506040613de686828701613c7a565b9150509250925092565b60008060408385031215613e0357600080fd5b6000613e0f8585613c59565b925050602083013567ffffffffffffffff811115613e2c57600080fd5b613d9985828601613cce565b60008060408385031215613e4b57600080fd5b6000613e578585613c59565b9250506020613d9985828601613c7a565b600060208284031215613e7a57600080fd5b6000610d9c8484613c6f565b60008060008060008060008060006101208a8c031215613ea557600080fd5b6000613eb18c8c613c7a565b9950506020613ec28c828d01613c7a565b9850506040613ed38c828d01613c7a565b9750506060613ee48c828d01613c7a565b9650506080613ef58c828d01613c59565b95505060a0613f068c828d01613c59565b94505060c0613f178c828d01613c59565b93505060e0613f288c828d01613c59565b9250506101008a013567ffffffffffffffff811115613f4657600080fd5b613f528c828d01613cce565b9150509295985092959850929598565b600080600080600080600080610100898b031215613f7f57600080fd5b6000613f8b8b8b613c7a565b9850506020613f9c8b828c01613c7a565b9750506040613fad8b828c01613c7a565b9650506060613fbe8b828c01613c7a565b9550506080613fcf8b828c01613c59565b94505060a0613fe08b828c01613c59565b93505060c0613ff18b828c01613c59565b92505060e089013567ffffffffffffffff81111561400e57600080fd5b61401a8b828c01613cce565b9150509295985092959890939650565b600080600080600080600060e0888a03121561404557600080fd5b60006140518a8a613c7a565b97505060206140628a828b01613c7a565b96505060406140738a828b01613c7a565b95505060606140848a828b01613c7a565b94505060806140958a828b01613c59565b93505060a06140a68a828b01613c59565b92505060c088013567ffffffffffffffff8111156140c357600080fd5b6140cf8a828b01613cce565b91505092959891949750929550565b6000602082840312156140f057600080fd5b6000610d9c8484613c7a565b60006020828403121561410e57600080fd5b6000610d9c8484613d22565b600080600080600080600060a0888a03121561413557600080fd5b60006141418a8a613c7a565b97505060206141528a828b01613c59565b96505060406141638a828b01613c59565b955050606088013567ffffffffffffffff81111561418057600080fd5b61418c8a828b01613c85565b9450945050608088013567ffffffffffffffff8111156141ab57600080fd5b6141b78a828b01613c85565b925092505092959891949750929550565b600080604083850312156141db57600080fd5b60006141e78585613d22565b9250506020613d9985828601613d22565b60008060006060848603121561420d57600080fd5b60006142198686613c7a565b935050602061422a86828701613c7a565b9250506040613de686828701613c59565b6000806000806080858703121561425157600080fd5b600061425d8787613c7a565b945050602061426e87828801613c7a565b935050604061427f87828801613c7a565b925050606061429087828801613c59565b91505092959194509250565b60008060008060008060c087890312156142b557600080fd5b60006142c18989613d22565b96505060206142d289828a01613d22565b95505060406142e389828a01613d22565b94505060606142f489828a01613d22565b935050608061430589828a01613d22565b92505060a061431689828a01613d22565b9150509295509295509295565b600061432f8383614343565b505060200190565b600061432f8383614415565b61434c81614fa3565b82525050565b61434c61435e82614fa3565b615015565b61436c81614f84565b6143768184610b37565b925061438182610c44565b8060005b838110156139a65781516143998782614323565b96506143a483614f94565b925050600101614385565b6143b881614f8a565b6143c28184610b37565b92506143cd82610c44565b8060005b838110156139a65781516143e58782614337565b96506143f083614f94565b9250506001016143d1565b61434c81614fae565b61434c61441082614fae565b615020565b61434c81610c44565b61434c61442a82610c44565b610c44565b61434c61442a82614fb3565b60006144478385610b37565b9350614454838584614fdd565b50500190565b600061446582614f90565b61446f8185614f9a565b935061447f818560208601614fe9565b61448881615041565b9093019392505050565b600061449d82614f90565b6144a78185610b37565b93506144b7818560208601614fe9565b9290920192915050565b61434c81614fd2565b60006144d7600283614f9a565b61031360f41b815260200192915050565b60006144f5600283614f9a565b61313560f01b815260200192915050565b6000614513602683614f9a565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061455b601b83614f9a565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000614594602183614f9a565b7f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006145d7603a83614f9a565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207281527f6563697069656e74206d61792068617665207265766572746564000000000000602082015260400192915050565b6000614636600183614f9a565b603760f81b815260200192915050565b6000614653601d83614f9a565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000815260200192915050565b600061468c600283614f9a565b61333760f01b815260200192915050565b60006146aa600283614f9a565b610c8d60f21b815260200192915050565b60006146c8600283614f9a565b61313160f01b815260200192915050565b60006146e6600283614f9a565b61313360f01b815260200192915050565b6000614704602183614f9a565b7f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000614747600283614f9a565b61189960f11b815260200192915050565b6000614765600283614f9a565b61323560f01b815260200192915050565b6000614783600283614f9a565b61034360f41b815260200192915050565b60006147a1600283614f9a565b61199960f11b815260200192915050565b60006147bf600283614f9a565b61313760f01b815260200192915050565b60006147dd600283614f9a565b61062760f31b815260200192915050565b60006147fb602183614f9a565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061483e600c83614f9a565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b6000614866600283614f9a565b61313960f01b815260200192915050565b6000614884600283614f9a565b61191b60f11b815260200192915050565b60006148a2600b83614f9a565b6a18d85b1b0819985a5b195960aa1b815260200192915050565b60006148c9602783614f9a565b7f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f815266766572666c6f7760c81b602082015260400192915050565b6000614912601483614f9a565b7319985b1b189858dac81b9bdd08185b1b1bddd95960621b815260200192915050565b6000610c2c600083610b37565b600061494f600183614f9a565b603960f81b815260200192915050565b600061496c600c83614f9a565b6b1b9bdb9499595b9d1c985b9d60a21b815260200192915050565b6000614994600283614f9a565b61066760f31b815260200192915050565b60006149b2602483614f9a565b7f5369676e6564536166654d6174683a207375627472616374696f6e206f766572815263666c6f7760e01b602082015260400192915050565b60006149f8600183614f9a565b601b60f91b815260200192915050565b6000614a15600183614f9a565b600760fb1b815260200192915050565b6000614a32602083614f9a565b7f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f815260200192915050565b61434c81614fcc565b6000614a738285614352565b601482019150614a838284614404565b5060010192915050565b6000614a998285614352565b601482019150614aa9828461441e565b5060200192915050565b6000614abf828561442f565b600482019150614aa9828461441e565b6000614adb828661442f565b60048201915061293f82848661443b565b6000610d9c82848661443b565b6000610af38284614492565b6000610c2c82614935565b60208101610c2c8284614343565b60408101614b2c8285614343565b610af36020830184614343565b60608101614b478286614343565b614b546020830185614343565b610d9c6040830184614415565b60c08101614b6f8289614343565b614b7c6020830188614343565b614b896040830187614415565b614b966060830186614415565b614ba36080830185614415565b614bb060a0830184614415565b979650505050505050565b60408101614bc98285614343565b8181036020830152610d9c818461445a565b60408101614be98285614343565b610af36020830184614415565b60208101610c2c82846143fb565b60208101610c2c8284614415565b60a08101614c208288614415565b614c2d6020830187614343565b614c3a6040830186614343565b614c476060830185614415565b614c5460808301846143fb565b9695505050505050565b6101c08101614c6d828a614415565b614c7a6020830189614415565b614c8760408301886143fb565b614c946060830187614415565b614ca16080830186614363565b614caf6101008301856143af565b8181036101a0830152614cc2818461445a565b9998505050505050505050565b60208082528101610af3818461445a565b60208101610c2c82846144c1565b60208082528101610b34816144ca565b60208082528101610b34816144e8565b60208082528101610b3481614506565b60208082528101610b348161454e565b60208082528101610b3481614587565b60208082528101610b34816145ca565b60208082528101610b3481614629565b60208082528101610b3481614646565b60208082528101610b348161467f565b60208082528101610b348161469d565b60208082528101610b34816146bb565b60208082528101610b34816146d9565b60208082528101610b34816146f7565b60208082528101610b348161473a565b60208082528101610b3481614758565b60208082528101610b3481614776565b60208082528101610b3481614794565b60208082528101610b34816147b2565b60208082528101610b34816147d0565b60208082528101610b34816147ee565b60208082528101610b3481614831565b60208082528101610b3481614859565b60208082528101610b3481614877565b60208082528101610b3481614895565b60208082528101610b34816148bc565b60208082528101610b3481614905565b60208082528101610b3481614942565b60208082528101610b348161495f565b60208082528101610b3481614987565b60208082528101610b34816149a5565b60208082528101610b34816149eb565b60208082528101610b3481614a08565b60208082528101610b3481614a25565b60408101614be98285614415565b60608101614f1a8286614415565b614b546020830185614415565b60208101610c2c8284614a5e565b60405181810167ffffffffffffffff81118282101715614f5457600080fd5b604052919050565b600067ffffffffffffffff821115614f7357600080fd5b506020601f91909101601f19160190565b50600490565b50600590565b5190565b60200190565b90815260200190565b6000610b3482614fc0565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b6000610b3482614fa3565b82818337506000910152565b60005b83811015615004578181015183820152602001614fec565b83811115612ed45750506000910152565b6000610b348261502b565b6000610b3482615036565b6000610b3482615051565b6000610b348261504b565b601f01601f191690565b60f81b90565b60601b90565b61506081614fa3565b811461200057600080fd5b61506081614fae565b61506081610c4456fe000000000000000000000000d8ee69652e4e4838f2531732a46d1f7f584f0b7fa365627a7a723158203dda0b32834fdc6842754d00487a5e5871c91908d8fb2da33be7c719c23173346c6578706572696d656e74616cf564736f6c634300051100408be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000b7f72028d9b502dc871c444363a7ac5a52546608
Deployed Bytecode
0x6080604052600436106103765760003560e01c806370a08231116101d1578063995363d311610102578063d65a5021116100a0578063eebc50811161006f578063eebc50811461094e578063ef2b0b391461096e578063f2fde38b14610983578063ffa1ad74146109a357610376565b8063d65a5021146108d9578063d73dd623146108f9578063d759dbeb14610919578063dd62ed3e1461092e57610376565b8063b9fe1a8f116100dc578063b9fe1a8f1461087c578063ba0e43bf1461089c578063c5bf0e9d146108b1578063c91d59fe146108c457610376565b8063995363d3146108275780639dc29fac1461083c578063a9059cbb1461085c57610376565b80638325a1c01161016f5780638f32d59b116101495780638f32d59b146107d55780638f6ede1f146107ea5780638fb807c5146107fd57806395d89b411461081257610376565b80638325a1c014610798578063890a62a0146107ad5780638da5cb5b146107c057610376565b80637e37c08c116101ab5780637e37c08c1461072e5780637ff9b5961461074357806381a6b25014610758578063829b38f41461077857610376565b806370a08231146106e4578063797bf385146107045780637b7933b41461071957610376565b8063313ce567116102ab5780634b57b0be11610249578063612ef80b11610223578063612ef80b14610660578063631a3ef81461067557806366188463146106955780636b40cd40146106b557610376565b80634b57b0be1461060957806354198ce91461062b57806356e07d701461064b57610376565b80633885daf8116102855780633885daf81461059f57806340c10f19146105b2578063420a83e7146105d257806344a4a003146105f457610376565b8063313ce567146105485780633291c11a1461056a578063330691ac1461058a57610376565b806318160ddd1161031857806320f6d07c116102f257806320f6d07c146104de57806323b872dd146104f3578063284e2f56146105135780632ea295fa1461053557610376565b806318160ddd1461049f5780631d0806ae146104b45780631f68f20a146104c957610376565b8063095ea7b311610354578063095ea7b31461041c57806309ec6b6b14610449578063124168981461045e57806314dfe7921461047e57610376565b806304797930146103a457806306b3efd6146103da57806306fdde03146103fa575b34801561038257600080fd5b5060405162461bcd60e51b815260040161039b90614e7e565b60405180910390fd5b3480156103b057600080fd5b506103c46103bf3660046141f8565b6109b8565b6040516103d19190614c04565b60405180910390f35b3480156103e657600080fd5b506103c46103f5366004613d2d565b610afa565b34801561040657600080fd5b5061040f610b3c565b6040516103d19190614ccf565b34801561042857600080fd5b5061043c610437366004613e38565b610bc7565b6040516103d19190614bf6565b34801561045557600080fd5b506103c4610c32565b34801561046a57600080fd5b506103c46104793660046140de565b610c47565b61049161048c36600461402a565b610c72565b6040516103d1929190614efe565b3480156104ab57600080fd5b506103c4610cc0565b3480156104c057600080fd5b506103c4610cc6565b3480156104d557600080fd5b506103c4610ccc565b3480156104ea57600080fd5b506103c4610cd2565b3480156104ff57600080fd5b5061043c61050e366004613da3565b610d69565b34801561051f57600080fd5b5061053361052e366004613df0565b610da4565b005b610491610543366004613f62565b610eea565b34801561055457600080fd5b5061055d610f4c565b6040516103d19190614f27565b34801561057657600080fd5b506103c46105853660046140de565b610f55565b34801561059657600080fd5b506103c4610f67565b6104916105ad366004613f62565b610f6d565b3480156105be57600080fd5b506103c46105cd366004613e38565b6111e5565b3480156105de57600080fd5b506105e7611226565b6040516103d19190614ce0565b34801561060057600080fd5b506103c461123e565b34801561061557600080fd5b5061061e611250565b6040516103d19190614b10565b34801561063757600080fd5b506103c4610646366004613d2d565b611268565b34801561065757600080fd5b506103c4611309565b34801561066c57600080fd5b506103c461130f565b34801561068157600080fd5b506103c46106903660046141f8565b611340565b3480156106a157600080fd5b5061043c6106b0366004613e38565b611495565b3480156106c157600080fd5b506106d56106d036600461423b565b611538565b6040516103d193929190614f0c565b3480156106f057600080fd5b506103c46106ff366004613d2d565b61165c565b34801561071057600080fd5b5061061e611677565b34801561072557600080fd5b506103c461168d565b34801561073a57600080fd5b506103c4611693565b34801561074f57600080fd5b506103c4611699565b34801561076457600080fd5b506103c4610773366004613e38565b6116ed565b34801561078457600080fd5b506103c46107933660046140de565b61179a565b3480156107a457600080fd5b506103c46117df565b6104916107bb366004613e86565b6117eb565b3480156107cc57600080fd5b5061061e611a84565b3480156107e157600080fd5b5061043c611a93565b6103c46107f8366004613d2d565b611ab9565b34801561080957600080fd5b506103c4611aec565b34801561081e57600080fd5b5061040f611b32565b34801561083357600080fd5b5061061e611b8d565b34801561084857600080fd5b506103c4610857366004613e38565b611b9f565b34801561086857600080fd5b5061043c610877366004613e38565b611c13565b34801561088857600080fd5b506103c46108973660046140de565b611c23565b3480156108a857600080fd5b506103c4611c2e565b61040f6108bf36600461411a565b611c34565b3480156108d057600080fd5b506105e7611ecb565b3480156108e557600080fd5b506103c46108f43660046140de565b611edd565b34801561090557600080fd5b5061043c610914366004613e38565b611ef0565b34801561092557600080fd5b506103c4611f81565b34801561093a57600080fd5b506103c4610949366004613d69565b611f87565b34801561095a57600080fd5b506103c4610969366004613d2d565b611fb2565b34801561097a57600080fd5b506103c4611fcd565b34801561098f57600080fd5b5061053361099e366004613d2d565b611fd3565b3480156109af57600080fd5b506103c4612003565b60008315610af35760008051602061507e8339815191526001600160a01b0316631eca6377600f60008560016040516020016109f5929190614a67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546004546001600160a01b03600160601b9091048116908616610a515773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610a53565b855b8860016040518663ffffffff1660e01b8152600401610a76959493929190614c12565b60206040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ac691908101906140fc565b9050610ada81610ad4611aec565b85612008565b9250610ae891506120869050565b811115610af3575060005b9392505050565b6000610b34670de0b6b3a7640000610b28610b13611699565b610b1c8661165c565b9063ffffffff6120be16565b9063ffffffff6120f816565b90505b919050565b6002805460408051602060018416156101000260001901909316849004601f81018490048402820184019092528181529291830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b505050505081565b3360008181526012602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610c20908690614c04565b60405180910390a35060015b92915050565b6000610c41610479600061213a565b90505b90565b600080610c52610cd2565b90508015610c6c57610c64818461216c565b915050610b37565b50919050565b600080600160005414610c975760405162461bcd60e51b815260040161039b90614e9e565b6002600055610cab8989898989898961223d565b6001600055909a909950975050505050505050565b60135490565b600e5481565b60055481565b6004805460405163250f447f60e11b815260009260008051602061507e83398151915292634a1e88fe92610d19923092600160601b90046001600160a01b03169101614b1e565b60206040518083038186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c4191908101906140fc565b6001600160a01b0383166000908152601260209081526040808320338452909152812054610d9c9085908590859061239f565b949350505050565b610dac611a84565b6001600160a01b0316336001600160a01b031614610e3d577f7ad06df6a0af6bd602d90db766e0d5f253b45187c3717a0f9026ea8b10ff0d4b547f34b31cff1dbd8374124bd4505521fc29cab0f9554a5386ba7d784a4e611c7e3154336001600160a01b038316148015610e315750806001600160a01b0316846001600160a01b0316145b610e3a57600080fd5b50505b601480546001600160a01b038481166001600160a01b03198316179092556040519116906000903090610e71908590614af9565b6000604051808303816000865af19150503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b50506040519091503d90816000823e82610ecb578181fd5b601480546001600160a01b0319166001600160a01b0386161790558181f35b600080600160005414610f0f5760405162461bcd60e51b815260040161039b90614e9e565b6002600081905550610f368a8a8a8a8a8a8a60405180602001604052806000815250612540565b6001600055909b909a5098505050505050505050565b60045460ff1681565b600f6020526000908152604090205481565b60065481565b600080600160005414610f925760405162461bcd60e51b815260040161039b90614e9e565b6002600055836001600160a01b038116610fbd57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a0823190610fee908490600401614b10565b60206040518083038186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061103e91908101906140fc565b156111bc5760005a90506110578c8c8c8c8c8c8b61223d565b9350935061a3db61106782612741565b61374a018161107257fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c611415611129576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b936906110d1908490600401614c04565b602060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061112391908101906140fc565b506111b6565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906111629085908590600401614bdb565b602060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111b491908101906140fc565b505b506111d0565b6111cb8b8b8b8b8b8b8a61223d565b925092505b50600160005590999098509650505050505050565b60006001600054146112095760405162461bcd60e51b815260040161039b90614e9e565b60026000556112188383612756565b90505b600160005592915050565b7355eb3dd3f738cfdda986b8eff3fa784477552c6181565b6000610c4161124b610cd2565b6128b2565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600080827f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb660001b6040516020016112a1929190614a8d565b604051602081830303815290604052805190602001209050610af38160116000866001600160a01b03166001600160a01b03168152602001908152602001600020546112eb611699565b6001600160a01b0387166000908152601060205260409020546128e5565b600a5481565b60008061131c600061213a565b90506000611328610cd2565b90508082111561133b5790039050610c44565b505090565b60008315610af357600061135c85611356611aec565b86612008565b92505050611368612086565b811161148d57611485600a60008051602061507e8339815191526001600160a01b03166368c1a115600f60008860016040516020016113a8929190614a67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546004546001600160a01b03600160601b90910481169089166114045773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611406565b885b8760016040518663ffffffff1660e01b8152600401611429959493929190614c12565b60206040518083038186803b15801561144157600080fd5b505afa158015611455573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061147991908101906140fc565b9063ffffffff61294816565b915050610af3565b509392505050565b3360009081526012602090815260408083206001600160a01b03861684529091528120548083106114c8575060006114cc565b8290035b3360008181526012602090815260408083206001600160a01b03891680855292529182902084905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611526908590614c04565b60405180910390a35060019392505050565b600080806001600160a01b0384166115625773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc293505b600061156f85878961296d565b905061157b8882612ab0565b9094509150611588612086565b84111561159f575060009250829150819050611652565b6115af878563ffffffff61294816565b6004805460405163d67f707760e01b815292995060008051602061507e8339815191529263d67f7077926115fe92600160601b90046001600160a01b0316918a918d918d918a918d9101614b61565b60206040518083038186803b15801561161657600080fd5b505afa15801561162a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061164e91908101906140fc565b9250505b9450945094915050565b6001600160a01b031660009081526011602052604090205490565b600454600160601b90046001600160a01b031681565b600d5481565b60085481565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b0316146116d6576116d2612b41565b9150505b6116e76116e28261213a565b612c17565b91505090565b60006001600054146117115760405162461bcd60e51b815260040161039b90614e9e565b600260005561171f82612c46565b9050801561121b57604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9061175e908490600401614c04565b600060405180830381600087803b15801561177857600080fd5b505af115801561178c573d6000803e3d6000fd5b5050505061121b8382612d39565b6000806117b76f4b3b4ca85a86c47a098a224000000000846120f8565b9050610af36117d368056bc75e2d631000006224ea0084612dda565b610b2883610b1c61130f565b6000610c416000612e1b565b6000806001600054146118105760405162461bcd60e51b815260040161039b90614e9e565b6002600055836001600160a01b03811661183b57507355eb3dd3f738cfdda986b8eff3fa784477552c615b6040516370a0823160e01b81526d4946c0e9f43f4dee607b0ef1fa1c906370a082319061186c908490600401614b10565b60206040518083038186803b15801561188457600080fd5b505afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118bc91908101906140fc565b15611a4a5760005a90506118e58d8d8d8d8d8d8d60405180602001604052806000815250612540565b9350935061a3db6118f582612741565b61374a018161190057fe5b0490506001600160a01b0382167355eb3dd3f738cfdda986b8eff3fa784477552c6114156119b7576040516331b35c9b60e11b81527355eb3dd3f738cfdda986b8eff3fa784477552c6190636366b9369061195f908490600401614c04565b602060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b191908101906140fc565b50611a44565b60405163079d229f60e01b81527355eb3dd3f738cfdda986b8eff3fa784477552c619063079d229f906119f09085908590600401614bdb565b602060405180830381600087803b158015611a0a57600080fd5b505af1158015611a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a4291908101906140fc565b505b50611a6e565b611a698c8c8c8c8c8c8c60405180602001604052806000815250612540565b925092505b506001600055909a909950975050505050505050565b6001546001600160a01b031690565b6001546000906001600160a01b0316611aaa612e76565b6001600160a01b031614905090565b6000600160005414611add5760405162461bcd60e51b815260040161039b90614e9e565b600260005561121b8234612756565b600080426001600160581b0316600460019054906101000a90046001600160581b03166001600160581b031614611b2957611b25612b41565b9150505b6116e78161213a565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b60008051602061507e83398151915281565b6000600160005414611bc35760405162461bcd60e51b815260040161039b90614e9e565b6002600055611bd182612c46565b9050801561121b5761121b6004600c9054906101000a90046001600160a01b03168483604051806040016040528060018152602001603560f81b815250612e7a565b6000610af333848460001961239f565b6000610b3482612e1b565b60095481565b6060600160005414611c585760405162461bcd60e51b815260040161039b90614e9e565b60026000908155356001600160e01b031916611c7381612eda565b15611c905760405162461bcd60e51b815260040161039b90614e2e565b611c98612f33565b88611cb55760405162461bcd60e51b815260040161039b90614eae565b6000611cc7473463ffffffff612fed16565b90506000611cde611cd6610cd2565b611479612086565b905080600c81905550611d226004600c9054906101000a90046001600160a01b03168b8d60405180604001604052806002815260200161333960f01b815250612e7a565b606087611d685786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350611da392505050565b8888604051611d78929190614aec565b604051908190038120611d919189908990602001614acf565b60405160208183030381529060405290505b60006060720f400e6818158d541c3ebe45fe3aa0d47372ff6001600160a01b03163463de064e0d8e86604051602401611ddd929190614bbb565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611e169190614af9565b60006040518083038185875af1925050503d8060008114611e53576040519150601f19603f3d011682016040523d82523d6000602084013e611e58565b606091505b509150915081611e7a5760405162461bcd60e51b815260040161039b90614e5e565b6000600c55478511801590611e99575083611e96611cd6610cd2565b10155b611eb55760405162461bcd60e51b815260040161039b90614dde565b60016000559d9c50505050505050505050505050565b6d4946c0e9f43f4dee607b0ef1fa1c81565b6000610b3461047983611479600061213a565b3360009081526012602090815260408083206001600160a01b03861684529091528120548190611f26908463ffffffff61294816565b3360008181526012602090815260408083206001600160a01b038a168085529252918290208490559051929350917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611526908590614c04565b60075481565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b6001600160a01b031660009081526010602052604090205490565b600b5481565b611fdb611a93565b611ff75760405162461bcd60e51b815260040161039b90614e2e565b6120008161302f565b50565b600681565b600080600061201786866130b1565b9250612069612051670de0b6b3a764000061204c6b0a3098c68eb9427db8000000610b2883610b1c8a8c63ffffffff6120be16565b612fed565b610b2888670de0b6b3a764000063ffffffff6120be16565b905061207b818763ffffffff612fed16565b915093509350939050565b600480546040516370a0823160e01b8152600092600160601b9092046001600160a01b0316916370a0823191610d1991309101614b10565b6000826120cd57506000610c2c565b828202828482816120da57fe5b0414610af35760405162461bcd60e51b815260040161039b90614e1e565b6000610af383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131c7565b6000601354600014610b3757600c548061215c57612159611cd6610cd2565b90505b610c64818463ffffffff61294816565b6000821580159061217d5750828210155b15610c2c5761223668056bc75e2d631000008002610b2861222068056bc75e2d6310000060008051602061507e8339815191526001600160a01b0316634699f8466040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e857600080fd5b505afa1580156121fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061204c91908101906140fc565b610b1c61222d88886131fe565b610b1c896128b2565b9050610c2c565b6000806000356001600160e01b03191661225681612eda565b156122735760405162461bcd60e51b815260040161039b90614e2e565b61227b612f33565b8915806122905750336001600160a01b038616145b6122ac5760405162461bcd60e51b815260040161039b90614d9e565b6001600160a01b0386166122d25773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc295505b6004546001600160a01b03878116600160601b9092041614156123075760405162461bcd60e51b815260040161039b90614d8e565b600061231487898b61296d565b9050806123335760405162461bcd60e51b815260040161039b90614dbe565b61233b613c1d565b612343613c3b565b3082526001600160a01b038816602083018190526040830152606081018b9052608081018a90526123748c84612ab0565b8252602082015261238b8d60008e8c86868d613230565b955095505050505097509795505050505050565b600060001982146123fb576040805180820190915260028152610c4d60f21b60208201526123d6908390859063ffffffff61343a16565b6001600160a01b03861660009081526012602090815260408083203384529091529020555b6001600160a01b0384166124215760405162461bcd60e51b815260040161039b90614cfe565b6001600160a01b03851660009081526011602090815260408083205481518083019092526002825261189b60f11b9282019290925290919061246c908390879063ffffffff61343a16565b6001600160a01b038089166000908152601160205260408082208490559189168152908120549192506124a5828863ffffffff61294816565b6001600160a01b03891660009081526011602052604081208290559091506124cb611699565b90506124d98a868684613466565b6124e589848484613466565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516125289190614c04565b60405180910390a35060019998505050505050505050565b6000806000356001600160e01b03191661255981612eda565b156125765760405162461bcd60e51b815260040161039b90614e2e565b61257e612f33565b8961259b5760405162461bcd60e51b815260040161039b90614ece565b3415806125a757508734145b6125c35760405162461bcd60e51b815260040161039b90614d4e565b871515806125d057508a15155b6125ec5760405162461bcd60e51b815260040161039b90614ede565b6001600160a01b03871615158061260257503415155b8061260c57508a15155b6126285760405162461bcd60e51b815260040161039b90614e8e565b8a158061263d5750336001600160a01b038716145b6126595760405162461bcd60e51b815260040161039b90614d9e565b6001600160a01b03871661267f5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc296505b6004546001600160a01b03888116600160601b9092041614156126b45760405162461bcd60e51b815260040161039b90614cee565b6126bc613c1d565b6126c4613c3b565b3082526001600160a01b03888116602084015287166040830152608081018a90526126f98c6126f3600061213a565b8d612008565b60208085019190915260408085019290925291835280519182019052600080825261272d918f918f918d9087908790613230565b945094505050509850989650505050505050565b6000601036025a836152080103019050919050565b6000612760612f33565b8161277d5760405162461bcd60e51b815260040161039b90614dfe565b600061278c6116e2600061213a565b90506127aa81610b2885670de0b6b3a764000063ffffffff6120be16565b9150346127f2576127ed6004600c9054906101000a90046001600160a01b031633308660405180604001604052806002815260200161062760f31b81525061351c565b61287a565b8234146128115760405162461bcd60e51b815260040161039b90614e0e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050505b6001600160a01b0384166000908152601160205260409020546128ab9085906128a582868887613547565b84613466565b5092915050565b60008115610b375760006128c4612b41565b509050610c6483610b28836907baab4146b63dd0000063ffffffff6120be16565b6000816128f457506000610d9c565b50835461293f81612933670de0b6b3a76400006129278861291b898963ffffffff61366816565b9063ffffffff6136ae16565b9063ffffffff61371916565b9063ffffffff61377d16565b95945050505050565b600082820183811015610af35760405162461bcd60e51b815260040161039b90614d1e565b808215610af35760008060008051602061507e8339815191526001600160a01b03166378d849ed6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129be57600080fd5b505afa1580156129d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129f69190810190613d4b565b60048054604051630a7549df60e21b81526001600160a01b03938416936329d5277c93612a31938c93600160601b9091049092169101614b1e565b604080518083038186803b158015612a4857600080fd5b505afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a8091908101906141c8565b9150915081600014612aa757612aa48361147983610b28898763ffffffff6120be16565b92505b50509392505050565b60008080612ace6f4b3b4ca85a86c47a098a224000000000866120f8565b9050612aff612af082610b288768056bc75e2d6310000063ffffffff6120be16565b612afa600061213a565b6130b1565b9150612b3781610b28612b16856224ea0086612dda565b610b2888701d6329f1c35ca4bfabb9f561000000000063ffffffff6120be16565b9250509250929050565b60048054604051630d1979fb60e41b81526000928392839260008051602061507e8339815191529263d1979fb092612b8d923092600160601b9092046001600160a01b03169101614b1e565b60c06040518083038186803b158015612ba557600080fd5b505afa158015612bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bdd919081019061429c565b5091965094509250612c10915068056bc75e2d631000009050610b28612c038285612fed565b859063ffffffff6120be16565b9150509091565b60135460009080612c2a57600e54610af3565b610af381610b2885670de0b6b3a764000063ffffffff6120be16565b6000612c50612f33565b81612c6d5760405162461bcd60e51b815260040161039b90614e3e565b612c763361165c565b821115612caa576000198214612c9e5760405162461bcd60e51b815260040161039b90614dee565b612ca73361165c565b91505b6000612cb96116e2600061213a565b90506000612cd9670de0b6b3a7640000610b28868563ffffffff6120be16565b90506000612ce5612086565b905081935080841115612d0a5760405162461bcd60e51b815260040161039b90614d6e565b33600081815260116020526040902054612d319190612d2b828989896137c3565b86613466565b505050919050565b80471015612d595760405162461bcd60e51b815260040161039b90614d5e565b6000826001600160a01b031682604051612d7290614b05565b60006040518083038185875af1925050503d8060008114612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b5050905080612dd55760405162461bcd60e51b815260040161039b90614d3e565b505050565b600082612df05768056bc75e2d63100000610d9c565b610d9c68056bc75e2d6310000061147984610b286301e133808189610b1c8c8863ffffffff6120be16565b6000808215612e6957600454426001600160581b039081166101009092041614612e4b57612e47612b41565b9150505b6000612e5982611479612086565b905080841115612e67578093505b505b610af383612afa8361213a565b3390565b604051612ed490859063a9059cbb60e01b90612e9c9087908790602401614bdb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152836138e8565b50505050565b600080827fa7143c84d793a15503da6f19bf9119a2dac94448ca45d77c8bf08f57b2e9104760001b604051602001612f13929190614ab3565b60408051601f198184030181529190528051602090910120549392505050565b60045442906001600160581b0380831661010090920416146120005760048054604051630740ff7d60e51b815260008051602061507e8339815191529263e81fefa092612f9292600160601b9091046001600160a01b03169101614b10565b600060405180830381600087803b158015612fac57600080fd5b505af1158015612fc0573d6000803e3d6000fd5b5050600480546001600160581b038516610100026bffffffffffffffffffffff0019909116179055505050565b6000610af383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061343a565b6001600160a01b0381166130555760405162461bcd60e51b815260040161039b90614d0e565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000806130c96130c385611479610cd2565b846131fe565b600554600654600954600a54600b54949550600094859493929190828810156130f0578297505b8188111561316357968190039668056bc75e2d6310000082900380891115613116578098505b61313768056bc75e2d63100000610b2885610b1c898b63ffffffff61294816565b965061315b8761147983610b2861314e878d612fed565b8e9063ffffffff6120be16565b9950506131b9565b6131848561147968056bc75e2d63100000610b288c8963ffffffff6120be16565b9850939550859361319b848663ffffffff61294816565b9550868910156131ad578698506131b9565b858911156131b9578598505b505050505050505092915050565b600081836131e85760405162461bcd60e51b815260040161039b9190614ccf565b5060008385816131f457fe5b0495945050505050565b6000821580159061320e57508115155b15610c2c5761223682610b288568056bc75e2d6310000063ffffffff6120be16565b60008061323b612086565b60208501511180159061325a575060208501516001600160a01b031615155b6132765760405162461bcd60e51b815260040161039b90614d7e565b60408501516001600160a01b031661329c5760208501516001600160a01b031660408601525b60006132aa8787878c6139ae565b602086015160608701519192506132c19190612948565b606086015288156132e15760608501516132db908a612fed565b60608601525b6000896132ef5760006132f2565b60015b90506000600f60008a8460405160200161330d929190614a67565b6040516020818303038152906040528051906020012060001c81526020019081526020016000205490508960001461335c576133596f4b3b4ca85a86c47a098a2240000000008b6120f8565b99505b60008051602061507e8339815191526001600160a01b031663585314cf84838f868f8e8e8e6040518963ffffffff1660e01b81526004016133a39796959493929190614c5e565b60408051808303818588803b1580156133bb57600080fd5b505af11580156133cf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506133f491908101906141c8565b60808901526020880181905261341c5760405162461bcd60e51b815260040161039b90614dce565b50505060208401516080909401519399939850929650505050505050565b6000818484111561345e5760405162461bcd60e51b815260040161039b9190614ccf565b505050900390565b60405160009061349c9086907f37aa2b7d583612f016e4a4de4292cb015139b3d7762663d06a53964912ea2fb690602001614a8d565b604051602081830303815290604052805190602001209050600083600014156134c857600092506134f9565b84156134f9576001600160a01b0386166000908152601060205260409020546134f6908390879086906128e5565b90505b90556001600160a01b039093166000908152601060205260409020929092555050565b6040516135409086906323b872dd60e01b90612e9c90889088908890602401614b39565b5050505050565b60006001600160a01b03851661356f5760405162461bcd60e51b815260040161039b90614cfe565b6001600160a01b038516600090815260116020526040812054613598908663ffffffff61294816565b6001600160a01b03871660009081526011602052604090208190556013549091506135c9908663ffffffff61294816565b6013556040516001600160a01b038716907fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9061360b90889088908890614f0c565b60405180910390a2856001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516136579190614c04565b60405180910390a395945050505050565b600081830381831280159061367d5750838113155b80613692575060008312801561369257508381135b610af35760405162461bcd60e51b815260040161039b90614ebe565b6000826136bd57506000610c2c565b826000191480156136d15750600160ff1b82145b156136ee5760405162461bcd60e51b815260040161039b90614e6e565b828202828482816136fb57fe5b0514610af35760405162461bcd60e51b815260040161039b90614e6e565b6000816137385760405162461bcd60e51b815260040161039b90614eee565b8160001914801561374c5750600160ff1b83145b156137695760405162461bcd60e51b815260040161039b90614dae565b600082848161377457fe5b05949350505050565b60008282018183128015906137925750838112155b806137a757506000831280156137a757508381125b610af35760405162461bcd60e51b815260040161039b90614d2e565b6040805180820182526002815261189b60f11b6020808301919091526001600160a01b0387166000908152601190915291822054829161380b9190879063ffffffff61343a16565b9050600a811161382c57613825858263ffffffff61294816565b9450600090505b6001600160a01b038616600090815260116020526040902081905560135461385a908663ffffffff612fed16565b6013556040516001600160a01b038716907f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449061389c90889088908890614f0c565b60405180910390a260006001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516136579190614c04565b60006060846001600160a01b0316846040516139049190614af9565b6000604051808303816000865af19150503d8060008114613941576040519150601f19603f3d011682016040523d82523d6000602084013e613946565b606091505b509150915081839061396b5760405162461bcd60e51b815260040161039b9190614ccf565b5080511561354057808060200190516139879190810190613e68565b83906139a65760405162461bcd60e51b815260040161039b9190614ccf565b505050505050565b604083015160208301516060840151608085015160009373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc293849391929091906001600160a01b038b16851415613a0b5760405162461bcd60e51b815260040161039b90614e4e565b3496508715613abf57604051632e1a7d4d60e01b81526001600160a01b03871690632e1a7d4d90613a40908b90600401614c04565b600060405180830381600087803b158015613a5a57600080fd5b505af1158015613a6e573d6000803e3d6000fd5b50505050613a7c8489612d39565b87831115613aba57613aba8560008051602061507e8339815191528a860360405180604001604052806002815260200161323760f01b815250612e7a565b613af3565b613af38560008051602061507e8339815191528560405180604001604052806002815260200161323760f01b815250612e7a565b8015613b2e57613b2e8b3360008051602061507e8339815191528460405180604001604052806002815260200161064760f31b81525061351c565b8115613c0f578615801590613b435750818710155b15613bda57856001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015613b8357600080fd5b505af1158015613b97573d6000803e3d6000fd5b5050505050613bd08560008051602061507e8339815191528460405180604001604052806002815260200161323960f01b815250612e7a565b8187039650613c0f565b613c0f853360008051602061507e8339815191528560405180604001604052806002815260200161323960f01b81525061351c565b505050505050949350505050565b60405180608001604052806004906020820280388339509192915050565b6040518060a001604052806005906020820280388339509192915050565b8035610c2c81615057565b8051610c2c81615057565b8051610c2c8161506b565b8035610c2c81615074565b60008083601f840112613c9757600080fd5b50813567ffffffffffffffff811115613caf57600080fd5b602083019150836001820283011115613cc757600080fd5b9250929050565b600082601f830112613cdf57600080fd5b8135613cf2613ced82614f5c565b614f35565b91508082526020830160208301858383011115613d0e57600080fd5b613d19838284614fdd565b50505092915050565b8051610c2c81615074565b600060208284031215613d3f57600080fd5b6000610d9c8484613c59565b600060208284031215613d5d57600080fd5b6000610d9c8484613c64565b60008060408385031215613d7c57600080fd5b6000613d888585613c59565b9250506020613d9985828601613c59565b9150509250929050565b600080600060608486031215613db857600080fd5b6000613dc48686613c59565b9350506020613dd586828701613c59565b9250506040613de686828701613c7a565b9150509250925092565b60008060408385031215613e0357600080fd5b6000613e0f8585613c59565b925050602083013567ffffffffffffffff811115613e2c57600080fd5b613d9985828601613cce565b60008060408385031215613e4b57600080fd5b6000613e578585613c59565b9250506020613d9985828601613c7a565b600060208284031215613e7a57600080fd5b6000610d9c8484613c6f565b60008060008060008060008060006101208a8c031215613ea557600080fd5b6000613eb18c8c613c7a565b9950506020613ec28c828d01613c7a565b9850506040613ed38c828d01613c7a565b9750506060613ee48c828d01613c7a565b9650506080613ef58c828d01613c59565b95505060a0613f068c828d01613c59565b94505060c0613f178c828d01613c59565b93505060e0613f288c828d01613c59565b9250506101008a013567ffffffffffffffff811115613f4657600080fd5b613f528c828d01613cce565b9150509295985092959850929598565b600080600080600080600080610100898b031215613f7f57600080fd5b6000613f8b8b8b613c7a565b9850506020613f9c8b828c01613c7a565b9750506040613fad8b828c01613c7a565b9650506060613fbe8b828c01613c7a565b9550506080613fcf8b828c01613c59565b94505060a0613fe08b828c01613c59565b93505060c0613ff18b828c01613c59565b92505060e089013567ffffffffffffffff81111561400e57600080fd5b61401a8b828c01613cce565b9150509295985092959890939650565b600080600080600080600060e0888a03121561404557600080fd5b60006140518a8a613c7a565b97505060206140628a828b01613c7a565b96505060406140738a828b01613c7a565b95505060606140848a828b01613c7a565b94505060806140958a828b01613c59565b93505060a06140a68a828b01613c59565b92505060c088013567ffffffffffffffff8111156140c357600080fd5b6140cf8a828b01613cce565b91505092959891949750929550565b6000602082840312156140f057600080fd5b6000610d9c8484613c7a565b60006020828403121561410e57600080fd5b6000610d9c8484613d22565b600080600080600080600060a0888a03121561413557600080fd5b60006141418a8a613c7a565b97505060206141528a828b01613c59565b96505060406141638a828b01613c59565b955050606088013567ffffffffffffffff81111561418057600080fd5b61418c8a828b01613c85565b9450945050608088013567ffffffffffffffff8111156141ab57600080fd5b6141b78a828b01613c85565b925092505092959891949750929550565b600080604083850312156141db57600080fd5b60006141e78585613d22565b9250506020613d9985828601613d22565b60008060006060848603121561420d57600080fd5b60006142198686613c7a565b935050602061422a86828701613c7a565b9250506040613de686828701613c59565b6000806000806080858703121561425157600080fd5b600061425d8787613c7a565b945050602061426e87828801613c7a565b935050604061427f87828801613c7a565b925050606061429087828801613c59565b91505092959194509250565b60008060008060008060c087890312156142b557600080fd5b60006142c18989613d22565b96505060206142d289828a01613d22565b95505060406142e389828a01613d22565b94505060606142f489828a01613d22565b935050608061430589828a01613d22565b92505060a061431689828a01613d22565b9150509295509295509295565b600061432f8383614343565b505060200190565b600061432f8383614415565b61434c81614fa3565b82525050565b61434c61435e82614fa3565b615015565b61436c81614f84565b6143768184610b37565b925061438182610c44565b8060005b838110156139a65781516143998782614323565b96506143a483614f94565b925050600101614385565b6143b881614f8a565b6143c28184610b37565b92506143cd82610c44565b8060005b838110156139a65781516143e58782614337565b96506143f083614f94565b9250506001016143d1565b61434c81614fae565b61434c61441082614fae565b615020565b61434c81610c44565b61434c61442a82610c44565b610c44565b61434c61442a82614fb3565b60006144478385610b37565b9350614454838584614fdd565b50500190565b600061446582614f90565b61446f8185614f9a565b935061447f818560208601614fe9565b61448881615041565b9093019392505050565b600061449d82614f90565b6144a78185610b37565b93506144b7818560208601614fe9565b9290920192915050565b61434c81614fd2565b60006144d7600283614f9a565b61031360f41b815260200192915050565b60006144f5600283614f9a565b61313560f01b815260200192915050565b6000614513602683614f9a565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061455b601b83614f9a565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000614594602183614f9a565b7f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006145d7603a83614f9a565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207281527f6563697069656e74206d61792068617665207265766572746564000000000000602082015260400192915050565b6000614636600183614f9a565b603760f81b815260200192915050565b6000614653601d83614f9a565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000815260200192915050565b600061468c600283614f9a565b61333760f01b815260200192915050565b60006146aa600283614f9a565b610c8d60f21b815260200192915050565b60006146c8600283614f9a565b61313160f01b815260200192915050565b60006146e6600283614f9a565b61313360f01b815260200192915050565b6000614704602183614f9a565b7f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000614747600283614f9a565b61189960f11b815260200192915050565b6000614765600283614f9a565b61323560f01b815260200192915050565b6000614783600283614f9a565b61034360f41b815260200192915050565b60006147a1600283614f9a565b61199960f11b815260200192915050565b60006147bf600283614f9a565b61313760f01b815260200192915050565b60006147dd600283614f9a565b61062760f31b815260200192915050565b60006147fb602183614f9a565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061483e600c83614f9a565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b6000614866600283614f9a565b61313960f01b815260200192915050565b6000614884600283614f9a565b61191b60f11b815260200192915050565b60006148a2600b83614f9a565b6a18d85b1b0819985a5b195960aa1b815260200192915050565b60006148c9602783614f9a565b7f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f815266766572666c6f7760c81b602082015260400192915050565b6000614912601483614f9a565b7319985b1b189858dac81b9bdd08185b1b1bddd95960621b815260200192915050565b6000610c2c600083610b37565b600061494f600183614f9a565b603960f81b815260200192915050565b600061496c600c83614f9a565b6b1b9bdb9499595b9d1c985b9d60a21b815260200192915050565b6000614994600283614f9a565b61066760f31b815260200192915050565b60006149b2602483614f9a565b7f5369676e6564536166654d6174683a207375627472616374696f6e206f766572815263666c6f7760e01b602082015260400192915050565b60006149f8600183614f9a565b601b60f91b815260200192915050565b6000614a15600183614f9a565b600760fb1b815260200192915050565b6000614a32602083614f9a565b7f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f815260200192915050565b61434c81614fcc565b6000614a738285614352565b601482019150614a838284614404565b5060010192915050565b6000614a998285614352565b601482019150614aa9828461441e565b5060200192915050565b6000614abf828561442f565b600482019150614aa9828461441e565b6000614adb828661442f565b60048201915061293f82848661443b565b6000610d9c82848661443b565b6000610af38284614492565b6000610c2c82614935565b60208101610c2c8284614343565b60408101614b2c8285614343565b610af36020830184614343565b60608101614b478286614343565b614b546020830185614343565b610d9c6040830184614415565b60c08101614b6f8289614343565b614b7c6020830188614343565b614b896040830187614415565b614b966060830186614415565b614ba36080830185614415565b614bb060a0830184614415565b979650505050505050565b60408101614bc98285614343565b8181036020830152610d9c818461445a565b60408101614be98285614343565b610af36020830184614415565b60208101610c2c82846143fb565b60208101610c2c8284614415565b60a08101614c208288614415565b614c2d6020830187614343565b614c3a6040830186614343565b614c476060830185614415565b614c5460808301846143fb565b9695505050505050565b6101c08101614c6d828a614415565b614c7a6020830189614415565b614c8760408301886143fb565b614c946060830187614415565b614ca16080830186614363565b614caf6101008301856143af565b8181036101a0830152614cc2818461445a565b9998505050505050505050565b60208082528101610af3818461445a565b60208101610c2c82846144c1565b60208082528101610b34816144ca565b60208082528101610b34816144e8565b60208082528101610b3481614506565b60208082528101610b348161454e565b60208082528101610b3481614587565b60208082528101610b34816145ca565b60208082528101610b3481614629565b60208082528101610b3481614646565b60208082528101610b348161467f565b60208082528101610b348161469d565b60208082528101610b34816146bb565b60208082528101610b34816146d9565b60208082528101610b34816146f7565b60208082528101610b348161473a565b60208082528101610b3481614758565b60208082528101610b3481614776565b60208082528101610b3481614794565b60208082528101610b34816147b2565b60208082528101610b34816147d0565b60208082528101610b34816147ee565b60208082528101610b3481614831565b60208082528101610b3481614859565b60208082528101610b3481614877565b60208082528101610b3481614895565b60208082528101610b34816148bc565b60208082528101610b3481614905565b60208082528101610b3481614942565b60208082528101610b348161495f565b60208082528101610b3481614987565b60208082528101610b34816149a5565b60208082528101610b34816149eb565b60208082528101610b3481614a08565b60208082528101610b3481614a25565b60408101614be98285614415565b60608101614f1a8286614415565b614b546020830185614415565b60208101610c2c8284614a5e565b60405181810167ffffffffffffffff81118282101715614f5457600080fd5b604052919050565b600067ffffffffffffffff821115614f7357600080fd5b506020601f91909101601f19160190565b50600490565b50600590565b5190565b60200190565b90815260200190565b6000610b3482614fc0565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b6000610b3482614fa3565b82818337506000910152565b60005b83811015615004578181015183820152602001614fec565b83811115612ed45750506000910152565b6000610b348261502b565b6000610b3482615036565b6000610b3482615051565b6000610b348261504b565b601f01601f191690565b60f81b90565b60601b90565b61506081614fa3565b811461200057600080fd5b61506081614fae565b61506081610c4456fe000000000000000000000000d8ee69652e4e4838f2531732a46d1f7f584f0b7fa365627a7a723158203dda0b32834fdc6842754d00487a5e5871c91908d8fb2da33be7c719c23173346c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b7f72028d9b502dc871c444363a7ac5a52546608
-----Decoded View---------------
Arg [0] : _newOwner (address): 0xB7F72028D9b502Dc871C444363a7aC5A52546608
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b7f72028d9b502dc871c444363a7ac5a52546608
Deployed Bytecode Sourcemap
67960:3046:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67960:3046:0;28584:30;;-1:-1:-1;;;28584:30:0;;;;;;;;;;;;;;;;44775:1083;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44775:1083:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;42202:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42202:220:0;;;;;;;;:::i;22809:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22809:18:0;;;:::i;:::-;;;;;;;;24964:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24964:248:0;;;;;;;;:::i;:::-;;;;;;;;40335:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40335:163:0;;;:::i;40729:345::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40729:345:0;;;;;;;;:::i;33456:716::-;;;;;;;;;:::i;:::-;;;;;;;;;24395:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24395:123:0;;;:::i;23355:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23355:27:0;;;:::i;23026:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23026:23:0;;;:::i;41082:229::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41082:229:0;;;:::i;35477:442::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35477:442:0;;;;;;;;:::i;66966:987::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;66966:987:0;;;;;;;;:::i;:::-;;31114:970;;;;;;;;;:::i;22861:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22861:21:0;;;:::i;:::-;;;;;;;;23391:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23391:49:0;;;;;;;;:::i;23056:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23056:29:0;;;:::i;34323:877::-;;;;;;;;;:::i;28660:258::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28660:258:0;;;;;;;;:::i;20921:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20921:107:0;;;:::i;:::-;;;;;;;;39640:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39640:163:0;;;:::i;27826:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27826:78:0;;;:::i;:::-;;;;;;;;37881:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37881:367:0;;;;;;;;:::i;23207:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23207:24:0;;;:::i;39331:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39331:301:0;;;:::i;43609:1158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43609:1158:0;;;;;;;;:::i;25586:476::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25586:476:0;;;;;;;;:::i;42430:1171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42430:1171:0;;;;;;;;:::i;:::-;;;;;;;;;;24526:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24526:149:0;;;;;;;;:::i;22986:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22986:31:0;;;:::i;23317:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23317:31:0;;;:::i;23129:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23129:36:0;;;:::i;38822:322::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38822:322:0;;;:::i;68391:464::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;68391:464:0;;;;;;;;:::i;41633:506::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41633:506:0;;;;;;;;:::i;39905:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39905:144:0;;;:::i;32174:1131::-;;;;;;;;;:::i;16374:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16374:79:0;;;:::i;16720:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16720:94:0;;;:::i;68138:245::-;;;;;;;;;:::i;41319:306::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41319:306:0;;;:::i;22834:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22834:20:0;;;:::i;27739:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27739:80:0;;;:::i;28926:366::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28926:366:0;;;;;;;;:::i;35208:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35208:261:0;;;;;;;;:::i;40057:189::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40057:189:0;;;;;;;;:::i;23174:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23174:26:0;;;:::i;29300:1724::-;;;;;;;;;:::i;20810:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20810:104:0;;;:::i;40506:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40506:215:0;;;;;;;;:::i;25220:358::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25220:358:0;;;;;;;;:::i;23092:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23092:30:0;;;:::i;24683:185::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24683:185:0;;;;;;;;:::i;39152:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39152:171:0;;;;;;;;:::i;23238:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23238:27:0;;;:::i;16969:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16969:109:0;;;;;;;;:::i;27602:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27602:35:0;;;:::i;44775:1083::-;45028:20;45070:18;;45066:785;;-1:-1:-1;;;;;;;;;;;;;;;;45120:49:0;;45188:13;:142;45259:22;45304:4;45220:107;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;45220:107:0;;;45210:118;;49:4:-1;45210:118:0;;;;45188:142;;;;;;;;;;45202:127;45188:142;;45349:16;;-1:-1:-1;;;;;;;;45349:16:0;;;;;;45384:36;;:73;;27862:42;45384:73;;;45423:22;45384:73;45476:13;45508:4;45120:423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45120:423:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45120:423:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45120:423:0;;;;;;;;;45105:438;;45579:152;45629:12;45660:18;:16;:18::i;:::-;45697:19;45579:31;:152::i;:::-;45560:171;-1:-1:-1;45767:20:0;;-1:-1:-1;45767:18:0;;-1:-1:-1;45767:20:0:i;:::-;45752:12;:35;45748:92;;;-1:-1:-1;45823:1:0;45748:92;44775:1083;;;;;:::o;42202:220::-;42300:7;42332:82;22674:6;42332:49;42368:12;:10;:12::i;:::-;42332:17;42342:6;42332:9;:17::i;:::-;:35;:49;:35;:49;:::i;:::-;:67;:82;:67;:82;:::i;:::-;42325:89;;42202:220;;;;:::o;22809:18::-;;;;;;;;;;;;;;-1:-1:-1;;22809:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24964:248::-;25098:10;25068:4;25090:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25090:29:0;;;;;;;;;;:38;;;25144;25068:4;;25090:29;;25144:38;;;;25122:6;;25144:38;;;;;;;;;;-1:-1:-1;25200:4:0;24964:248;;;;;:::o;40335:163::-;40413:7;40445:45;40469:20;40487:1;40469:17;:20::i;40445:45::-;40438:52;;40335:163;;:::o;40729:345::-;40841:7;40866:19;40888:18;:16;:18::i;:::-;40866:40;-1:-1:-1;40921:16:0;;40917:150;;40961:94;40999:11;41029;40961:19;:94::i;:::-;40954:101;;;;;40917:150;40729:345;;;;:::o;33456:716::-;33843:7;33852;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;33943:221;33970:6;33991:14;34020:13;34048:19;34082:22;34119:6;34140:13;33943:12;:221::i;:::-;10518:1;11341:14;:38;33936:228;;;;-1:-1:-1;33456:716:0;-1:-1:-1;;;;;;;;33456:716:0:o;24395:123::-;24498:12;;24395:123;:::o;23355:27::-;;;;:::o;23026:23::-;;;;:::o;41082:229::-;41276:16;;;41190:113;;-1:-1:-1;;;41190:113:0;;41158:7;;-1:-1:-1;;;;;;;;;;;27777:42:0;41190:43;;:113;;41256:4;;-1:-1:-1;;;41276:16:0;;-1:-1:-1;;;;;41276:16:0;;41190:113;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41190:113:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41190:113:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41190:113:0;;;;;;;;35477:442;-1:-1:-1;;;;;35731:14:0;;35607:4;35731:14;;;:7;:14;;;;;;;;35746:10;35731:26;;;;;;;;35636:275;;35672:5;;35692:3;;35710:6;;35636:21;:275::i;:::-;35629:282;35477:442;-1:-1:-1;;;;35477:442:0:o;66966:987::-;67106:7;:5;:7::i;:::-;-1:-1:-1;;;;;67092:21:0;:10;-1:-1:-1;;;;;67092:21:0;;67088:381;;67255:24;67249:31;67327:25;67321:32;67390:10;-1:-1:-1;;;;;67390:25:0;;;:66;;;;;67437:19;-1:-1:-1;;;;;67419:37:0;:14;-1:-1:-1;;;;;67419:37:0;;67390:66;67382:75;;;;;;67088:381;;;67505:7;;;-1:-1:-1;;;;;67523:24:0;;;-1:-1:-1;;;;;;67523:24:0;;;;;;67577:28;;67505:7;;;67481:21;;67585:4;;67577:28;;67596:8;;67577:28;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;;67736:4:0;67730:11;67560:45;;-1:-1:-1;67695:14:0;;;67618:12;67730:11;67755:28;67800:13;67797:2;;67828:4;67823:3;67816:17;67797:2;67858:7;:23;;-1:-1:-1;;;;;;67858:23:0;-1:-1:-1;;;;;67858:23:0;;;;;67930:4;67925:3;67918:17;31114:970;31741:7;31750;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;;;;31840:236;31862:6;31883:14;31912:19;31946;31980:22;32017:8;32040;31840:236;;;;;;;;;;;;:7;:236::i;:::-;10518:1;11341:14;:38;31833:243;;;;-1:-1:-1;31114:970:0;-1:-1:-1;;;;;;;;;31114:970:0:o;22861:21::-;;;;;;:::o;23391:49::-;;;;;;;;;;;;;:::o;23056:29::-;;;;:::o;34323:877::-;34871:7;34880;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;34839:12;-1:-1:-1;;;;;21090:20:0;;21086:82;;-1:-1:-1;20985:42:0;21086:82;21184:26;;-1:-1:-1;;;21184:26:0;;20871:42;;21184:18;;:26;;21203:6;;21184:26;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21184:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21184:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21184:26:0;;;;;;;;;:31;21180:531;;21232:20;21255:9;21232:32;;34971:221;34998:6;35019:14;35048:13;35076:19;35110:22;35147:6;35168:13;34971:12;:221::i;:::-;34964:228;;;;21349:5;21315:22;21324:12;21315:8;:22::i;:::-;21340:5;21315:30;21314:40;;;;;;;-1:-1:-1;;;;;;21375:30:0;;20985:42;21375:30;21371:293;;;21426:74;;-1:-1:-1;;;21426:74:0;;20985:42;;21426:20;;:74;;21469:12;;21426:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21426:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21426:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21426:74:0;;;;;;;;;;21371:293;;;21541:107;;-1:-1:-1;;;21541:107:0;;20985:42;;21541:24;;:107;;21588:6;;21617:12;;21541:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21541:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21541:107:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21541:107:0;;;;;;;;;;21371:293;21180:531;;;;34971:221;34998:6;35019:14;35048:13;35076:19;35110:22;35147:6;35168:13;34971:12;:221::i;:::-;34964:228;;;;21698:1;-1:-1:-1;10518:1:0;11341:14;:38;34323:877;;;;-1:-1:-1;34323:877:0;-1:-1:-1;;;;;;;34323:877:0:o;28660:258::-;28792:7;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;28838:72;28863:8;28886:13;28838:10;:72::i;:::-;28831:79;;11329:1;10518;11341:14;:38;28660:258;;-1:-1:-1;;28660:258:0:o;20921:107::-;20985:42;20921:107;:::o;39640:163::-;39721:7;39753:42;39776:18;:16;:18::i;:::-;39753:22;:42::i;27826:78::-;27862:42;27826:78;:::o;37881:367::-;37971:6;37995:12;38051:4;27960:66;38057:18;;38034:42;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;38034:42:0;;;38010:77;;;;;;37995:92;;38107:133;38131:4;38150:8;:14;38159:4;-1:-1:-1;;;;;38150:14:0;-1:-1:-1;;;;;38150:14:0;;;;;;;;;;;;;38179:12;:10;:12::i;:::-;-1:-1:-1;;;;;38206:23:0;;;;;;:17;:23;;;;;;38107:9;:133::i;23207:24::-;;;;:::o;39331:301::-;39406:7;39431:19;39453:20;39471:1;39453:17;:20::i;:::-;39431:42;;39484:19;39506:18;:16;:18::i;:::-;39484:40;;39553:11;39539;:25;39535:90;;;39588:25;;;-1:-1:-1;39581:32:0;;39535:90;39331:301;;;:::o;43609:1158::-;43861:7;43907:17;;43903:857;;43944:23;43971:152;44021:12;44052:18;:16;:18::i;:::-;44089:19;43971:31;:152::i;:::-;43941:182;;;;44163:20;:18;:20::i;:::-;44144:15;:39;44140:609;;44211:475;44683:2;-1:-1:-1;;;;;;;;;;;;;;;;44211:55:0;;44289:13;:154;44364:22;44413:4;44321:119;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;44321:119:0;;;44311:130;;49:4:-1;44311:130:0;;;;44289:154;;;;;;;;;;44303:139;44289:154;;44466:16;;-1:-1:-1;;;;;;;;44466:16:0;;;;;;44505:36;;:73;;27862:42;44505:73;;;44544:22;44505:73;44601:15;44639:4;44211:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44211:467:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44211:467:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44211:467:0;;;;;;;;;:471;:475;:471;:475;:::i;:::-;44204:482;;;;;44140:609;43903:857;43609:1158;;;;;:::o;25586:476::-;25758:10;25709:4;25750:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25750:29:0;;;;;;;;;;25794:28;;;25790:134;;-1:-1:-1;25850:1:0;25790:134;;;25884:28;;;25790:134;25942:10;25934:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25934:29:0;;;;;;;;;;;:40;;;25992;;25934:29;;25942:10;25992:40;;;;25966:8;;25992:40;;;;;;;;;;-1:-1:-1;26050:4:0;;25586:476;-1:-1:-1;;;25586:476:0:o;42430:1171::-;42686:17;;;-1:-1:-1;;;;;42767:36:0;;42763:103;;27862:42;42820:34;;42763:103;42878:20;42901:123;42929:22;42966:19;43000:13;42901;:123::i;:::-;42878:146;;43065:96;43109:14;43138:12;43065:29;:96::i;:::-;43037:124;;-1:-1:-1;43037:124:0;-1:-1:-1;43188:20:0;:18;:20::i;:::-;43176:9;:32;43172:81;;;-1:-1:-1;43233:1:0;;-1:-1:-1;43233:1:0;;-1:-1:-1;43233:1:0;;-1:-1:-1;43225:16:0;;43172:81;43281:42;:13;43313:9;43281:42;:31;:42;:::i;:::-;43416:16;;;43349:244;;-1:-1:-1;;;43349:244:0;;43265:58;;-1:-1:-1;;;;;;;;;;;;27777:42:0;43349:52;;:244;;-1:-1:-1;;;43416:16:0;;-1:-1:-1;;;;;43416:16:0;;43447:22;;43265:58;;43512:19;;43546:12;;43573:9;;43349:244;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43349:244:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43349:244:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43349:244:0;;;;;;;;;43336:257;;42430:1171;;;;;;;;;;:::o;24526:149::-;-1:-1:-1;;;;;24651:16:0;24619:7;24651:16;;;:8;:16;;;;;;;24526:149::o;22986:31::-;;;-1:-1:-1;;;22986:31:0;;-1:-1:-1;;;;;22986:31:0;;:::o;23317:::-;;;;:::o;23129:36::-;;;;:::o;38822:322::-;38892:7;38926:22;38989:15;-1:-1:-1;;;;;38963:42:0;:15;;;;;;;;;-1:-1:-1;;;;;38963:15:0;-1:-1:-1;;;;;38963:42:0;;38959:112;;39042:17;:15;:17::i;:::-;39022:37;-1:-1:-1;;38959:112:0;39090:46;39102:33;39120:14;39102:17;:33::i;:::-;39090:11;:46::i;:::-;39083:53;;;38822:322;:::o;68391:464::-;68527:22;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;68584:46;68609:10;68584;:46::i;:::-;68567:63;-1:-1:-1;68647:19:0;;68643:205;;68683:46;;-1:-1:-1;;;68683:46:0;;27862:42;;68683:30;;:46;;68714:14;;68683:46;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68683:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68683:46:0;;;;68744:92;68780:8;68807:14;68744:17;:92::i;41633:506::-;41743:7;;41792:67;41805:37;41844:14;41792:12;:67::i;:::-;41768:91;;41877:254;41946:184;22737:6;42053:7;42116:13;41946:12;:184::i;:::-;41877:50;41913:13;41877:17;:15;:17::i;39905:144::-;39983:7;40015:26;40039:1;40015:23;:26::i;32174:1131::-;32962:7;32971;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;32930:12;-1:-1:-1;;;;;21090:20:0;;21086:82;;-1:-1:-1;20985:42:0;21086:82;21184:26;;-1:-1:-1;;;21184:26:0;;20871:42;;21184:18;;:26;;21203:6;;21184:26;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21184:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21184:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21184:26:0;;;;;;;;;:31;21180:531;;21232:20;21255:9;21232:32;;33061:236;33083:6;33104:14;33133:19;33167;33201:22;33238:8;33261;33061:236;;;;;;;;;;;;:7;:236::i;:::-;33054:243;;;;21349:5;21315:22;21324:12;21315:8;:22::i;:::-;21340:5;21315:30;21314:40;;;;;;;-1:-1:-1;;;;;;21375:30:0;;20985:42;21375:30;21371:293;;;21426:74;;-1:-1:-1;;;21426:74:0;;20985:42;;21426:20;;:74;;21469:12;;21426:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21426:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21426:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21426:74:0;;;;;;;;;;21371:293;;;21541:107;;-1:-1:-1;;;21541:107:0;;20985:42;;21541:24;;:107;;21588:6;;21617:12;;21541:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21541:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21541:107:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21541:107:0;;;;;;;;;;21371:293;21180:531;;;;33061:236;33083:6;33104:14;33133:19;33167;33201:22;33238:8;33261;33061:236;;;;;;;;;;;;:7;:236::i;:::-;33054:243;;;;21698:1;-1:-1:-1;10518:1:0;11341:14;:38;32174:1131;;;;-1:-1:-1;32174:1131:0;-1:-1:-1;;;;;;;;32174:1131:0:o;16374:79::-;16439:6;;-1:-1:-1;;;;;16439:6:0;16374:79;:::o;16720:94::-;16800:6;;16760:4;;-1:-1:-1;;;;;16800:6:0;16784:12;:10;:12::i;:::-;-1:-1:-1;;;;;16784:22:0;;16777:29;;16720:94;:::o;68138:245::-;68264:18;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;68307:68;68332:8;68355:9;68307:10;:68::i;41319:306::-;41395:7;41420:22;41483:15;-1:-1:-1;;;;;41457:42:0;:15;;;;;;;;;-1:-1:-1;;;;;41457:15:0;-1:-1:-1;;;;;41457:42:0;;41453:112;;41536:17;:15;:17::i;:::-;41516:37;-1:-1:-1;;41453:112:0;41584:33;41602:14;41584:17;:33::i;22834:20::-;;;;;;;;;;;;;;;-1:-1:-1;;22834:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27739:80;-1:-1:-1;;;;;;;;;;;27739:80:0;:::o;28926:366::-;29055:22;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;29112:46;29137:10;29112;:46::i;:::-;29095:63;-1:-1:-1;29175:19:0;;29171:114;;29211:62;29225:16;;;;;;;;;-1:-1:-1;;;;;29225:16:0;29243:8;29253:14;29211:62;;;;;;;;;;;;;-1:-1:-1;;;29211:62:0;;;:13;:62::i;35208:261::-;35310:4;35339:122;35375:10;35400:3;35418:6;-1:-1:-1;;35339:21:0;:122::i;40057:189::-;40169:7;40201:37;40225:12;40201:23;:37::i;23174:26::-;;;;:::o;29300:1724::-;29598:12;10518:1;11211:14;;:39;11203:64;;;;-1:-1:-1;;;11203:64:0;;;;;;;;;10626:1;11278:14;:40;;;29546:7;-1:-1:-1;;;;;;29546:7:0;22227:14;29546:7;22227:9;:14::i;:::-;22226:15;22218:40;;;;-1:-1:-1;;;22218:40:0;;;;;;;;;27524:17;:15;:17::i;:::-;29636;29628:32;;;;-1:-1:-1;;;29628:32:0;;;;;;;;;29706:26;29735:36;:21;29761:9;29735:36;:25;:36;:::i;:::-;29706:65;;29782:27;29812:58;29851:18;:16;:18::i;:::-;29812:20;:18;:20::i;:58::-;29782:88;;29966:19;29944;:41;;;;30046:61;30060:16;;;;;;;;;-1:-1:-1;;;;;30060:16:0;30078:8;30088:12;30046:61;;;;;;;;;;;;;-1:-1:-1;;;30046:61:0;;;:13;:61::i;:::-;30120:21;30156:28;30152:179;;30212:4;;30201:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30201:15:0;;-1:-1:-1;30152:179:0;;-1:-1:-1;;;30152:179:0;;30300:9;;30284:27;;;;;;;;;;;;;;;;;30260:59;;30314:4;;;;30260:59;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30260:59:0;;;30249:70;;30152:179;30371:12;30385:23;27688:42;-1:-1:-1;;;;;30412:20:0;30439:9;30505:10;30561:6;30586:8;30464:145;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30464:145:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;30464:145:0;30412:208;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30370:250:0;;;;30639:7;30631:31;;;;-1:-1:-1;;;30631:31:0;;;;;;;;;30733:1;30711:19;:23;30811:21;:43;-1:-1:-1;30811:43:0;;;:145;;;30937:19;30871:62;30914:18;:16;:18::i;30871:62::-;:85;;30811:145;30789:197;;;;-1:-1:-1;;;30789:197:0;;;;;;;;;10518:1;11341:14;:38;31006:10;29300:1724;-1:-1:-1;;;;;;;;;;;;;29300:1724:0:o;20810:104::-;20871:42;20810:104;:::o;40506:215::-;40618:7;40650:63;40674:38;40699:12;40674:20;40692:1;40674:17;:20::i;25220:358::-;25387:10;25338:4;25379:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25379:29:0;;;;;;;;;;25338:4;;25379:60;;25427:11;25379:60;:47;:60;:::i;:::-;25458:10;25450:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;25450:29:0;;;;;;;;;;;:40;;;25508;;25360:79;;-1:-1:-1;25450:29:0;25508:40;;;;25360:79;;25508:40;;23092:30;;;;:::o;24683:185::-;-1:-1:-1;;;;;24835:15:0;;;24803:7;24835:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;24683:185::o;39152:171::-;-1:-1:-1;;;;;39291:24:0;39250:7;39291:24;;;:17;:24;;;;;;;39152:171::o;23238:27::-;;;;:::o;16969:109::-;16586:9;:7;:9::i;:::-;16578:34;;;;-1:-1:-1;;;16578:34:0;;;;;;;;;17042:28;17061:8;17042:18;:28::i;:::-;16969:109;:::o;27602:35::-;27636:1;27602:35;:::o;53274:1039::-;53488:20;53510:29;53541:23;53597:88;53636:12;53663:11;53597:24;:88::i;:::-;53582:103;-1:-1:-1;53845:376:0;53927:279;22674:6;53976:172;54115:32;53976:108;22674:6;53976:63;53582:103;54019:19;53976:63;:42;:63;:::i;:172::-;53927:12;:279::i;:::-;53845:45;:12;22674:6;53845:45;:30;:45;:::i;:376::-;53827:394;-1:-1:-1;54258:47:0;53827:394;54292:12;54258:47;:33;:47;:::i;:::-;54234:71;;53274:1039;;;;;;;:::o;59755:169::-;59874:16;;;59867:49;;-1:-1:-1;;;59867:49:0;;59835:7;;-1:-1:-1;;;59874:16:0;;;-1:-1:-1;;;;;59874:16:0;;59867:34;;:49;;59910:4;;59867:49;;;3300:471;3358:7;3603:6;3599:47;;-1:-1:-1;3633:1:0;3626:8;;3599:47;3670:5;;;3674:1;3670;:5;:1;3694:5;;;;;:10;3686:56;;;;-1:-1:-1;;;3686:56:0;;;;;;;;4239:132;4297:7;4324:39;4328:1;4331;4324:39;;;;;;;;;;;;;;;;;:3;:39::i;65478:550::-;65589:7;65633:12;;65649:1;65633:17;65629:392;;65691:19;;65798:18;65794:141;;65853:66;65900:18;:16;:18::i;65853:66::-;65837:82;;65794:141;65958:51;:13;65994:14;65958:51;:35;:51;:::i;60728:534::-;60868:7;60897:16;;;;;:46;;;60932:11;60917;:26;;60897:46;60893:362;;;60967:276;22737:6;;61197:45;60967:207;61091:82;22737:6;-1:-1:-1;;;;;;;;;;;;;;;;61127:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61127:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61127:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;61127:45:0;;;;;;;;61091:82;60967:101;61025:42;61042:11;61055;61025:16;:42::i;:::-;60967:35;60990:11;60967:22;:35::i;:276::-;60960:283;;;;50200:1967;50575:7;50584;50523;;-1:-1:-1;;;;;;50523:7:0;22227:14;22237:3;22227:9;:14::i;:::-;22226:15;22218:40;;;;-1:-1:-1;;;22218:40:0;;;;;;;;;27524:17;:15;:17::i;:::-;50728:11;;;:35;;-1:-1:-1;50743:10:0;-1:-1:-1;;;;;50743:20:0;;;50728:35;50720:50;;;;-1:-1:-1;;;50720:50:0;;;;;;;;;-1:-1:-1;;;;;50787:36:0;;50783:103;;27862:42;50840:34;;50783:103;50930:16;;-1:-1:-1;;;;;50904:42:0;;;-1:-1:-1;;;50930:16:0;;;;50904:42;;50896:57;;;;-1:-1:-1;;;50896:57:0;;;;;;;;;50966:20;50989:123;51017:22;51054:19;51088:13;50989;:123::i;:::-;50966:146;-1:-1:-1;51131:17:0;51123:32;;;;-1:-1:-1;;;51123:32:0;;;;;;;;;51168:31;;:::i;:::-;51210:29;;:::i;:::-;51279:4;51252:32;;-1:-1:-1;;;;;51305:25:0;;51252:16;51305;;:25;;;51341:16;;;:25;51660:14;;;:30;;;51701:14;;;:36;;;51785:126;51859:14;51888:12;51785:29;:126::i;:::-;51750:161;;51751:14;;;51750:161;51931:228;51960:6;51779:1;52015:14;52044:22;52081:13;51751:11;52135:13;51931:14;:228::i;:::-;51924:235;;;;;;;50200:1967;;;;;;;;;;;:::o;35927:1161::-;36101:4;-1:-1:-1;;36127:16:0;:31;36123:127;;36204:34;;;;;;;;;;;;-1:-1:-1;;;36204:34:0;;;;;;:16;;36225:6;;36204:34;:20;:34;:::i;:::-;-1:-1:-1;;;;;36175:14:0;;;;;;:7;:14;;;;;;;;36190:10;36175:26;;;;;;;:63;36123:127;-1:-1:-1;;;;;36270:17:0;;36262:32;;;;-1:-1:-1;;;36262:32:0;;;;;;;;;-1:-1:-1;;;;;36331:15:0;;36307:21;36331:15;;;:8;:15;;;;;;;;;36384:45;;;;;;;;;;;-1:-1:-1;;;36384:45:0;;;;;;;36331:15;;36307:21;36384:45;;36331:15;;36416:6;;36384:45;:31;:45;:::i;:::-;-1:-1:-1;;;;;36440:15:0;;;;;;;:8;:15;;;;;;:34;;;36509:13;;;;;;;;;36357:72;;-1:-1:-1;36558:37:0;36509:13;36588:6;36558:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;36606:13:0;;;;;;:8;:13;;;;;:30;;;36533:62;;-1:-1:-1;36710:12:0;:10;:12::i;:::-;36686:36;;36735:136;36768:5;36788:13;36816:16;36847:13;36735:18;:136::i;:::-;36882:130;36915:3;36933:11;36959:14;36988:13;36882:18;:130::i;:::-;37046:3;-1:-1:-1;;;;;37030:28:0;37039:5;-1:-1:-1;;;;;37030:28:0;;37051:6;37030:28;;;;;;;;;;;;;;;-1:-1:-1;37076:4:0;;35927:1161;-1:-1:-1;;;;;;;;;35927:1161:0:o;47738:2454::-;48381:7;48390;48329;;-1:-1:-1;;;;;;48329:7:0;22227:14;22237:3;22227:9;:14::i;:::-;22226:15;22218:40;;;;-1:-1:-1;;;22218:40:0;;;;;;;;;27524:17;:15;:17::i;:::-;48481:19;48473:33;;;;-1:-1:-1;;;48473:33:0;;;;;;;;;48527:9;:14;;:50;;;48558:19;48545:9;:32;48527:50;48519:64;;;;-1:-1:-1;;;48519:64:0;;;;;;;;;48602:24;;;;:39;;-1:-1:-1;48630:11:0;;;48602:39;48594:53;;;;-1:-1:-1;;;48594:53:0;;;;;;;;;-1:-1:-1;;;;;48666:36:0;;;;;:54;;-1:-1:-1;48706:9:0;:14;;48666:54;:69;;;-1:-1:-1;48724:11:0;;;48666:69;48658:83;;;;-1:-1:-1;;;48658:83:0;;;;;;;;;48814:11;;;:37;;-1:-1:-1;48829:10:0;-1:-1:-1;;;;;48829:22:0;;;48814:37;48806:52;;;;-1:-1:-1;;;48806:52:0;;;;;;;;;-1:-1:-1;;;;;48875:36:0;;48871:103;;27862:42;48928:34;;48871:103;49018:16;;-1:-1:-1;;;;;48992:42:0;;;-1:-1:-1;;;49018:16:0;;;;48992:42;;48984:57;;;;-1:-1:-1;;;48984:57:0;;;;;;;;;49054:31;;:::i;:::-;49096:29;;:::i;:::-;49165:4;49138:32;;-1:-1:-1;;;;;49191:27:0;;;49138:16;49191;;:27;49229;;:16;;;:27;49562:14;;;:36;;;49742:169;49788:14;49817:20;49152:1;49817:17;:20::i;:::-;49881:19;49742:31;:169::i;:::-;49692:14;49724;;;49691:220;;;;49708:14;;;;49691:220;;;;;;;49931:253;;;;;;;49704:1;49931:253;;;;;49960:6;;49981:14;;50063:22;;50100:13;;49692:11;;49931:14;:253::i;:::-;49924:260;;;;;;47738:2454;;;;;;;;;;;;:::o;21726:247::-;21825:7;21930:2;21948:8;21930:33;21905:9;21878:11;21857:5;:32;:57;:106;21850:113;;21726:247;;;:::o;45900:878::-;46041:18;27524:17;:15;:17::i;:::-;46086:18;46077:34;;;;-1:-1:-1;;;46077:34:0;;;;;;;;;46124:20;46147:33;46159:20;46177:1;46159:17;:20::i;46147:33::-;46124:56;-1:-1:-1;46204:78:0;46124:56;46204:46;:13;22674:6;46204:46;:31;:46;:::i;:78::-;46191:91;-1:-1:-1;46299:9:0;46295:266;;46330:83;46348:16;;;;;;;;;-1:-1:-1;;;;;46348:16:0;46366:10;46386:4;46393:13;46330:83;;;;;;;;;;;;;-1:-1:-1;;;46330:83:0;;;:17;:83::i;:::-;46295:266;;;46467:13;46454:9;:26;46446:41;;;;-1:-1:-1;;;46446:41:0;;;;;;;;;27862:42;-1:-1:-1;;;;;46502:24:0;;46533:13;46502:47;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46502:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46502:47:0;;;;;46295:266;-1:-1:-1;;;;;46629:18:0;;;;;;:8;:18;;;;;;46573:197;;46606:8;;46662:56;46606:8;46678:10;46690:13;46705:12;46662:5;:56::i;:::-;46747:12;46573:18;:197::i;:::-;27552:1;45900:878;;;;:::o;60311:369::-;60424:7;60453:16;;60449:224;;60487:26;60518:17;:15;:17::i;:::-;-1:-1:-1;60486:49:0;-1:-1:-1;60557:104:0;60649:11;60557:69;60486:49;60598:27;60557:69;:40;:69;:::i;38256:558::-;38443:18;38483:21;38479:62;;-1:-1:-1;38528:1:0;38521:8;;38479:62;-1:-1:-1;38592:11:0;;38640:166;38592:11;38640:135;22794:6;38640:101;38731:8;38640:65;38647:13;38687:16;38640:65;:39;:65;:::i;:::-;:83;:101;:83;:101;:::i;:::-;:119;:135;:119;:135;:::i;:::-;:153;:166;:153;:166;:::i;:::-;38626:180;38256:558;-1:-1:-1;;;;;38256:558:0:o;1928:181::-;1986:7;2018:5;;;2042:6;;;;2034:46;;;;-1:-1:-1;;;2034:46:0;;;;;;;;52487:779;52725:13;52753:24;;52749:510;;52795:24;52821:29;-1:-1:-1;;;;;;;;;;;;;;;;52864:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52864:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52864:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52864:38:0;;;;;;;;;52973:16;;;52854:150;;-1:-1:-1;;;52854:150:0;;-1:-1:-1;;;;;52854:59:0;;;;;;:150;;52932:22;;-1:-1:-1;;;52973:16:0;;;;;;;52854:150;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52854:150:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52854:150:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52854:150:0;;;;;;;;;52794:210;;;;53023:16;53043:1;53023:21;53019:229;;53080:152;53219:12;53080:112;53170:21;53080:63;:19;53126:16;53080:63;:45;:63;:::i;:152::-;53065:167;;53019:229;52749:510;;52487:779;;;;;:::o;64575:895::-;64730:20;;;64814:67;64827:37;64866:14;64814:12;:67::i;:::-;64790:91;-1:-1:-1;64909:180:0;64948:95;64790:91;64948:58;:13;22737:6;64948:58;:35;:58;:::i;:95::-;65058:20;65076:1;65058:17;:20::i;:::-;64909:24;:180::i;:::-;64894:195;;65192:270;65448:13;65192:237;65289:139;65320:12;65351:7;65414:13;65289:12;:139::i;:::-;65192:78;:13;65224:45;65192:78;:31;:78;:::i;:270::-;65177:285;;64575:895;;;;;;:::o;63898:669::-;64372:16;;;64282:117;;-1:-1:-1;;;64282:117:0;;63989:26;;;;;;-1:-1:-1;;;;;;;;;;;27777:42:0;64282:47;;:117;;64352:4;;-1:-1:-1;;;64372:16:0;;;-1:-1:-1;;;;;64372:16:0;;64282:117;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64282:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64282:117:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;64282:117:0;;;;;;;;;-1:-1:-1;64222:177:0;;-1:-1:-1;64222:177:0;-1:-1:-1;64222:177:0;-1:-1:-1;64429:130:0;;-1:-1:-1;22737:6:0;;-1:-1:-1;64429:89:0;64462:55;22737:6;64222:177;64462:12;:55::i;:::-;64429:14;;:89;:32;:89;:::i;:130::-;64412:147;;63898:669;;;:::o;59969:334::-;60123:12;;60071:7;;60155:21;:140;;60283:12;;60155:140;;;60192:88;60263:16;60192:48;:11;22674:6;60192:48;:33;:48;:::i;46786:944::-;46897:22;27524:17;:15;:17::i;:::-;46945:15;46937:30;;;;-1:-1:-1;;;46937:30:0;;;;;;;;;46997:21;47007:10;46997:9;:21::i;:::-;46984:10;:34;46980:156;;;-1:-1:-1;;47043:10:0;:25;47035:40;;;;-1:-1:-1;;;47035:40:0;;;;;;;;;47103:21;47113:10;47103:9;:21::i;:::-;47090:34;;46980:156;47148:20;47171:33;47183:20;47201:1;47183:17;:20::i;47171:33::-;47148:56;-1:-1:-1;47217:22:0;47242:75;22674:6;47242:42;:10;47148:56;47242:42;:28;:42;:::i;:75::-;47217:100;;47328:37;47368:20;:18;:20::i;:::-;47328:60;;47418:14;47401:31;;47469:29;47451:14;:47;;47443:62;;;;-1:-1:-1;;;47443:62:0;;;;;;;;;47551:10;47576:20;;;;:8;:20;;;;;;47518:204;;47551:10;47611:59;47551:10;47629;47641:14;47657:12;47611:5;:59::i;:::-;47699:12;47518:18;:204::i;:::-;27552:1;;;46786:944;;;:::o;14016:363::-;14123:6;14098:21;:31;;14090:73;;;;-1:-1:-1;;;14090:73:0;;;;;;;;;14232:12;14250:9;-1:-1:-1;;;;;14250:14:0;14271:6;14250:32;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14231:51:0;;;14301:7;14293:78;;;;-1:-1:-1;;;14293:78:0;;;;;;;;;14016:363;;;:::o;66036:494::-;66201:7;66233:16;:289;;22737:6;66233:289;;;66265:220;22737:6;66265:175;66427:12;66265:124;66380:8;66265:124;66345:11;66265:57;:12;22737:6;66265:57;:34;:57;:::i;61270:671::-;61385:7;;61447:17;;61443:361;;61485:15;;61511;-1:-1:-1;;;;;61485:42:0;;;:15;;;;;:42;61481:120;;61568:17;:15;:17::i;:::-;61548:37;-1:-1:-1;;61481:120:0;61617:15;61635:58;61678:14;61635:20;:18;:20::i;:58::-;61617:76;;61727:7;61712:12;:22;61708:85;;;61770:7;61755:22;;61708:85;61443:361;;61823:110;61862:12;61889:33;61907:14;61889:17;:33::i;15165:98::-;15245:10;15165:98;:::o;58678:324::-;58893:67;;58839:155;;58873:5;;-1:-1:-1;;;58916:31:0;58893:67;;58949:2;;58953:6;;58893:67;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;58893:67:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;58893:67:0;;;179:29:-1;;;;160:49;;;58975:8:0;58839:19;:155::i;:::-;58678:324;;;;:::o;22286:269::-;22377:13;22408:12;22450:3;22102:66;22455:22;;22433:45;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;22433:45:0;;;22423:56;;49:4:-1;22423:56:0;;;;22526:11;;22499:49;-1:-1:-1;;;22499:49:0:o;52175:304::-;52286:15;;52255;;-1:-1:-1;;;;;52286:21:0;;;:15;;;;;:21;52282:190;;52392:16;;;52324:99;;-1:-1:-1;;;52324:99:0;;-1:-1:-1;;;;;;;;;;;27777:42:0;52324:49;;:99;;-1:-1:-1;;;52392:16:0;;;-1:-1:-1;;;;;52392:16:0;;52324:99;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52324:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52440:15:0;:20;;-1:-1:-1;;;;;52440:20:0;;;;-1:-1:-1;;52440:20:0;;;;;;-1:-1:-1;;52175:304:0;:::o;2384:136::-;2442:7;2469:43;2473:1;2476;2469:43;;;;;;;;;;;;;;;;;:3;:43::i;17184:229::-;-1:-1:-1;;;;;17258:22:0;;17250:73;;;;-1:-1:-1;;;17250:73:0;;;;;;;;;17360:6;;17339:38;;-1:-1:-1;;;;;17339:38:0;;;;17360:6;;17339:38;;17360:6;;17339:38;17388:6;:17;;-1:-1:-1;;;;;;17388:17:0;-1:-1:-1;;;;;17388:17:0;;;;;;;;;;17184:229::o;61949:1941::-;62098:16;62132;62151:107;62182:39;62205:15;62182:18;:16;:18::i;:39::-;62236:11;62151:16;:107::i;:::-;62354:8;;62402:14;;62453:11;;62499:9;;62546:12;;62132:126;;-1:-1:-1;62271:19:0;;;;62354:8;62402:14;62453:11;62499:9;62575:26;;;62571:170;;;62714:15;62703:26;;62571:170;62768:13;62757:8;:24;62753:1130;;;62949:25;;;;;22737:6;62874:37;;;62993:23;;;62989:69;;;63046:12;63035:23;;62989:69;63089:136;22737:6;63089:91;63166:13;63089:54;:18;63130:12;63089:54;:40;:54;:::i;:136::-;63075:150;;63253:146;63387:11;63253:111;63351:12;63253:75;63284:43;63297:16;63315:11;63284:12;:43::i;:::-;63253:8;;:75;:30;:75;:::i;:146::-;63242:157;;62753:1130;;;;63443:131;63561:12;63443:95;22737:6;63443:50;:8;63474:18;63443:50;:30;:50;:::i;:131::-;63432:142;-1:-1:-1;63605:12:0;;-1:-1:-1;63605:12:0;;63646:54;:18;63605:12;63646:54;:40;:54;:::i;:::-;63632:68;;63732:11;63721:8;:22;63717:154;;;63773:11;63762:22;;63717:154;;;63819:11;63808:8;:22;63804:67;;;63860:11;63849:22;;63804:67;61949:1941;;;;;;;;;;;;:::o;4901:346::-;4987:7;5090:12;5082:6;5074:29;;;;-1:-1:-1;;;5074:29:0;;;;;;;;;;;5114:9;5130:1;5126;:5;;;;;;;4901:346;-1:-1:-1;;;;;4901:346:0:o;66538:384::-;66675:7;66704:16;;;;;:36;;-1:-1:-1;66724:16:0;;;66704:36;66700:215;;;66812:91;66891:11;66812:56;:11;22737:6;66812:56;:33;:56;:::i;54350:2221::-;54662:7;54671;54723:20;:18;:20::i;:::-;54705:14;;;;:38;;;;:101;;-1:-1:-1;54776:16:0;;;;-1:-1:-1;;;;;54776:30:0;;;54705:101;54696:152;;;;-1:-1:-1;;;54696:152:0;;;;;;;;;54862:16;;;;-1:-1:-1;;;;;54862:30:0;54858:121;;54928:16;;;;-1:-1:-1;;;;;54909:35:0;:16;;;:35;54858:121;55066:16;55085:147;55116:22;55153:13;55181:11;55207:14;55085:16;:147::i;:::-;55370:14;;;;55337;;;;55066:166;;-1:-1:-1;55337:48:0;;:14;:32;:48::i;:::-;55320:14;;;:65;55418:19;;55414:222;;55572:14;;;;:52;;55609:14;55572:36;:52::i;:::-;55555:14;;;:69;55414:222;55648:17;55668:19;:60;;55723:5;55668:60;;;55703:4;55668:60;55648:80;;55741:20;55764:13;:126;55827:22;55864:12;55796:91;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;55796:91:0;;;55786:102;;;;;;55778:111;;55764:126;;;;;;;;;;;;55741:149;;55947:14;55965:1;55947:19;55943:136;;56000:67;56013:37;56052:14;56000:12;:67::i;:::-;55983:84;;55943:136;-1:-1:-1;;;;;;;;;;;;;;;;56126:47:0;;56180:8;56235:12;56262:6;56283:12;56310:14;56356:13;56384:11;56410:13;56126:308;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56126:308:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56126:308:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;56126:308:0;;;;;;;;;56108:14;;;56091:343;56092:14;;;56091:343;;;56445:35;;;;-1:-1:-1;;;56445:35:0;;;;;;;;;-1:-1:-1;;;56501:14:0;;;;56517;;;;;56501;;56517;;-1:-1:-1;54350:2221:0;;-1:-1:-1;;;;;;;54350:2221:0:o;2857:192::-;2943:7;2979:12;2971:6;;;;2963:29;;;;-1:-1:-1;;;2963:29:0;;;;;;;;;;-1:-1:-1;;;3015:5:0;;;2857:192::o;37096:742::-;37314:43;;37275:12;;37314:43;;37331:5;;27960:66;;37314:43;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;37314:43:0;;;37290:78;;;;;;37275:93;;37381:21;37417:11;37432:1;37417:16;37413:290;;;37466:1;37450:17;;37413:290;;;37489:16;;37485:218;;-1:-1:-1;;;;;37652:24:0;;;;;;:17;:24;;;;;;37539:152;;37567:4;;37590:11;;37620:13;;37539:9;:152::i;:::-;37522:169;;37485:218;37739:28;;-1:-1:-1;;;;;37790:24:0;;;;;;;:17;:24;;;;;:40;;;;-1:-1:-1;;37096:742:0:o;59010:361::-;59252:77;;59198:165;;59232:5;;-1:-1:-1;;;59275:35:0;59252:77;;59312:4;;59318:2;;59322:6;;59252:77;;;;59198:165;59010:361;;;;;:::o;26070:556::-;26231:7;-1:-1:-1;;;;;26264:17:0;;26256:32;;;;-1:-1:-1;;;26256:32:0;;;;;;;;;-1:-1:-1;;;;;26320:13:0;;26301:16;26320:13;;;:8;:13;;;;;;:45;;26352:12;26320:45;:31;:45;:::i;:::-;-1:-1:-1;;;;;26376:13:0;;;;;;:8;:13;;;;;:24;;;26428:12;;26301:64;;-1:-1:-1;26428:44:0;;26459:12;26428:44;:30;:44;:::i;:::-;26413:12;:59;26490:45;;-1:-1:-1;;;;;26490:45:0;;;;;;;26500:12;;26514;;26528:6;;26490:45;;;;;;;;;;26572:3;-1:-1:-1;;;;;26551:39:0;26568:1;-1:-1:-1;;;;;26551:39:0;;26577:12;26551:39;;;;;;;;;;;;;;;26610:8;26070:556;-1:-1:-1;;;;;26070:556:0:o;9353:218::-;9409:6;9439:5;;;9464:6;;;;;;:16;;;9479:1;9474;:6;;9464:16;9463:38;;;;9490:1;9486;:5;:14;;;;;9499:1;9495;:5;9486:14;9455:87;;;;-1:-1:-1;;;9455:87:0;;;;;;;;7789:568;7845:6;8089;8085:47;;-1:-1:-1;8119:1:0;8112:8;;8085:47;8154:1;-1:-1:-1;;8154:7:0;:27;;;;;-1:-1:-1;;;8165:1:0;:16;8154:27;8152:30;8144:82;;;;-1:-1:-1;;;8144:82:0;;;;;;;;;8250:5;;;8254:1;8250;:5;:1;8274:5;;;;;:10;8266:62;;;;-1:-1:-1;;;8266:62:0;;;;;;;;8831:271;8887:6;8914;8906:51;;;;-1:-1:-1;;;8906:51:0;;;;;;;;;8978:1;-1:-1:-1;;8978:7:0;:27;;;;;-1:-1:-1;;;8989:1:0;:16;8978:27;8976:30;8968:76;;;;-1:-1:-1;;;8968:76:0;;;;;;;;;9057:8;9072:1;9068;:5;;;;;;;8831:271;-1:-1:-1;;;;8831:271:0:o;9816:215::-;9872:6;9902:5;;;9927:6;;;;;;:16;;;9942:1;9937;:6;;9927:16;9926:38;;;;9953:1;9949;:5;:14;;;;;9962:1;9958;:5;9949:14;9918:84;;;;-1:-1:-1;;;9918:84:0;;;;;;;;26634:702;26840:38;;;;;;;;;;;-1:-1:-1;;;26840:38:0;;;;;;;;-1:-1:-1;;;;;26840:14:0;;26796:7;26840:14;;;:8;:14;;;;;;;26796:7;;26840:38;;:14;26859:12;;26840:38;:18;:38;:::i;:::-;26821:57;;26988:2;26976:8;:14;26972:115;;27022:26;:12;27039:8;27022:26;:16;:26;:::i;:::-;27007:41;;27074:1;27063:12;;26972:115;-1:-1:-1;;;;;27097:14:0;;;;;;:8;:14;;;;;:25;;;27150:12;;:30;;27167:12;27150:30;:16;:30;:::i;:::-;27135:12;:45;27198:46;;-1:-1:-1;;;;;27198:46:0;;;;;;;27209:12;;27223;;27237:6;;27198:46;;;;;;;;;;27283:1;-1:-1:-1;;;;;27260:40:0;27269:4;-1:-1:-1;;;;;27260:40:0;;27287:12;27260:40;;;;;;;59379:368;59529:12;59543:23;59570:5;-1:-1:-1;;;;;59570:10:0;59581:4;59570:16;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;59528:58:0;;;;59605:7;59614:8;59597:26;;;;;-1:-1:-1;;;59597:26:0;;;;;;;;;;-1:-1:-1;59640:17:0;;:22;59636:104;;59698:10;59687:30;;;;;;;;;;;;;;59719:8;59679:49;;;;;-1:-1:-1;;;59679:49:0;;;;;;;;;;;59379:368;;;;;:::o;69234:1769::-;69598:16;;;;;69648:14;;;69697;;;;69752;;;;69455:16;;27862:42;;;;69598:16;;69648:14;;69697;-1:-1:-1;;;;;69787:43:0;;;;;69779:58;;;;-1:-1:-1;;;69779:58:0;;;;;;;;;69861:9;;-1:-1:-1;69887:21:0;;69883:506;;69951:49;;-1:-1:-1;;;69951:49:0;;-1:-1:-1;;;;;69951:31:0;;;;;:49;;69983:16;;69951:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69951:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69951:49:0;;;;70015:94;70051:8;70078:16;70015:17;:94::i;:::-;70143:16;70128:12;:31;70124:156;;;70180:84;70194:17;-1:-1:-1;;;;;;;;;;;70241:16:0;70226:12;:31;70180:84;;;;;;;;;;;;;-1:-1:-1;;;70180:84:0;;;:13;:84::i;:::-;69883:506;;;70312:65;70326:17;-1:-1:-1;;;;;;;;;;;70358:12:0;70312:65;;;;;;;;;;;;;-1:-1:-1;;;70312:65:0;;;:13;:65::i;:::-;70405:24;;70401:150;;70446:93;70464:22;70488:10;-1:-1:-1;;;;;;;;;;;70513:19:0;70446:93;;;;;;;;;;;;;-1:-1:-1;;;70446:93:0;;;:17;:93::i;:::-;70567:18;;70563:433;;70606:13;;;;;:42;;;70635:13;70623:8;:25;;70606:42;70602:383;;;70675:10;-1:-1:-1;;;;;70669:25:0;;70701:13;70669:48;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70669:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70669:48:0;;;;;70736:66;70750:17;-1:-1:-1;;;;;;;;;;;70782:13:0;70736:66;;;;;;;;;;;;;-1:-1:-1;;;70736:66:0;;;:13;:66::i;:::-;70833:13;70821:25;;;;70602:383;;;70887:82;70905:17;70924:10;-1:-1:-1;;;;;;;;;;;70949:13:0;70887:82;;;;;;;;;;;;;-1:-1:-1;;;70887:82:0;;;:17;:82::i;:::-;69234:1769;;;;;;;;;;;;:::o;67960:3046::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;67960:3046:0;;;-1:-1:-1;;67960:3046:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;67960:3046:0;;;-1:-1:-1;;67960:3046:0:o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;283:128;358:13;;376:30;358:13;376:30;;418:130;485:20;;510:33;485:20;510:33;;569:336;;;683:3;676:4;668:6;664:17;660:27;650:2;;701:1;698;691:12;650:2;-1:-1;721:20;;761:18;750:30;;747:2;;;793:1;790;783:12;747:2;827:4;819:6;815:17;803:29;;878:3;870:4;862:6;858:17;848:8;844:32;841:41;838:2;;;895:1;892;885:12;838:2;643:262;;;;;;914:440;;1015:3;1008:4;1000:6;996:17;992:27;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:64;1107:48;1148:6;1107:48;;;1092:64;;;1083:73;;1176:6;1169:5;1162:21;1212:4;1204:6;1200:17;1245:4;1238:5;1234:16;1280:3;1271:6;1266:3;1262:16;1259:25;1256:2;;;1297:1;1294;1287:12;1256:2;1307:41;1341:6;1336:3;1331;1307:41;;;975:379;;;;;;;;1859:134;1937:13;;1955:33;1937:13;1955:33;;2000:241;;2104:2;2092:9;2083:7;2079:23;2075:32;2072:2;;;2120:1;2117;2110:12;2072:2;2155:1;2172:53;2217:7;2197:9;2172:53;;2248:263;;2363:2;2351:9;2342:7;2338:23;2334:32;2331:2;;;2379:1;2376;2369:12;2331:2;2414:1;2431:64;2487:7;2467:9;2431:64;;2518:366;;;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;2655:1;2652;2645:12;2607:2;2690:1;2707:53;2752:7;2732:9;2707:53;;;2697:63;;2669:97;2797:2;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;;;2805:63;;2776:98;2601:283;;;;;;2891:491;;;;3029:2;3017:9;3008:7;3004:23;3000:32;2997:2;;;3045:1;3042;3035:12;2997:2;3080:1;3097:53;3142:7;3122:9;3097:53;;;3087:63;;3059:97;3187:2;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;;;3195:63;;3166:98;3295:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;;;3303:63;;3274:98;2991:391;;;;;;3389:470;;;3519:2;3507:9;3498:7;3494:23;3490:32;3487:2;;;3535:1;3532;3525:12;3487:2;3570:1;3587:53;3632:7;3612:9;3587:53;;;3577:63;;3549:97;3705:2;3694:9;3690:18;3677:32;3729:18;3721:6;3718:30;3715:2;;;3761:1;3758;3751:12;3715:2;3781:62;3835:7;3826:6;3815:9;3811:22;3781:62;;3866:366;;;3987:2;3975:9;3966:7;3962:23;3958:32;3955:2;;;4003:1;4000;3993:12;3955:2;4038:1;4055:53;4100:7;4080:9;4055:53;;;4045:63;;4017:97;4145:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;;4239:257;;4351:2;4339:9;4330:7;4326:23;4322:32;4319:2;;;4367:1;4364;4357:12;4319:2;4402:1;4419:61;4472:7;4452:9;4419:61;;4503:1351;;;;;;;;;;4752:3;4740:9;4731:7;4727:23;4723:33;4720:2;;;4769:1;4766;4759:12;4720:2;4804:1;4821:53;4866:7;4846:9;4821:53;;;4811:63;;4783:97;4911:2;4929:53;4974:7;4965:6;4954:9;4950:22;4929:53;;;4919:63;;4890:98;5019:2;5037:53;5082:7;5073:6;5062:9;5058:22;5037:53;;;5027:63;;4998:98;5127:2;5145:53;5190:7;5181:6;5170:9;5166:22;5145:53;;;5135:63;;5106:98;5235:3;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;;;5244:63;;5214:99;5344:3;5363:53;5408:7;5399:6;5388:9;5384:22;5363:53;;;5353:63;;5323:99;5453:3;5472:53;5517:7;5508:6;5497:9;5493:22;5472:53;;;5462:63;;5432:99;5562:3;5581:53;5626:7;5617:6;5606:9;5602:22;5581:53;;;5571:63;;5541:99;5699:3;5688:9;5684:19;5671:33;5724:18;5716:6;5713:30;5710:2;;;5756:1;5753;5746:12;5710:2;5776:62;5830:7;5821:6;5810:9;5806:22;5776:62;;;5766:72;;5650:194;4714:1140;;;;;;;;;;;;5861:1225;;;;;;;;;6093:3;6081:9;6072:7;6068:23;6064:33;6061:2;;;6110:1;6107;6100:12;6061:2;6145:1;6162:53;6207:7;6187:9;6162:53;;;6152:63;;6124:97;6252:2;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;;;6260:63;;6231:98;6360:2;6378:53;6423:7;6414:6;6403:9;6399:22;6378:53;;;6368:63;;6339:98;6468:2;6486:53;6531:7;6522:6;6511:9;6507:22;6486:53;;;6476:63;;6447:98;6576:3;6595:53;6640:7;6631:6;6620:9;6616:22;6595:53;;;6585:63;;6555:99;6685:3;6704:53;6749:7;6740:6;6729:9;6725:22;6704:53;;;6694:63;;6664:99;6794:3;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;;;6803:63;;6773:99;6931:3;6920:9;6916:19;6903:33;6956:18;6948:6;6945:30;6942:2;;;6988:1;6985;6978:12;6942:2;7008:62;7062:7;7053:6;7042:9;7038:22;7008:62;;;6998:72;;6882:194;6055:1031;;;;;;;;;;;;7093:1099;;;;;;;;7308:3;7296:9;7287:7;7283:23;7279:33;7276:2;;;7325:1;7322;7315:12;7276:2;7360:1;7377:53;7422:7;7402:9;7377:53;;;7367:63;;7339:97;7467:2;7485:53;7530:7;7521:6;7510:9;7506:22;7485:53;;;7475:63;;7446:98;7575:2;7593:53;7638:7;7629:6;7618:9;7614:22;7593:53;;;7583:63;;7554:98;7683:2;7701:53;7746:7;7737:6;7726:9;7722:22;7701:53;;;7691:63;;7662:98;7791:3;7810:53;7855:7;7846:6;7835:9;7831:22;7810:53;;;7800:63;;7770:99;7900:3;7919:53;7964:7;7955:6;7944:9;7940:22;7919:53;;;7909:63;;7879:99;8037:3;8026:9;8022:19;8009:33;8062:18;8054:6;8051:30;8048:2;;;8094:1;8091;8084:12;8048:2;8114:62;8168:7;8159:6;8148:9;8144:22;8114:62;;;8104:72;;7988:194;7270:922;;;;;;;;;;;8199:241;;8303:2;8291:9;8282:7;8278:23;8274:32;8271:2;;;8319:1;8316;8309:12;8271:2;8354:1;8371:53;8416:7;8396:9;8371:53;;8447:263;;8562:2;8550:9;8541:7;8537:23;8533:32;8530:2;;;8578:1;8575;8568:12;8530:2;8613:1;8630:64;8686:7;8666:9;8630:64;;8717:993;;;;;;;;8928:3;8916:9;8907:7;8903:23;8899:33;8896:2;;;8945:1;8942;8935:12;8896:2;8980:1;8997:53;9042:7;9022:9;8997:53;;;8987:63;;8959:97;9087:2;9105:53;9150:7;9141:6;9130:9;9126:22;9105:53;;;9095:63;;9066:98;9195:2;9213:53;9258:7;9249:6;9238:9;9234:22;9213:53;;;9203:63;;9174:98;9331:2;9320:9;9316:18;9303:32;9355:18;9347:6;9344:30;9341:2;;;9387:1;9384;9377:12;9341:2;9415:65;9472:7;9463:6;9452:9;9448:22;9415:65;;;9405:75;;;;9282:204;9545:3;9534:9;9530:19;9517:33;9570:18;9562:6;9559:30;9556:2;;;9602:1;9599;9592:12;9556:2;9630:64;9686:7;9677:6;9666:9;9662:22;9630:64;;;9620:74;;;;9496:204;8890:820;;;;;;;;;;;9717:399;;;9849:2;9837:9;9828:7;9824:23;9820:32;9817:2;;;9865:1;9862;9855:12;9817:2;9900:1;9917:64;9973:7;9953:9;9917:64;;;9907:74;;9879:108;10018:2;10036:64;10092:7;10083:6;10072:9;10068:22;10036:64;;10123:491;;;;10261:2;10249:9;10240:7;10236:23;10232:32;10229:2;;;10277:1;10274;10267:12;10229:2;10312:1;10329:53;10374:7;10354:9;10329:53;;;10319:63;;10291:97;10419:2;10437:53;10482:7;10473:6;10462:9;10458:22;10437:53;;;10427:63;;10398:98;10527:2;10545:53;10590:7;10581:6;10570:9;10566:22;10545:53;;10621:617;;;;;10776:3;10764:9;10755:7;10751:23;10747:33;10744:2;;;10793:1;10790;10783:12;10744:2;10828:1;10845:53;10890:7;10870:9;10845:53;;;10835:63;;10807:97;10935:2;10953:53;10998:7;10989:6;10978:9;10974:22;10953:53;;;10943:63;;10914:98;11043:2;11061:53;11106:7;11097:6;11086:9;11082:22;11061:53;;;11051:63;;11022:98;11151:2;11169:53;11214:7;11205:6;11194:9;11190:22;11169:53;;;11159:63;;11130:98;10738:500;;;;;;;;11245:946;;;;;;;11445:3;11433:9;11424:7;11420:23;11416:33;11413:2;;;11462:1;11459;11452:12;11413:2;11497:1;11514:64;11570:7;11550:9;11514:64;;;11504:74;;11476:108;11615:2;11633:64;11689:7;11680:6;11669:9;11665:22;11633:64;;;11623:74;;11594:109;11734:2;11752:64;11808:7;11799:6;11788:9;11784:22;11752:64;;;11742:74;;11713:109;11853:2;11871:64;11927:7;11918:6;11907:9;11903:22;11871:64;;;11861:74;;11832:109;11972:3;11991:64;12047:7;12038:6;12027:9;12023:22;11991:64;;;11981:74;;11951:110;12092:3;12111:64;12167:7;12158:6;12147:9;12143:22;12111:64;;;12101:74;;12071:110;11407:784;;;;;;;;;12199:173;;12286:46;12328:3;12320:6;12286:46;;;-1:-1;;12361:4;12352:14;;12279:93;12381:173;;12468:46;12510:3;12502:6;12468:46;;12562:103;12635:24;12653:5;12635:24;;;12630:3;12623:37;12617:48;;;12792:152;12893:45;12913:24;12931:5;12913:24;;;12893:45;;12984:660;13117:52;13163:5;13117:52;;;13182:84;13259:6;13254:3;13182:84;;;13175:91;;13287:54;13335:5;13287:54;;;13361:7;13389:1;13374:258;13399:6;13396:1;13393:13;13374:258;;;13466:6;13460:13;13487:63;13546:3;13531:13;13487:63;;;13480:70;;13567:58;13618:6;13567:58;;;13557:68;-1:-1;;13421:1;13414:9;13374:258;;13685:660;13818:52;13864:5;13818:52;;;13883:84;13960:6;13955:3;13883:84;;;13876:91;;13988:54;14036:5;13988:54;;;14062:7;14090:1;14075:258;14100:6;14097:1;14094:13;14075:258;;;14167:6;14161:13;14188:63;14247:3;14232:13;14188:63;;;14181:70;;14268:58;14319:6;14268:58;;;14258:68;-1:-1;;14122:1;14115:9;14075:258;;14353:104;14430:21;14445:5;14430:21;;14464:140;14559:39;14576:21;14591:5;14576:21;;;14559:39;;14611:113;14694:24;14712:5;14694:24;;14731:152;14832:45;14852:24;14870:5;14852:24;;;14832:45;;14890:148;14989:43;15008:23;15025:5;15008:23;;15068:310;;15200:88;15281:6;15276:3;15200:88;;;15193:95;;15300:43;15336:6;15331:3;15324:5;15300:43;;;-1:-1;;15356:16;;15186:192;15386:343;;15496:38;15528:5;15496:38;;;15546:70;15609:6;15604:3;15546:70;;;15539:77;;15621:52;15666:6;15661:3;15654:4;15647:5;15643:16;15621:52;;;15694:29;15716:6;15694:29;;;15685:39;;;;15476:253;-1:-1;;;15476:253;15736:356;;15864:38;15896:5;15864:38;;;15914:88;15995:6;15990:3;15914:88;;;15907:95;;16007:52;16052:6;16047:3;16040:4;16033:5;16029:16;16007:52;;;16071:16;;;;;15844:248;-1:-1;;15844:248;16099:174;16206:61;16261:5;16206:61;;17098:301;;17258:66;17322:1;17317:3;17258:66;;;-1:-1;;;17337:25;;17390:2;17381:12;;17244:155;-1:-1;;17244:155;17408:301;;17568:66;17632:1;17627:3;17568:66;;;-1:-1;;;17647:25;;17700:2;17691:12;;17554:155;-1:-1;;17554:155;17718:375;;17878:67;17942:2;17937:3;17878:67;;;17978:34;17958:55;;-1:-1;;;18042:2;18033:12;;18026:30;18084:2;18075:12;;17864:229;-1:-1;;17864:229;18102:327;;18262:67;18326:2;18321:3;18262:67;;;18362:29;18342:50;;18420:2;18411:12;;18248:181;-1:-1;;18248:181;18438:370;;18598:67;18662:2;18657:3;18598:67;;;18698:34;18678:55;;-1:-1;;;18762:2;18753:12;;18746:25;18799:2;18790:12;;18584:224;-1:-1;;18584:224;18817:395;;18977:67;19041:2;19036:3;18977:67;;;19077:34;19057:55;;19146:28;19141:2;19132:12;;19125:50;19203:2;19194:12;;18963:249;-1:-1;;18963:249;19221:300;;19381:66;19445:1;19440:3;19381:66;;;-1:-1;;;19460:24;;19512:2;19503:12;;19367:154;-1:-1;;19367:154;19530:329;;19690:67;19754:2;19749:3;19690:67;;;19790:31;19770:52;;19850:2;19841:12;;19676:183;-1:-1;;19676:183;19868:301;;20028:66;20092:1;20087:3;20028:66;;;-1:-1;;;20107:25;;20160:2;20151:12;;20014:155;-1:-1;;20014:155;20178:301;;20338:66;20402:1;20397:3;20338:66;;;-1:-1;;;20417:25;;20470:2;20461:12;;20324:155;-1:-1;;20324:155;20488:301;;20648:66;20712:1;20707:3;20648:66;;;-1:-1;;;20727:25;;20780:2;20771:12;;20634:155;-1:-1;;20634:155;20798:301;;20958:66;21022:1;21017:3;20958:66;;;-1:-1;;;21037:25;;21090:2;21081:12;;20944:155;-1:-1;;20944:155;21108:370;;21268:67;21332:2;21327:3;21268:67;;;21368:34;21348:55;;-1:-1;;;21432:2;21423:12;;21416:25;21469:2;21460:12;;21254:224;-1:-1;;21254:224;21487:301;;21647:66;21711:1;21706:3;21647:66;;;-1:-1;;;21726:25;;21779:2;21770:12;;21633:155;-1:-1;;21633:155;21797:301;;21957:66;22021:1;22016:3;21957:66;;;-1:-1;;;22036:25;;22089:2;22080:12;;21943:155;-1:-1;;21943:155;22107:301;;22267:66;22331:1;22326:3;22267:66;;;-1:-1;;;22346:25;;22399:2;22390:12;;22253:155;-1:-1;;22253:155;22417:301;;22577:66;22641:1;22636:3;22577:66;;;-1:-1;;;22656:25;;22709:2;22700:12;;22563:155;-1:-1;;22563:155;22727:301;;22887:66;22951:1;22946:3;22887:66;;;-1:-1;;;22966:25;;23019:2;23010:12;;22873:155;-1:-1;;22873:155;23037:301;;23197:66;23261:1;23256:3;23197:66;;;-1:-1;;;23276:25;;23329:2;23320:12;;23183:155;-1:-1;;23183:155;23347:370;;23507:67;23571:2;23566:3;23507:67;;;23607:34;23587:55;;-1:-1;;;23671:2;23662:12;;23655:25;23708:2;23699:12;;23493:224;-1:-1;;23493:224;23726:312;;23886:67;23950:2;23945:3;23886:67;;;-1:-1;;;23966:35;;24029:2;24020:12;;23872:166;-1:-1;;23872:166;24047:301;;24207:66;24271:1;24266:3;24207:66;;;-1:-1;;;24286:25;;24339:2;24330:12;;24193:155;-1:-1;;24193:155;24357:301;;24517:66;24581:1;24576:3;24517:66;;;-1:-1;;;24596:25;;24649:2;24640:12;;24503:155;-1:-1;;24503:155;24667:311;;24827:67;24891:2;24886:3;24827:67;;;-1:-1;;;24907:34;;24969:2;24960:12;;24813:165;-1:-1;;24813:165;24987:376;;25147:67;25211:2;25206:3;25147:67;;;25247:34;25227:55;;-1:-1;;;25311:2;25302:12;;25295:31;25354:2;25345:12;;25133:230;-1:-1;;25133:230;25372:320;;25532:67;25596:2;25591:3;25532:67;;;-1:-1;;;25612:43;;25683:2;25674:12;;25518:174;-1:-1;;25518:174;25701:296;;25878:83;25959:1;25954:3;25878:83;;26006:300;;26166:66;26230:1;26225:3;26166:66;;;-1:-1;;;26245:24;;26297:2;26288:12;;26152:154;-1:-1;;26152:154;26315:312;;26475:67;26539:2;26534:3;26475:67;;;-1:-1;;;26555:35;;26618:2;26609:12;;26461:166;-1:-1;;26461:166;26636:301;;26796:66;26860:1;26855:3;26796:66;;;-1:-1;;;26875:25;;26928:2;26919:12;;26782:155;-1:-1;;26782:155;26946:373;;27106:67;27170:2;27165:3;27106:67;;;27206:34;27186:55;;-1:-1;;;27270:2;27261:12;;27254:28;27310:2;27301:12;;27092:227;-1:-1;;27092:227;27328:300;;27488:66;27552:1;27547:3;27488:66;;;-1:-1;;;27567:24;;27619:2;27610:12;;27474:154;-1:-1;;27474:154;27637:300;;27797:66;27861:1;27856:3;27797:66;;;-1:-1;;;27876:24;;27928:2;27919:12;;27783:154;-1:-1;;27783:154;27946:332;;28106:67;28170:2;28165:3;28106:67;;;28206:34;28186:55;;28269:2;28260:12;;28092:186;-1:-1;;28092:186;28516:107;28595:22;28611:5;28595:22;;28630:370;;28771:75;28842:3;28833:6;28771:75;;;28868:2;28863:3;28859:12;28852:19;;28882:69;28947:3;28938:6;28882:69;;;-1:-1;28973:1;28964:11;;28759:241;-1:-1;;28759:241;29007:383;;29154:75;29225:3;29216:6;29154:75;;;29251:2;29246:3;29242:12;29235:19;;29265:75;29336:3;29327:6;29265:75;;;-1:-1;29362:2;29353:12;;29142:248;-1:-1;;29142:248;29397:378;;29542:73;29611:3;29602:6;29542:73;;;29637:1;29632:3;29628:11;29621:18;;29650:75;29721:3;29712:6;29650:75;;29782:416;;29955:73;30024:3;30015:6;29955:73;;;30050:1;30045:3;30041:11;30034:18;;30070:103;30169:3;30160:6;30152;30070:103;;30205:282;;30359:103;30458:3;30449:6;30441;30359:103;;30494:262;;30638:93;30727:3;30718:6;30638:93;;30763:370;;30961:147;31104:3;30961:147;;31140:213;31258:2;31243:18;;31272:71;31247:9;31316:6;31272:71;;31360:324;31506:2;31491:18;;31520:71;31495:9;31564:6;31520:71;;;31602:72;31670:2;31659:9;31655:18;31646:6;31602:72;;31691:435;31865:2;31850:18;;31879:71;31854:9;31923:6;31879:71;;;31961:72;32029:2;32018:9;32014:18;32005:6;31961:72;;;32044;32112:2;32101:9;32097:18;32088:6;32044:72;;32133:771;32391:3;32376:19;;32406:71;32380:9;32450:6;32406:71;;;32488:72;32556:2;32545:9;32541:18;32532:6;32488:72;;;32571;32639:2;32628:9;32624:18;32615:6;32571:72;;;32654;32722:2;32711:9;32707:18;32698:6;32654:72;;;32737:73;32805:3;32794:9;32790:19;32781:6;32737:73;;;32821;32889:3;32878:9;32874:19;32865:6;32821:73;;;32362:542;;;;;;;;;;32911:408;33075:2;33060:18;;33089:71;33064:9;33133:6;33089:71;;;33208:9;33202:4;33198:20;33193:2;33182:9;33178:18;33171:48;33233:76;33304:4;33295:6;33233:76;;33326:324;33472:2;33457:18;;33486:71;33461:9;33530:6;33486:71;;;33568:72;33636:2;33625:9;33621:18;33612:6;33568:72;;33657:201;33769:2;33754:18;;33783:65;33758:9;33821:6;33783:65;;33865:213;33983:2;33968:18;;33997:71;33972:9;34041:6;33997:71;;34085:647;34309:3;34294:19;;34324:71;34298:9;34368:6;34324:71;;;34406:72;34474:2;34463:9;34459:18;34450:6;34406:72;;;34489;34557:2;34546:9;34542:18;34533:6;34489:72;;;34572;34640:2;34629:9;34625:18;34616:6;34572:72;;;34655:67;34717:3;34706:9;34702:19;34693:6;34655:67;;;34280:452;;;;;;;;;34739:1139;35129:3;35114:19;;35144:71;35118:9;35188:6;35144:71;;;35226:72;35294:2;35283:9;35279:18;35270:6;35226:72;;;35309:66;35371:2;35360:9;35356:18;35347:6;35309:66;;;35386:72;35454:2;35443:9;35439:18;35430:6;35386:72;;;35469:119;35583:3;35572:9;35568:19;35559:6;35469:119;;;35599;35713:3;35702:9;35698:19;35689:6;35599:119;;;35767:9;35761:4;35757:20;35751:3;35740:9;35736:19;35729:49;35792:76;35863:4;35854:6;35792:76;;;35784:84;35100:778;-1:-1;;;;;;;;;35100:778;35885:297;36021:2;36035:47;;;36006:18;;36096:76;36006:18;36158:6;36096:76;;36189:261;36331:2;36316:18;;36345:95;36320:9;36413:6;36345:95;;37281:407;37472:2;37486:47;;;37457:18;;37547:131;37457:18;37547:131;;37695:407;37886:2;37900:47;;;37871:18;;37961:131;37871:18;37961:131;;38109:407;38300:2;38314:47;;;38285:18;;38375:131;38285:18;38375:131;;38523:407;38714:2;38728:47;;;38699:18;;38789:131;38699:18;38789:131;;38937:407;39128:2;39142:47;;;39113:18;;39203:131;39113:18;39203:131;;39351:407;39542:2;39556:47;;;39527:18;;39617:131;39527:18;39617:131;;39765:407;39956:2;39970:47;;;39941:18;;40031:131;39941:18;40031:131;;40179:407;40370:2;40384:47;;;40355:18;;40445:131;40355:18;40445:131;;40593:407;40784:2;40798:47;;;40769:18;;40859:131;40769:18;40859:131;;41007:407;41198:2;41212:47;;;41183:18;;41273:131;41183:18;41273:131;;41421:407;41612:2;41626:47;;;41597:18;;41687:131;41597:18;41687:131;;41835:407;42026:2;42040:47;;;42011:18;;42101:131;42011:18;42101:131;;42249:407;42440:2;42454:47;;;42425:18;;42515:131;42425:18;42515:131;;42663:407;42854:2;42868:47;;;42839:18;;42929:131;42839:18;42929:131;;43077:407;43268:2;43282:47;;;43253:18;;43343:131;43253:18;43343:131;;43491:407;43682:2;43696:47;;;43667:18;;43757:131;43667:18;43757:131;;43905:407;44096:2;44110:47;;;44081:18;;44171:131;44081:18;44171:131;;44319:407;44510:2;44524:47;;;44495:18;;44585:131;44495:18;44585:131;;44733:407;44924:2;44938:47;;;44909:18;;44999:131;44909:18;44999:131;;45147:407;45338:2;45352:47;;;45323:18;;45413:131;45323:18;45413:131;;45561:407;45752:2;45766:47;;;45737:18;;45827:131;45737:18;45827:131;;45975:407;46166:2;46180:47;;;46151:18;;46241:131;46151:18;46241:131;;46389:407;46580:2;46594:47;;;46565:18;;46655:131;46565:18;46655:131;;46803:407;46994:2;47008:47;;;46979:18;;47069:131;46979:18;47069:131;;47217:407;47408:2;47422:47;;;47393:18;;47483:131;47393:18;47483:131;;47631:407;47822:2;47836:47;;;47807:18;;47897:131;47807:18;47897:131;;48045:407;48236:2;48250:47;;;48221:18;;48311:131;48221:18;48311:131;;48459:407;48650:2;48664:47;;;48635:18;;48725:131;48635:18;48725:131;;48873:407;49064:2;49078:47;;;49049:18;;49139:131;49049:18;49139:131;;49287:407;49478:2;49492:47;;;49463:18;;49553:131;49463:18;49553:131;;49701:407;49892:2;49906:47;;;49877:18;;49967:131;49877:18;49967:131;;50115:407;50306:2;50320:47;;;50291:18;;50381:131;50291:18;50381:131;;50529:407;50720:2;50734:47;;;50705:18;;50795:131;50705:18;50795:131;;51163:324;51309:2;51294:18;;51323:71;51298:9;51367:6;51323:71;;51494:435;51668:2;51653:18;;51682:71;51657:9;51726:6;51682:71;;;51764:72;51832:2;51821:9;51817:18;51808:6;51764:72;;51936:205;52050:2;52035:18;;52064:67;52039:9;52104:6;52064:67;;52148:256;52210:2;52204:9;52236:17;;;52311:18;52296:34;;52332:22;;;52293:62;52290:2;;;52368:1;52365;52358:12;52290:2;52384;52377:22;52188:216;;-1:-1;52188:216;52411:321;;52554:18;52546:6;52543:30;52540:2;;;52586:1;52583;52576:12;52540:2;-1:-1;52717:4;52653;52630:17;;;;-1:-1;;52626:33;52707:15;;52477:255;52947:108;-1:-1;53041:4;;53019:36;53062:108;-1:-1;53156:4;;53134:36;53177:121;53264:12;;53235:63;53559:106;53655:4;53646:14;;53632:33;54084:162;54186:19;;;54235:4;54226:14;;54179:67;54579:91;;54641:24;54659:5;54641:24;;54677:85;54743:13;54736:21;;54719:43;54848:144;-1:-1;;;;;;54909:78;;54892:100;55077:121;-1:-1;;;;;55139:54;;55122:76;55284:81;55355:4;55344:16;;55327:38;55372:169;;55475:61;55530:5;55475:61;;55688:145;55769:6;55764:3;55759;55746:30;-1:-1;55825:1;55807:16;;55800:27;55739:94;55842:268;55907:1;55914:101;55928:6;55925:1;55922:13;55914:101;;;55995:11;;;55989:18;55976:11;;;55969:39;55950:2;55943:10;55914:101;;;56030:6;56027:1;56024:13;56021:2;;;-1:-1;;56095:1;56077:16;;56070:27;55891:219;56118:95;;56182:26;56202:5;56182:26;;56220:90;;56281:24;56299:5;56281:24;;56478:89;;56542:20;56556:5;56542:20;;56574:88;;56636:21;56651:5;56636:21;;56669:97;56757:2;56737:14;-1:-1;;56733:28;;56717:49;56774:96;56849:3;56845:15;;56817:53;56878:94;56952:2;56948:14;;56920:52;56980:117;57049:24;57067:5;57049:24;;;57042:5;57039:35;57029:2;;57088:1;57085;57078:12;57104:111;57170:21;57185:5;57170:21;;57222:117;57291:24;57309:5;57291:24;
Swarm Source
bzzr://3dda0b32834fdc6842754d00487a5e5871c91908d8fb2da33be7c719c2317334
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.