Token B.AMM LUSD-ETH
Overview ERC20
Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
10.555071 LUSDETH
Holders:
24 addresses
Contract:
Decimals:
18
Balance
0.004558396500540947 LUSDETHValue
$0.00
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BAMM
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-06-06 */ // Sources flattened with hardhat v2.6.4 https://hardhat.org // File contracts/B.Protocol/crop.sol // SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2021 Dai Foundation // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. pragma solidity 0.6.11; interface VatLike { function urns(bytes32, address) external view returns (uint256, uint256); function gem(bytes32, address) external view returns (uint256); function slip(bytes32, address, int256) external; } interface ERC20 { function balanceOf(address owner) external view returns (uint256); function transfer(address dst, uint256 amount) external returns (bool); function transferFrom(address src, address dst, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function decimals() external returns (uint8); } // receives tokens and shares them among holders contract CropJoin { VatLike public immutable vat; // cdp engine bytes32 public immutable ilk; // collateral type ERC20 public immutable gem; // collateral token uint256 public immutable dec; // gem decimals ERC20 public immutable bonus; // rewards token uint256 public share; // crops per gem [ray] uint256 public total; // total gems [wad] uint256 public stock; // crop balance [wad] mapping (address => uint256) public crops; // crops per user [wad] mapping (address => uint256) public stake; // gems per user [wad] uint256 immutable internal to18ConversionFactor; uint256 immutable internal toGemConversionFactor; // --- Events --- event Join(uint256 val); event Exit(uint256 val); event Flee(); event Tack(address indexed src, address indexed dst, uint256 wad); constructor(address vat_, bytes32 ilk_, address gem_, address bonus_) public { vat = VatLike(vat_); ilk = ilk_; gem = ERC20(gem_); uint256 dec_ = ERC20(gem_).decimals(); require(dec_ <= 18); dec = dec_; to18ConversionFactor = 10 ** (18 - dec_); toGemConversionFactor = 10 ** dec_; bonus = ERC20(bonus_); } function add(uint256 x, uint256 y) public pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) public pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) public pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } function divup(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(x, sub(y, 1)) / y; } uint256 constant WAD = 10 ** 18; function wmul(uint256 x, uint256 y) public pure returns (uint256 z) { z = mul(x, y) / WAD; } function wdiv(uint256 x, uint256 y) public pure returns (uint256 z) { z = mul(x, WAD) / y; } function wdivup(uint256 x, uint256 y) public pure returns (uint256 z) { z = divup(mul(x, WAD), y); } uint256 constant RAY = 10 ** 27; function rmul(uint256 x, uint256 y) public pure returns (uint256 z) { z = mul(x, y) / RAY; } function rmulup(uint256 x, uint256 y) public pure returns (uint256 z) { z = divup(mul(x, y), RAY); } function rdiv(uint256 x, uint256 y) public pure returns (uint256 z) { z = mul(x, RAY) / y; } // Net Asset Valuation [wad] function nav() public virtual returns (uint256) { uint256 _nav = gem.balanceOf(address(this)); return mul(_nav, to18ConversionFactor); } // Net Assets per Share [wad] function nps() public returns (uint256) { if (total == 0) return WAD; else return wdiv(nav(), total); } function crop() internal virtual returns (uint256) { return sub(bonus.balanceOf(address(this)), stock); } function harvest(address from, address to) internal { if (total > 0) share = add(share, rdiv(crop(), total)); uint256 last = crops[from]; uint256 curr = rmul(stake[from], share); if (curr > last) require(bonus.transfer(to, curr - last)); stock = bonus.balanceOf(address(this)); } function join(address urn, uint256 val) internal virtual { harvest(urn, urn); if (val > 0) { uint256 wad = wdiv(mul(val, to18ConversionFactor), nps()); // Overflow check for int256(wad) cast below // Also enforces a non-zero wad require(int256(wad) > 0); require(gem.transferFrom(msg.sender, address(this), val)); vat.slip(ilk, urn, int256(wad)); total = add(total, wad); stake[urn] = add(stake[urn], wad); } crops[urn] = rmulup(stake[urn], share); emit Join(val); } function exit(address guy, uint256 val) internal virtual { harvest(msg.sender, guy); if (val > 0) { uint256 wad = wdivup(mul(val, to18ConversionFactor), nps()); // Overflow check for int256(wad) cast below // Also enforces a non-zero wad require(int256(wad) > 0); require(gem.transfer(guy, val)); vat.slip(ilk, msg.sender, -int256(wad)); total = sub(total, wad); stake[msg.sender] = sub(stake[msg.sender], wad); } crops[msg.sender] = rmulup(stake[msg.sender], share); emit Exit(val); } } // File contracts/B.Protocol/CropJoinAdapter.sol // : MIT pragma solidity 0.6.11; // NOTE! - this is not an ERC20 token. transfer is not supported. contract CropJoinAdapter is CropJoin { string constant public name = "B.AMM LUSD-ETH"; string constant public symbol = "LUSDETH"; uint constant public decimals = 18; event Transfer(address indexed _from, address indexed _to, uint256 _value); constructor(address _lqty) public CropJoin(address(new Dummy()), "B.AMM", address(new DummyGem()), _lqty) { } // adapter to cropjoin function nav() public override returns (uint256) { return total; } function totalSupply() public view returns (uint256) { return total; } function balanceOf(address owner) public view returns (uint256 balance) { balance = stake[owner]; } function mint(address to, uint value) virtual internal { join(to, value); emit Transfer(address(0), to, value); } function burn(address owner, uint value) virtual internal { exit(owner, value); emit Transfer(owner, address(0), value); } } contract Dummy { fallback() external {} } contract DummyGem is Dummy { function transfer(address, uint) external pure returns(bool) { return true; } function transferFrom(address, address, uint) external pure returns(bool) { return true; } function decimals() external pure returns(uint) { return 18; } } // File contracts/B.Protocol/Dependencies/SafeMath.sol // : MIT pragma solidity 0.6.11; /** * Based on OpenZeppelin's SafeMath: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol * * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/B.Protocol/PriceFormula.sol // : MIT pragma solidity 0.6.11; contract PriceFormula { using SafeMath for uint256; function getSumFixedPoint(uint x, uint y, uint A) public pure returns(uint) { if(x == 0 && y == 0) return 0; uint sum = x.add(y); for(uint i = 0 ; i < 255 ; i++) { uint dP = sum; dP = dP.mul(sum) / (x.mul(2)).add(1); dP = dP.mul(sum) / (y.mul(2)).add(1); uint prevSum = sum; uint n = (A.mul(2).mul(x.add(y)).add(dP.mul(2))).mul(sum); uint d = (A.mul(2).sub(1).mul(sum)); sum = n / d.add(dP.mul(3)); if(sum <= prevSum.add(1) && prevSum <= sum.add(1)) break; } return sum; } function getReturn(uint xQty, uint xBalance, uint yBalance, uint A) public pure returns(uint) { uint sum = getSumFixedPoint(xBalance, yBalance, A); uint c = sum.mul(sum) / (xQty.add(xBalance)).mul(2); c = c.mul(sum) / A.mul(4); uint b = (xQty.add(xBalance)).add(sum / A.mul(2)); uint yPrev = 0; uint y = sum; for(uint i = 0 ; i < 255 ; i++) { yPrev = y; uint n = (y.mul(y)).add(c); uint d = y.mul(2).add(b).sub(sum); y = n / d; if(y <= yPrev.add(1) && yPrev <= y.add(1)) break; } return yBalance.sub(y).sub(1); } } // File contracts/B.Protocol/Interfaces/IPriceFeed.sol // : MIT pragma solidity 0.6.11; interface IPriceFeed { // --- Events --- event LastGoodPriceUpdated(uint _lastGoodPrice); // --- Function --- function fetchPrice() external returns (uint); } // File contracts/B.Protocol/Dependencies/IERC20.sol // : MIT pragma solidity 0.6.11; /** * Based on the OpenZeppelin IER20 interface: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol * * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/B.Protocol/Dependencies/Ownable.sol // : MIT pragma solidity 0.6.11; /** * Based on OpenZeppelin's Ownable contract: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol * * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. * * NOTE: This function is not safe, as it doesn’t check owner is calling it. * Make sure you check it before calling it. */ function _renounceOwnership() internal { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } } // File contracts/B.Protocol/Dependencies/AggregatorV3Interface.sol // : MIT // Code from https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol pragma solidity 0.6.11; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File contracts/B.Protocol/BAMM.sol // : MIT pragma solidity 0.6.11; interface StabilityPoolLike { function withdrawFromSP(uint256 _amount) external; function provideToSP(uint256 _amount) external; function getCompoundedVSTDeposit(address _depositor) external view returns (uint256); function getDepositorAssetGain(address _depositor) external view returns (uint256); } contract BAMM is CropJoinAdapter, PriceFormula, Ownable { using SafeMath for uint256; AggregatorV3Interface public immutable priceAggregator; IERC20 public immutable LUSD; IERC20 public immutable collateral; StabilityPoolLike immutable public SP; address payable public immutable feePool; uint public constant MAX_FEE = 100; // 1% uint public fee = 0; // fee in bps uint public A = 20; uint public constant MIN_A = 20; uint public constant MAX_A = 200; uint public immutable maxDiscount; // max discount in bips address public immutable frontEndTag; uint constant public PRECISION = 1e18; event ParamsSet(uint A, uint fee); event UserDeposit(address indexed user, uint lusdAmount, uint numShares); event UserWithdraw(address indexed user, uint lusdAmount, uint ethAmount, uint numShares); event RebalanceSwap(address indexed user, uint lusdAmount, uint ethAmount, uint timestamp); constructor( address _priceAggregator, address payable _SP, address _LUSD, address _LQTY, address _collateral, uint _maxDiscount, address payable _feePool, address _fronEndTag) public CropJoinAdapter(_LQTY) { priceAggregator = AggregatorV3Interface(_priceAggregator); LUSD = IERC20(_LUSD); collateral = IERC20(_collateral); SP = StabilityPoolLike(_SP); feePool = _feePool; maxDiscount = _maxDiscount; frontEndTag = _fronEndTag; } function setParams(uint _A, uint _fee) external onlyOwner { require(_fee <= MAX_FEE, "setParams: fee is too big"); require(_A >= MIN_A, "setParams: A too small"); require(_A <= MAX_A, "setParams: A too big"); fee = _fee; A = _A; emit ParamsSet(_A, _fee); } function fetchPrice() public view returns(uint) { uint chainlinkDecimals; uint chainlinkLatestAnswer; uint chainlinkTimestamp; // First, try to get current decimal precision: try priceAggregator.decimals() returns (uint8 decimals) { // If call to Chainlink succeeds, record the current decimal precision chainlinkDecimals = decimals; } catch { // If call to Chainlink aggregator reverts, return a zero response with success = false return 0; } // Secondly, try to get latest price data: try priceAggregator.latestRoundData() returns ( uint80 /* roundId */, int256 answer, uint256 /* startedAt */, uint256 timestamp, uint80 /* answeredInRound */ ) { // If call to Chainlink succeeds, return the response and success = true chainlinkLatestAnswer = uint(answer); chainlinkTimestamp = timestamp; } catch { // If call to Chainlink aggregator reverts, return a zero response with success = false return 0; } if(chainlinkTimestamp + 1 hours < now) return 0; // price is down uint chainlinkFactor = 10 ** chainlinkDecimals; return chainlinkLatestAnswer.mul(PRECISION) / chainlinkFactor; } function deposit(uint lusdAmount) external { // update share uint lusdValue = SP.getCompoundedVSTDeposit(address(this)); uint ethValue = getCollateralBalance(); uint price = fetchPrice(); require(ethValue == 0 || price > 0, "deposit: chainlink is down"); uint totalValue = lusdValue.add(ethValue.mul(price) / PRECISION); // this is in theory not reachable. if it is, better halt deposits // the condition is equivalent to: (totalValue = 0) ==> (total = 0) require(totalValue > 0 || total == 0, "deposit: system is rekt"); uint newShare = PRECISION; if(total > 0) newShare = total.mul(lusdAmount) / totalValue; // deposit require(LUSD.transferFrom(msg.sender, address(this), lusdAmount), "deposit: transferFrom failed"); SP.provideToSP(lusdAmount); // update LP token mint(msg.sender, newShare); emit UserDeposit(msg.sender, lusdAmount, newShare); } function withdraw(uint numShares) external { uint lusdValue = SP.getCompoundedVSTDeposit(address(this)); uint ethValue = getCollateralBalance(); uint lusdAmount = lusdValue.mul(numShares).div(total); uint ethAmount = ethValue.mul(numShares).div(total); // this withdraws lusd, lqty, and eth SP.withdrawFromSP(lusdAmount); // update LP token burn(msg.sender, numShares); // send lusd and eth if(lusdAmount > 0) LUSD.transfer(msg.sender, lusdAmount); if(ethAmount > 0) { sendCollateral(msg.sender, ethAmount); } emit UserWithdraw(msg.sender, lusdAmount, ethAmount, numShares); } function addBps(uint n, int bps) internal pure returns(uint) { require(bps <= 10000, "reduceBps: bps exceeds max"); require(bps >= -10000, "reduceBps: bps exceeds min"); return n.mul(uint(10000 + bps)) / 10000; } function getSwapEthAmount(uint lusdQty) public view returns(uint ethAmount, uint feeLusdAmount) { uint lusdBalance = SP.getCompoundedVSTDeposit(address(this)); uint ethBalance = getCollateralBalance(); uint eth2usdPrice = fetchPrice(); if(eth2usdPrice == 0) return (0, 0); // chainlink is down uint ethUsdValue = ethBalance.mul(eth2usdPrice) / PRECISION; uint maxReturn = addBps(lusdQty.mul(PRECISION) / eth2usdPrice, int(maxDiscount)); uint xQty = lusdQty; uint xBalance = lusdBalance; uint yBalance = lusdBalance.add(ethUsdValue.mul(2)); uint usdReturn = getReturn(xQty, xBalance, yBalance, A); uint basicEthReturn = usdReturn.mul(PRECISION) / eth2usdPrice; if(ethBalance < basicEthReturn) basicEthReturn = ethBalance; // cannot give more than balance if(maxReturn < basicEthReturn) basicEthReturn = maxReturn; ethAmount = basicEthReturn; feeLusdAmount = addBps(lusdQty, int(fee)).sub(lusdQty); } // get ETH in return to LUSD function swap(uint lusdAmount, uint minEthReturn, address payable dest) public returns(uint) { (uint ethAmount, uint feeAmount) = getSwapEthAmount(lusdAmount); require(ethAmount >= minEthReturn, "swap: low return"); LUSD.transferFrom(msg.sender, address(this), lusdAmount); SP.provideToSP(lusdAmount.sub(feeAmount)); if(feeAmount > 0) LUSD.transfer(feePool, feeAmount); sendCollateral(dest, ethAmount); // re-entry is fine here emit RebalanceSwap(msg.sender, lusdAmount, ethAmount, now); return ethAmount; } // kyber network reserve compatible function function trade( IERC20 /* srcToken */, uint256 srcAmount, IERC20 /* destToken */, address payable destAddress, uint256 /* conversionRate */, bool /* validate */ ) external payable returns (bool) { return swap(srcAmount, 0, destAddress) > 0; } function getConversionRate( IERC20 /* src */, IERC20 /* dest */, uint256 srcQty, uint256 /* blockNumber */ ) external view returns (uint256) { (uint ethQty, ) = getSwapEthAmount(srcQty); return ethQty.mul(PRECISION) / srcQty; } receive() external payable {} // multi collateral competability function collaterals(uint index) public view returns(address) { require(index == 0, "only one collateral"); return address(collateral); } function sendCollateral(address to, uint amount) internal { if(collateral == IERC20(0x0)) { (bool success, ) = to.call{ value: amount }(""); require(success, "sendCollateral: sending ETH failed"); } else { require(collateral.transfer(to, amount), "sendCollateral: swap failed"); } } function getCollateralBalance() public view returns(uint) { uint spBalance = SP.getDepositorAssetGain(address(this)); uint contractBalance; if(collateral == IERC20(0x0)) { contractBalance = address(this).balance; } else { contractBalance = collateral.balanceOf(address(this)); } return spBalance.add(contractBalance); } function getCollateralValue() public view returns(bool succ, uint value) { uint ethValue = getCollateralBalance(); uint price = fetchPrice(); succ = price > 0; value = (ethValue.mul(price) / PRECISION); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_priceAggregator","type":"address"},{"internalType":"address payable","name":"_SP","type":"address"},{"internalType":"address","name":"_LUSD","type":"address"},{"internalType":"address","name":"_LQTY","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_maxDiscount","type":"uint256"},{"internalType":"address payable","name":"_feePool","type":"address"},{"internalType":"address","name":"_fronEndTag","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[],"name":"Flee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"A","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RebalanceSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Tack","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"UserDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"UserWithdraw","type":"event"},{"inputs":[],"name":"A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSD","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SP","outputs":[{"internalType":"contract StabilityPoolLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"add","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonus","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"collaterals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"crops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frontEndTag","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gem","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralValue","outputs":[{"internalType":"bool","name":"succ","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"xQty","type":"uint256"},{"internalType":"uint256","name":"xBalance","type":"uint256"},{"internalType":"uint256","name":"yBalance","type":"uint256"},{"internalType":"uint256","name":"A","type":"uint256"}],"name":"getReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"A","type":"uint256"}],"name":"getSumFixedPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdQty","type":"uint256"}],"name":"getSwapEthAmount","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"feeLusdAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"mul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAggregator","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmulup","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_A","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"sub","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"internalType":"uint256","name":"minEthReturn","type":"uint256"},{"internalType":"address payable","name":"dest","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"trade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract VatLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wdivup","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610240604052600060065560146007553480156200001c57600080fd5b50604051620036d3380380620036d383398181016040526101008110156200004357600080fd5b50805160208201516040808401516060850151608086015160a087015160c088015160e090980151945196979596939592949193909291908590620000889062000240565b604051809103906000f080158015620000a5573d6000803e3d6000fd5b5064422e414d4d60d81b604051620000bd906200024d565b604051809103906000f080158015620000da573d6000803e3d6000fd5b506001600160601b0319606084811b821660805260a084905282901b1660c0526040805163313ce56760e01b8152905185916000916001600160a01b0385169163313ce56791600480830192602092919082900301818787803b1580156200014157600080fd5b505af115801562000156573d6000803e3d6000fd5b505050506040513d60208110156200016d57600080fd5b505160ff16905060128111156200018357600080fd5b60e08190526012819003600a90810a610120520a6101405260601b6001600160601b03191661010052505060058054336001600160a01b03199091168117909155604051909250600091507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606098891b81166101605295881b86166101805292871b85166101a05294861b84166101c05293851b83166101e0526102009390935250911b16610220526200025b565b6065806200353c83390190565b61013280620035a183390190565b60805160601c60a05160c05160601c60e0516101005160601c61012051610140516101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c610200516102205160601c61319b620003a160003980611421525080611ccc528061201d52508061164e52806118a2525080610efd528061113d528061120652806113dc5280611591528061195b5280611c025280611f01525080610f755280610fc852806110cc528061219b528061259052806126545250806112b95280611513528061161f5280611b3b5280612141525080610d4b5280610dde528061138a525050806129d15280612c305250806117615280612f065280612fdb528061307d5250806118c65250806117da5280612a135280612c9d525080611ed85280612ad65280612d4b5250806113b35280612b165280612d1c525061319b6000f3fe6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f0000000000000000000000000000000000000000000000000000000000000000919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601281565b7f000000000000000000000000000000000000000000000000000000000000000081565b60c881565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000000006127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000006120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000006120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cdd3fde7f000000000000000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b00336080604052348015600f57600080fd5b50604880601d6000396000f3fe6080604052348015600f57600080fd5b5000fea2646970667358221220c9dbde2b8bd5037d447820e2775b3e09ebae168220c996babde4dae9f370b5d564736f6c634300060b0033608060405234801561001057600080fd5b50610112806100206000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c806323b872dd14603e578063313ce567146085578063a9059cbb14609d575b005b607160048036036060811015605257600080fd5b506001600160a01b0381358116916020810135909116906040013560c6565b604080519115158252519081900360200190f35b608b60cf565b60408051918252519081900360200190f35b60716004803603604081101560b157600080fd5b506001600160a01b03813516906020013560d4565b60019392505050565b601290565b60019291505056fea2646970667358221220e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a81396164736f6c634300060b00330000000000000000000000004db1d29ea5b51ddadcc5ab26709dda49e7eb1e710000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a900000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f00000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee550000000000000000000000000000000000000000000000000000000000000320000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f0
Deployed Bytecode
0x6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f0000000000000000000000004db1d29ea5b51ddadcc5ab26709dda49e7eb1e716001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f0000000000000000000000004db1d29ea5b51ddadcc5ab26709dda49e7eb1e716001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a9169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee556001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee5516916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee55919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a9169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a96001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f0000000000000000000000004db1d29ea5b51ddadcc5ab26709dda49e7eb1e7181565b601281565b7f0000000000000000000000003598dc7f39ddd0e603ff62ffc0024902d0dd695981565b60c881565b7f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a981565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a9166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f176001600160a01b031663a9059cbb7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f081565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f0000000000000000000000004550e384456185bdaf83a6317c1ca22806050c7981565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a3981565b7f000000000000000000000000000000000000000000000000000000000000001281565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a9169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a96001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000032081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f422e414d4d00000000000000000000000000000000000000000000000000000081565b60008060007f0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a96001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000003206127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1781565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee5581565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee556001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee556001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000016120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f0000000000000000000000004550e384456185bdaf83a6317c1ca22806050c796001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f422e414d4d00000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f0000000000000000000000003598dc7f39ddd0e603ff62ffc0024902d0dd69591692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000016120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f0000000000000000000000004550e384456185bdaf83a6317c1ca22806050c7916916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f0000000000000000000000003598dc7f39ddd0e603ff62ffc0024902d0dd69596001600160a01b0316637cdd3fde7f422e414d4d00000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f06001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f016916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f016916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004db1d29ea5b51ddadcc5ab26709dda49e7eb1e710000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a900000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f00000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee550000000000000000000000000000000000000000000000000000000000000320000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f0
-----Decoded View---------------
Arg [0] : _priceAggregator (address): 0x4Db1d29eA5b51dDADcc5Ab26709dDA49e7eB1E71
Arg [1] : _SP (address): 0x0B1Be49dcB62D6cbc27e510361E910a8A30f37A9
Arg [2] : _LUSD (address): 0x64343594Ab9b56e99087BfA6F2335Db24c2d1F17
Arg [3] : _LQTY (address): 0xfF6C71cE5B7E07D36cE850D35088518E9Af171F0
Arg [4] : _collateral (address): 0x6C2C06790b3E3E3c38e12Ee22F8183b37a13EE55
Arg [5] : _maxDiscount (uint256): 800
Arg [6] : _feePool (address): 0xf2bb803010FA55ab60aF1a4740d1A1D6c9C93a39
Arg [7] : _fronEndTag (address): 0xfF6C71cE5B7E07D36cE850D35088518E9Af171F0
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000004db1d29ea5b51ddadcc5ab26709dda49e7eb1e71
Arg [1] : 0000000000000000000000000b1be49dcb62d6cbc27e510361e910a8a30f37a9
Arg [2] : 00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17
Arg [3] : 000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f0
Arg [4] : 0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee55
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [6] : 000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39
Arg [7] : 000000000000000000000000ff6c71ce5b7e07d36ce850d35088518e9af171f0
Deployed ByteCode Sourcemap
22896:9093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14509:672;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14509:672:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;6659:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4219:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4219:106:0;;;;;;;:::i;24823:1428::-;;;;;;;;;;;;;:::i;31300:429::-;;;;;;;;;;;;;:::i;7143:84::-;;;;;;;;;;;;;:::i;3828:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3828:114:0;;;;;;;:::i;30750:160::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30750:160:0;;:::i;:::-;;;;-1:-1:-1;;;;;30750:160:0;;;;;;;;;;;;;;2243:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2243:41:0;-1:-1:-1;;;;;2243:41:0;;:::i;2170:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2170:41:0;-1:-1:-1;;;;;2170:41:0;;:::i;2052:24::-;;;;;;;;;;;;;:::i;27303:733::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27303:733:0;;:::i;:::-;;22994:54;;;;;;;;;;;;;:::i;6760:34::-;;;;;;;;;;;;;:::i;1696:32::-;;;;;;;;;;;;;:::i;23378:::-;;;;;;;;;;;;;:::i;23135:37::-;;;;;;;;;;;;;:::i;4099:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4099:114:0;;;;;;;:::i;23489:36::-;;;;;;;;;;;;;:::i;3716:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3716:106:0;;;;;;;:::i;3987:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3987:106:0;;;;;;;:::i;30052:315::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30052:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;29400:594;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29400:594:0;;;;;;;;;;;-1:-1:-1;;;;;29400:594:0;;:::i;23340:31::-;;;;;;;;;;;;;:::i;7235:113::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7235:113:0;-1:-1:-1;;;;;7235:113:0;;:::i;1933:34::-;;;;;;;;;;;;;:::i;3006:135::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3006:135:0;;;;;;;:::i;1813:32::-;;;;;;;;;;;;;:::i;30375:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30375:291:0;;;;;;;;;;;;;;;;;;;;;;:::i;3604:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3604:106:0;;;;;;;:::i;19886:79::-;;;;;;;;;;;;;:::i;20252:92::-;;;;;;;;;;;;;:::i;6712:41::-;;;;;;;;;;;;;:::i;1994:24::-;;;;;;;;;;;;;:::i;23534:37::-;;;;;;;;;;;;;:::i;23181:40::-;;;;;;;;;;;;;:::i;1875:32::-;;;;;;;;;;;;;:::i;3147:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3147:136:0;;;;;;;:::i;26259:1036::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26259:1036:0;;:::i;23423:33::-;;;;;;;;;;;;;:::i;23228:34::-;;;;;;;;;;;;;:::i;2110:24::-;;;;;;;;;;;;;:::i;24496:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24496:319:0;;;;;;;:::i;31737:249::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1752:32;;;;;;;;;;;;;:::i;28298:1060::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28298:1060:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3289:149;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3289:149:0;;;;;;;:::i;23055:28::-;;;;;;;;;;;;;:::i;4569:126::-;;;;;;;;;;;;;:::i;23090:34::-;;;;;;;;;;;;;:::i;23275:19::-;;;;;;;;;;;;;:::i;13863:638::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13863:638:0;;;;;;;;;;;;:::i;20352:192::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20352:192:0;-1:-1:-1;;;;;20352:192:0;;:::i;23315:18::-;;;;;;;;;;;;;:::i;14509:672::-;14597:4;14614:8;14625:39;14642:8;14652;14662:1;14625:16;:39::i;:::-;14614:50;-1:-1:-1;14677:6:0;14701:27;14726:1;14702:18;:4;14711:8;14702:18;:8;:18;:::i;:::-;14701:24;:27;:24;:27;:::i;:::-;14686:12;14694:3;;14686:12;:7;:12;:::i;:::-;:42;;;;;;;-1:-1:-1;14756:8:0;:1;14762;14756:8;:5;:8;:::i;:::-;14743:10;:1;14749:3;14743:10;:5;:10;:::i;:::-;:21;;;;;;;-1:-1:-1;14775:6:0;14784:40;14815:8;:1;14821;14815:8;:5;:8;:::i;:::-;14809:3;:14;;;;;;14785:18;:4;14794:8;14785:18;:8;:18;:::i;:::-;14784:24;:40;:24;:40;:::i;:::-;14775:49;-1:-1:-1;14835:10:0;14869:3;14835:10;14885:247;14906:3;14902:1;:7;14885:247;;;14940:1;;-1:-1:-1;14940:1:0;;14956:6;14965:17;14980:1;14966:8;14940:1;;14966:8;:5;:8;:::i;14965:17::-;14956:26;-1:-1:-1;14997:6:0;15006:24;15026:3;15006:15;15019:1;15006:8;:1;15012;15006:8;:5;:8;:::i;:15::-;:19;:24;:19;:24;:::i;:::-;14997:33;;15054:1;15050;:5;;;;;;;-1:-1:-1;15080:12:0;:5;15090:1;15080:12;:9;:12;:::i;:::-;15075:1;:17;;:38;;;;-1:-1:-1;15105:8:0;:1;15111;15105:8;:5;:8;:::i;:::-;15096:5;:17;;15075:38;15072:48;;;15115:5;;;;15072:48;-1:-1:-1;;14912:3:0;;14885:247;;;-1:-1:-1;15151:22:0;15171:1;15151:15;:8;15164:1;15151:15;:12;:15;:::i;:22::-;15144:29;14509:672;-1:-1:-1;;;;;;;;;;14509:672:0:o;6659:46::-;;;;;;;;;;;;;;-1:-1:-1;;;6659:46:0;;;;:::o;4219:106::-;4276:9;4316:1;4302:11;4306:1;3972:8;4302:3;:11::i;:::-;:15;;;;;;;4219:106;-1:-1:-1;;;4219:106:0:o;24823:1428::-;24865:4;24882:22;24915:26;24952:23;25049:15;-1:-1:-1;;;;;25049:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25049:26:0;;;25045:338;;25370:1;25363:8;;;;;;;25045:338;25200:28;;;-1:-1:-1;25451:15:0;-1:-1:-1;;;;;25451:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25451:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:589;;26023:1;26016:8;;;;;;;25447:589;-1:-1:-1;25829:6:0;;-1:-1:-1;25872:9:0;;-1:-1:-1;;;26082:3:0;26051:18;26072:7;26051:28;:34;26048:47;;;26094:1;26087:8;;;;;;;26048:47;26148:2;:23;;;;26189:36;:21;23567:4;26189:36;:25;:36;:::i;:::-;:54;;;;;;26182:61;;;;;;24823:1428;;:::o;31300:429::-;31386:39;;;-1:-1:-1;;;31386:39:0;;31419:4;31386:39;;;;;;31352:4;;;;-1:-1:-1;;;;;31386:2:0;:24;;;;:39;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31386:39:0;;-1:-1:-1;31436:20:0;31472:10;-1:-1:-1;;;;;31472:25:0;31469:203;;-1:-1:-1;31532:21:0;31469:203;;;31625:35;;;-1:-1:-1;;;31625:35:0;;31654:4;31625:35;;;;;;-1:-1:-1;;;;;31625:10:0;:20;;;;:35;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31625:35:0;;-1:-1:-1;31469:203:0;31691:30;:9;31705:15;31691:30;:13;:30;:::i;:::-;31684:37;;;;31300:429;:::o;7143:84::-;7214:5;;7143:84;:::o;3828:114::-;3887:9;3913:21;3919:11;3923:1;3589:8;3919:3;:11::i;:::-;3932:1;3913:5;:21::i;:::-;3909:25;3828:114;-1:-1:-1;;;3828:114:0:o;30750:160::-;30803:7;30831:10;;30823:42;;;;;-1:-1:-1;;;30823:42:0;;;;;;;;;;;;-1:-1:-1;;;30823:42:0;;;;;;;;;;;;;;;-1:-1:-1;30891:10:0;30750:160;;;:::o;2243:41::-;;;;;;;;;;;;;:::o;2170:::-;;;;;;;;;;;;;:::o;2052:24::-;;;;:::o;27303:733::-;27374:41;;;-1:-1:-1;;;27374:41:0;;27409:4;27374:41;;;;;;27357:14;;-1:-1:-1;;;;;27374:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27374:41:0;;-1:-1:-1;27426:13:0;27442:22;:20;:22::i;:::-;27426:38;;27477:15;27495:35;27524:5;;27495:24;27509:9;27495;:13;;:24;;;;:::i;:::-;:28;:35;:28;:35;:::i;:::-;27477:53;;27541:14;27558:34;27586:5;;27558:23;27571:9;27558:8;:12;;:23;;;;:::i;:34::-;27541:51;;27652:2;-1:-1:-1;;;;;27652:17:0;;27670:10;27652:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27722:27;27727:10;27739:9;27722:4;:27::i;:::-;27795:14;;27792:56;;27811:37;;;-1:-1:-1;;;27811:37:0;;27825:10;27811:37;;;;;;;;;;;;-1:-1:-1;;;;;27811:4:0;:13;;;;:37;;;;;;;;;;;;;;-1:-1:-1;27811:13:0;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27792:56:0;27862:13;;27859:82;;27892:37;27907:10;27919:9;27892:14;:37::i;:::-;27958:58;;;;;;;;;;;;;;;;;;;;27971:10;;27958:58;;;;;;;;;;27303:733;;;;;:::o;22994:54::-;;;:::o;6760:34::-;6792:2;6760:34;:::o;1696:32::-;;;:::o;23378:::-;23407:3;23378:32;:::o;23135:37::-;;;:::o;4099:114::-;4158:9;4184:21;4190:9;4194:1;4197;4190:3;:9::i;:::-;3972:8;4184:5;:21::i;23489:36::-;;;:::o;3716:106::-;3773:9;3813:1;3799:11;3803:1;3589:8;3799:3;:11::i;3987:106::-;4044:9;3972:8;4070:9;4074:1;4077;4070:3;:9::i;30052:315::-;30300:4;30358:1;30324:31;30329:9;30340:1;30343:11;30324:4;:31::i;:::-;:35;;30052:315;-1:-1:-1;;;;;;;30052:315:0:o;29400:594::-;29487:4;29505:14;29521;29539:28;29556:10;29539:16;:28::i;:::-;29504:63;;;;29601:12;29588:9;:25;;29580:54;;;;;-1:-1:-1;;;29580:54:0;;;;;;;;;;;;-1:-1:-1;;;29580:54:0;;;;;;;;;;;;;;;29647:56;;;-1:-1:-1;;;29647:56:0;;29665:10;29647:56;;;;29685:4;29647:56;;;;;;;;;;;;-1:-1:-1;;;;;29647:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;29647:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;29714:2:0;:14;;29729:25;:10;29744:9;29729:25;:14;:25;:::i;:::-;29714:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29783:1;29771:9;:13;29768:51;;;29786:4;-1:-1:-1;;;;;29786:13:0;;29800:7;29809:9;29786:33;;;;;;;;;;;;;-1:-1:-1;;;;;29786:33:0;-1:-1:-1;;;;;29786:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29768:51:0;29830:31;29845:4;29851:9;29830:14;:31::i;:::-;29904:53;;;;;;;;;;;;29953:3;29904:53;;;;;;29918:10;;29904:53;;;;;;;;;;-1:-1:-1;29977:9:0;29400:594;-1:-1:-1;;;;29400:594:0:o;23340:31::-;23369:2;23340:31;:::o;7235:113::-;-1:-1:-1;;;;;7328:12:0;7290:15;7328:12;;;:5;:12;;;;;;;7235:113::o;1933:34::-;;;:::o;3006:135::-;3097:5;;;3092:16;;;;3084:49;;;;;-1:-1:-1;;;3084:49:0;;;;;;;;;;;;-1:-1:-1;;;3084:49:0;;;;;;;;;;;;;;;3006:135;;;;:::o;1813:32::-;;;:::o;30375:291::-;30548:7;30569:11;30586:24;30603:6;30586:16;:24::i;:::-;-1:-1:-1;30568:42:0;-1:-1:-1;30652:6:0;30628:21;30568:42;23567:4;30628:21;:10;:21;:::i;:::-;:30;;;;;;;30375:291;-1:-1:-1;;;;;;30375:291:0:o;3604:106::-;3661:9;3589:8;3687:9;3691:1;3694;3687:3;:9::i;19886:79::-;19951:6;;-1:-1:-1;;;;;19951:6:0;19886:79;:::o;20252:92::-;20330:6;;-1:-1:-1;;;;;20330:6:0;20316:10;:20;;20252:92::o;6712:41::-;;;;;;;;;;;;;;-1:-1:-1;;;6712:41:0;;;;:::o;1994:24::-;;;;:::o;23534:37::-;23567:4;23534:37;:::o;23181:40::-;;;:::o;1875:32::-;;;:::o;3147:136::-;3238:5;;;3233:16;;;;3225:50;;;;;-1:-1:-1;;;3225:50:0;;;;;;;;;;;;-1:-1:-1;;;3225:50:0;;;;;;;;;;;;;;26259:1036;26363:41;;;-1:-1:-1;;;26363:41:0;;26398:4;26363:41;;;;;;26346:14;;-1:-1:-1;;;;;26363:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26363:41:0;;-1:-1:-1;26415:13:0;26431:22;:20;:22::i;:::-;26415:38;;26466:10;26479:12;:10;:12::i;:::-;26466:25;-1:-1:-1;26510:13:0;;;:26;;;26535:1;26527:5;:9;26510:26;26502:65;;;;;-1:-1:-1;;;26502:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26580:15;26598:46;23567:4;26612:19;:8;26625:5;26612:19;:12;:19;:::i;:::-;:31;;;;;26598:9;;26612:31;;26598:46;:13;:46;:::i;:::-;26580:64;;26831:1;26818:10;:14;:28;;;-1:-1:-1;26836:5:0;;:10;26818:28;26810:64;;;;;-1:-1:-1;;;26810:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26926:5;;23567:4;;26926:9;26923:59;;26948:5;;26972:10;;26948:21;;26958:10;26948:21;:9;:21;:::i;:::-;:34;;;;;;26937:45;;26923:59;27023:56;;;-1:-1:-1;;;27023:56:0;;27041:10;27023:56;;;;27061:4;27023:56;;;;;;;;;;;;-1:-1:-1;;;;;27023:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;27023:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27023:56:0;27015:97;;;;;-1:-1:-1;;;27015:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27123:2;-1:-1:-1;;;;;27123:14:0;;27138:10;27123:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27190;27195:10;27207:8;27190:4;:26::i;:::-;27234:45;;;;;;;;;;;;;;27246:10;;27234:45;;;;;;;;26259:1036;;;;;;:::o;23423:33::-;;;:::o;23228:34::-;23259:3;23228:34;:::o;2110:24::-;;;;:::o;24496:319::-;20098:9;:7;:9::i;:::-;20090:54;;;;;-1:-1:-1;;;20090:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23259:3:::1;24573:4;:15;;24565:53;;;::::0;;-1:-1:-1;;;24565:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23369:2;24637;:11;;24629:46;;;::::0;;-1:-1:-1;;;24629:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24629:46:0;;;;;;;;;;;;;::::1;;23407:3;24694:2;:11;;24686:44;;;::::0;;-1:-1:-1;;;24686:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24686:44:0;;;;;;;;;;;;;::::1;;24743:3;:10:::0;;;24764:1:::1;:6:::0;;;24788:19:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;24496:319:::0;;:::o;31737:249::-;31787:9;31798:10;31821:13;31837:22;:20;:22::i;:::-;31821:38;;31872:10;31885:12;:10;:12::i;:::-;31917:9;;;;-1:-1:-1;31872:25:0;-1:-1:-1;23567:4:0;31946:19;:8;31872:25;31946:19;:12;:19;:::i;:::-;:31;;;;;;31937:41;;31737:249;;;;:::o;1752:32::-;;;:::o;28298:1060::-;28358:14;28374:18;28405:16;28424:2;-1:-1:-1;;;;;28424:26:0;;28459:4;28424:41;;;;;;;;;;;;;-1:-1:-1;;;;;28424:41:0;-1:-1:-1;;;;;28424:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28424:41:0;;-1:-1:-1;28476:15:0;28495:22;:20;:22::i;:::-;28476:41;;28530:17;28550:12;:10;:12::i;:::-;28530:32;-1:-1:-1;28576:17:0;28573:35;;-1:-1:-1;28603:1:0;;-1:-1:-1;28603:1:0;;-1:-1:-1;28595:13:0;;-1:-1:-1;;28595:13:0;28573:35;28642:16;23567:4;28661:28;:10;28676:12;28661:28;:14;:28;:::i;:::-;:40;;;;;;;-1:-1:-1;28712:14:0;28729:63;28761:12;28736:22;:7;23567:4;28736:22;:11;:22;:::i;:::-;:37;;;;;;28779:11;28729:6;:63::i;:::-;28712:80;-1:-1:-1;28817:7:0;28851:11;28805:9;28889:35;28905:18;:11;28921:1;28905:18;:15;:18;:::i;:::-;28889:11;;:35;:15;:35;:::i;:::-;28873:51;;28945:14;28962:38;28972:4;28978:8;28988;28998:1;;28962:9;:38::i;:::-;28945:55;-1:-1:-1;29011:19:0;29060:12;29033:24;28945:55;23567:4;29033:24;:13;:24;:::i;:::-;:39;;;;;;29011:61;;29101:14;29088:10;:27;29085:59;;;-1:-1:-1;29134:10:0;29085:59;29204:14;29192:9;:26;29189:57;;;-1:-1:-1;29237:9:0;29189:57;29271:14;29259:26;;29312:38;29342:7;29312:25;29319:7;29332:3;;29312:6;:25::i;:38::-;29296:54;;28298:1060;;;;;;;;;;;;;;:::o;3289:149::-;3345:9;3375:6;;;:30;;-1:-1:-1;;3390:5:0;;;3404:1;3399;3390:5;3399:1;3385:15;;;;;:20;3375:30;3367:63;;;;;-1:-1:-1;;;3367:63:0;;;;;;;;;;;;-1:-1:-1;;;3367:63:0;;;;;;;;;;;;;;23055:28;;;:::o;4569:126::-;4600:7;4624:5;;4633:1;4624:10;4620:67;;;-1:-1:-1;3589:8:0;4636:10;;4620:67;4669:18;4674:5;:3;:5::i;:::-;4681;;4669:4;:18::i;:::-;4662:25;;;;23090:34;;;:::o;23275:19::-;;;;:::o;13863:638::-;13933:4;13953:6;;:16;;;;-1:-1:-1;13963:6:0;;13953:16;13950:29;;;-1:-1:-1;13978:1:0;13971:8;;13950:29;13992:8;14003;:1;14009;14003:8;:5;:8;:::i;:::-;13992:19;-1:-1:-1;14028:6:0;14024:447;14045:3;14041:1;:7;14024:447;;;14081:3;14118:17;14133:1;14119:8;:1;14125;14119:8;:5;:8;:::i;14118:17::-;14104:11;:2;14111:3;14104:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;14169:17:0;14184:1;14170:8;:1;14176;14170:8;:5;:8;:::i;14169:17::-;14155:11;:2;14162:3;14155:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;14218:3:0;14203:12;14247:48;14218:3;14248:37;14275:9;14155:31;14282:1;14275:9;:6;:9;:::i;:::-;14248:22;14261:8;:1;14267;14261:8;:5;:8;:::i;:::-;14248;:1;14254;14248:8;:5;:8;:::i;14247:48::-;14238:57;-1:-1:-1;14310:6:0;14320:24;14340:3;14320:15;14333:1;14320:8;:1;14326;14320:8;:5;:8;:::i;:24::-;14310:35;-1:-1:-1;14370:16:0;14376:9;:2;14383:1;14376:9;:6;:9;:::i;:::-;14370:1;;:16;:5;:16;:::i;:::-;14366:1;:20;;;;;;;-1:-1:-1;14413:14:0;:7;14425:1;14413:14;:11;:14;:::i;:::-;14406:3;:21;;:46;;;;-1:-1:-1;14442:10:0;:3;14450:1;14442:10;:7;:10;:::i;:::-;14431:7;:21;;14406:46;14403:56;;;14454:5;;;;;;14403:56;-1:-1:-1;;14051:3:0;;;;;-1:-1:-1;14024:447:0;;-1:-1:-1;14024:447:0;;-1:-1:-1;14490:3:0;13863:638;-1:-1:-1;;;;13863:638:0:o;20352:192::-;20098:9;:7;:9::i;:::-;20090:54;;;;;-1:-1:-1;;;20090:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20441:22:0;::::1;20433:73;;;;-1:-1:-1::0;;;20433:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20517:19;20527:8;20517:9;:19::i;:::-;20352:192:::0;:::o;23315:18::-;;;;:::o;9112:181::-;9170:7;9202:5;;;9226:6;;;;9218:46;;;;;-1:-1:-1;;;9218:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10484:471;10542:7;10787:6;10783:47;;-1:-1:-1;10817:1:0;10810:8;;10783:47;10854:5;;;10858:1;10854;:5;:1;10878:5;;;;;:10;10870:56;;;;-1:-1:-1;;;10870:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9568:136;9626:7;9653:43;9657:1;9660;9653:43;;;;;;;;;;;;;;;;;:3;:43::i;3444:115::-;3504:9;3550:1;3530:17;3534:1;3537:9;3541:1;3544;3537:3;:9::i;:::-;3530:3;:17::i;11423:132::-;11481:7;11508:39;11512:1;11515;11508:39;;;;;;;;;;;;;;;;;:3;:39::i;7500:153::-;7569:18;7574:5;7581;7569:4;:18::i;:::-;7603:34;;;;;;;;7627:1;;-1:-1:-1;;;;;7603:34:0;;;;;;;;;;;;7500:153;;:::o;30918:374::-;30990:10;-1:-1:-1;;;;;30990:25:0;30987:298;;31051:28;;31033:12;;-1:-1:-1;;;;;31051:7:0;;;31067:6;;31033:12;31051:28;31033:12;31051:28;31067:6;31051:7;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31032:47;;;31102:7;31094:54;;;;-1:-1:-1;;;31094:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30987:298;;;;31210:10;-1:-1:-1;;;;;31210:19:0;;31230:2;31234:6;31210:31;;;;;;;;;;;;;-1:-1:-1;;;;;31210:31:0;-1:-1:-1;;;;;31210:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31210:31:0;31202:71;;;;;-1:-1:-1;;;31202:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30918:374;;:::o;7356:136::-;7422:15;7427:2;7431:5;7422:4;:15::i;:::-;7453:31;;;;;;;;-1:-1:-1;;;;;7453:31:0;;;7470:1;;7453:31;;;;;;;;;7356:136;;:::o;28044:246::-;28099:4;28131:5;28124:3;:12;;28116:51;;;;;-1:-1:-1;;;28116:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28186:3:0;:13;;28178:52;;;;;-1:-1:-1;;;28178:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28277:5;28250:24;:1;28261:11;;;28250:24;:5;:24;:::i;20552:173::-;20627:6;;;-1:-1:-1;;;;;20644:17:0;;;-1:-1:-1;;;;;;20644:17:0;;;;;;;20677:40;;20627:6;;;20644:17;20627:6;;20677:40;;20608:16;;20677:40;20552:173;;:::o;10041:192::-;10127:7;10163:12;10155:6;;;;10147:29;;;;-1:-1:-1;;;10147:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10199:5:0;;;10041:192::o;12085:345::-;12171:7;12273:12;12266:5;12258:28;;;;-1:-1:-1;;;12258:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12297:9;12313:1;12309;:5;;;;;;;12085:345;-1:-1:-1;;;;;12085:345:0:o;5803:645::-;5871:24;5879:10;5891:3;5871:7;:24::i;:::-;5910:7;;5906:447;;5934:11;5948:45;5955:30;5959:3;5964:20;5955:3;:30::i;:::-;5987:5;:3;:5::i;:::-;5948:6;:45::i;:::-;5934:59;;6135:1;6128:3;6121:15;6113:24;;;;;;6162:3;-1:-1:-1;;;;;6162:12:0;;6175:3;6180;6162:22;;;;;;;;;;;;;-1:-1:-1;;;;;6162:22:0;-1:-1:-1;;;;;6162:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6162:22:0;6154:31;;;;;;6200:39;;;-1:-1:-1;;;6200:39:0;;6209:3;6200:39;;;;6214:10;6200:39;;;;6226:12;;;;6200:39;;;;;;-1:-1:-1;;;;;6200:3:0;:8;;;;:39;;;;;;;;;;;6226:12;6200:8;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6264:15;6268:5;;6275:3;6264;:15::i;:::-;6256:5;:23;6324:10;6318:17;;;;:5;:17;;;;;;6314:27;;6337:3;6314;:27::i;:::-;6300:10;6294:17;;;;:5;:17;;;;;:47;-1:-1:-1;5906:447:0;6396:10;6390:17;;;;:5;:17;;;;;;6409:5;;6383:32;;6390:17;6383:6;:32::i;:::-;6369:10;6363:17;;;;:5;:17;;;;;;;;;:52;;;;6431:9;;;;;;;;;;;;;;;;;;5803:645;;:::o;5169:626::-;5237:17;5245:3;5250;5237:7;:17::i;:::-;5269:7;;5265:449;;5293:11;5307:43;5312:30;5316:3;5321:20;5312:3;:30::i;:::-;5344:5;:3;:5::i;:::-;5307:4;:43::i;:::-;5293:57;;5492:1;5485:3;5478:15;5470:24;;;;;;5519:48;;;-1:-1:-1;;;5519:48:0;;5536:10;5519:48;;;;5556:4;5519:48;;;;;;;;;;;;-1:-1:-1;;;;;5519:3:0;:16;;;;:48;;;;;;;;;;;;;;-1:-1:-1;5519:16:0;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5519:48:0;5511:57;;;;;;5583:3;-1:-1:-1;;;;;5583:8:0;;5592:3;5597;5609;5583:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5583:31:0;-1:-1:-1;;;;;5583:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5639:15;5643:5;;5650:3;5639;:15::i;:::-;5631:5;:23;-1:-1:-1;;;;;5686:10:0;;;;;;:5;:10;;;;;;5682:20;;5698:3;5682;:20::i;:::-;-1:-1:-1;;;;;5669:10:0;;;;;;:5;:10;;;;;:33;-1:-1:-1;5265:449:0;-1:-1:-1;;;;;5744:10:0;;;;;;:5;:10;;;;;;5756:5;;5737:25;;5744:10;5737:6;:25::i;:::-;-1:-1:-1;;;;;5724:10:0;;;;;;:5;:10;;;;;;;;;:38;;;;5778:9;;;;;;;;;;;;;;;;;;5169:626;;:::o;4830:331::-;4897:5;;:9;4893:54;;4916:31;4920:5;;4927:19;4932:6;:4;:6::i;:::-;4940:5;;4927:4;:19::i;4916:31::-;4908:5;:39;4893:54;-1:-1:-1;;;;;4975:11:0;;4960:12;4975:11;;;:5;:11;;;;;;;;;5017:5;:11;;;;;;5030:5;;4975:11;;4960:12;5012:24;;5017:11;5012:4;:24::i;:::-;4997:39;;5058:4;5051;:11;5047:57;;;5072:5;-1:-1:-1;;;;;5072:14:0;;5087:2;5098:4;5091;:11;5072:31;;;;;;;;;;;;;-1:-1:-1;;;;;5072:31:0;-1:-1:-1;;;;;5072:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5072:31:0;5064:40;;;;;;5123:30;;;-1:-1:-1;;;5123:30:0;;5147:4;5123:30;;;;;;-1:-1:-1;;;;;5123:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5123:30:0;5115:5;:38;-1:-1:-1;;;;4830:331:0:o;4703:119::-;4776:30;;;-1:-1:-1;;;4776:30:0;;4800:4;4776:30;;;;;;4745:7;;4772:42;;-1:-1:-1;;;;;4776:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4776:30:0;4808:5;;4772:3;:42::i;:::-;4765:49;;4703:119;:::o
Metadata Hash
ipfs://e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a813961