Token B.AMM LUSD-ETH
Overview ERC20
Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
0.683201 LUSDETH
Holders:
38 addresses
Contract:
Decimals:
18
Balance
0.000894305246655338 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-02-07 */ /* B.PROTOCOL TERMS OF USE ======================= THE TERMS OF USE CONTAINED HEREIN (THESE “TERMS”) GOVERN YOUR USE OF B.PROTOCOL, WHICH IS A DECENTRALIZED PROTOCOL ON THE ETHEREUM BLOCKCHAIN (the “PROTOCOL”) THAT enables a backstop liquidity mechanism FOR DECENTRALIZED LENDING PLATFORMS (“DLPs”). PLEASE READ THESE TERMS CAREFULLY AT https://github.com/backstop-protocol/Terms-and-Conditions, INCLUDING ALL DISCLAIMERS AND RISK FACTORS, BEFORE USING THE PROTOCOL. BY USING THE PROTOCOL, YOU ARE IRREVOCABLY CONSENTING TO BE BOUND BY THESE TERMS. IF YOU DO NOT AGREE TO ALL OF THESE TERMS, DO NOT USE THE PROTOCOL. YOUR RIGHT TO USE THE PROTOCOL IS SUBJECT AND DEPENDENT BY YOUR AGREEMENT TO ALL TERMS AND CONDITIONS SET FORTH HEREIN, WHICH AGREEMENT SHALL BE EVIDENCED BY YOUR USE OF THE PROTOCOL. Minors Prohibited: The Protocol is not directed to individuals under the age of eighteen (18) or the age of majority in your jurisdiction if the age of majority is greater. If you are under the age of eighteen or the age of majority (if greater), you are not authorized to access or use the Protocol. By using the Protocol, you represent and warrant that you are above such age. License; No Warranties; Limitation of Liability; (a) The software underlying the Protocol is licensed for use in accordance with the 3-clause BSD License, which can be accessed here: https://opensource.org/licenses/BSD-3-Clause. (b) THE PROTOCOL IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", “WITH ALL FAULTS” and “AS AVAILABLE” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. (c) IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // 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
610240604052600060065560146007553480156200001c57600080fd5b50604051620036d3380380620036d383398181016040526101008110156200004357600080fd5b50805160208201516040808401516060850151608086015160a087015160c088015160e090980151945196979596939592949193909291908590620000889062000240565b604051809103906000f080158015620000a5573d6000803e3d6000fd5b5064422e414d4d60d81b604051620000bd906200024d565b604051809103906000f080158015620000da573d6000803e3d6000fd5b506001600160601b0319606084811b821660805260a084905282901b1660c0526040805163313ce56760e01b8152905185916000916001600160a01b0385169163313ce56791600480830192602092919082900301818787803b1580156200014157600080fd5b505af115801562000156573d6000803e3d6000fd5b505050506040513d60208110156200016d57600080fd5b505160ff16905060128111156200018357600080fd5b60e08190526012819003600a90810a610120520a6101405260601b6001600160601b03191661010052505060058054336001600160a01b03199091168117909155604051909250600091507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606098891b81166101605295881b86166101805292871b85166101a05294861b84166101c05293851b83166101e0526102009390935250911b16610220526200025b565b6065806200353c83390190565b61013280620035a183390190565b60805160601c60a05160c05160601c60e0516101005160601c61012051610140516101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c610200516102205160601c61319b620003a160003980611421525080611ccc528061201d52508061164e52806118a2525080610efd528061113d528061120652806113dc5280611591528061195b5280611c025280611f01525080610f755280610fc852806110cc528061219b528061259052806126545250806112b95280611513528061161f5280611b3b5280612141525080610d4b5280610dde528061138a525050806129d15280612c305250806117615280612f065280612fdb528061307d5250806118c65250806117da5280612a135280612c9d525080611ed85280612ad65280612d4b5250806113b35280612b165280612d1c525061319b6000f3fe6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f0000000000000000000000000000000000000000000000000000000000000000919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601281565b7f000000000000000000000000000000000000000000000000000000000000000081565b60c881565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000000006127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000006120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000006120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cdd3fde7f000000000000000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b00336080604052348015600f57600080fd5b50604880601d6000396000f3fe6080604052348015600f57600080fd5b5000fea2646970667358221220c9dbde2b8bd5037d447820e2775b3e09ebae168220c996babde4dae9f370b5d564736f6c634300060b0033608060405234801561001057600080fd5b50610112806100206000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c806323b872dd14603e578063313ce567146085578063a9059cbb14609d575b005b607160048036036060811015605257600080fd5b506001600160a01b0381358116916020810135909116906040013560c6565b604080519115158252519081900360200190f35b608b60cf565b60408051918252519081900360200190f35b60716004803603604081101560b157600080fd5b506001600160a01b03813516906020013560d4565b60019392505050565b601290565b60019291505056fea2646970667358221220e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a81396164736f6c634300060b0033000000000000000000000000a5e1ae2140d9fd147ce0e1ade024d64a334a4cdb0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb000000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d24000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145010000000000000000000000000000000000000000000000000000000000000190000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a390000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f000000000000000000000000a5e1ae2140d9fd147ce0e1ade024d64a334a4cdb6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f000000000000000000000000a5e1ae2140d9fd147ce0e1ade024d64a334a4cdb6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb0169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145016001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e1450116916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e14501919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb0169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb06001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f000000000000000000000000a5e1ae2140d9fd147ce0e1ade024d64a334a4cdb81565b601281565b7f0000000000000000000000009fe19cb84ffa2b8bb0f5336f4b7ec09767606e5081565b60c881565b7f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb081565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb0166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f176001600160a01b031663a9059cbb7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2481565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f00000000000000000000000040ef9c5594ec41895e60402fd841aeecb7f2f30481565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a3981565b7f000000000000000000000000000000000000000000000000000000000000001281565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb0169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb06001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000019081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f422e414d4d00000000000000000000000000000000000000000000000000000081565b60008060007f0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb06001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000001906127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1781565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e1450181565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145016001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145016001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000016120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f00000000000000000000000040ef9c5594ec41895e60402fd841aeecb7f2f3046001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f422e414d4d00000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f0000000000000000000000009fe19cb84ffa2b8bb0f5336f4b7ec09767606e501692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000016120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f00000000000000000000000040ef9c5594ec41895e60402fd841aeecb7f2f30416916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f0000000000000000000000009fe19cb84ffa2b8bb0f5336f4b7ec09767606e506001600160a01b0316637cdd3fde7f422e414d4d00000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d246001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2416916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2416916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5e1ae2140d9fd147ce0e1ade024d64a334a4cdb0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb000000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d24000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145010000000000000000000000000000000000000000000000000000000000000190000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a390000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _priceAggregator (address): 0xA5E1Ae2140d9Fd147Ce0E1aDe024D64a334A4CdB
Arg [1] : _SP (address): 0x3282dfAf0fBba4d3E771C4E5F669Cb4E14D8adb0
Arg [2] : _LUSD (address): 0x64343594Ab9b56e99087BfA6F2335Db24c2d1F17
Arg [3] : _LQTY (address): 0xa684cd057951541187f288294a1e1C2646aA2d24
Arg [4] : _collateral (address): 0xDBf31dF14B66535aF65AaC99C32e9eA844e14501
Arg [5] : _maxDiscount (uint256): 400
Arg [6] : _feePool (address): 0xf2bb803010FA55ab60aF1a4740d1A1D6c9C93a39
Arg [7] : _fronEndTag (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5e1ae2140d9fd147ce0e1ade024d64a334a4cdb
Arg [1] : 0000000000000000000000003282dfaf0fbba4d3e771c4e5f669cb4e14d8adb0
Arg [2] : 00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17
Arg [3] : 000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d24
Arg [4] : 000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e14501
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000190
Arg [6] : 000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
25144:9093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16762:672;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16762:672:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8914:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6475:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6475:106:0;;;;;;;:::i;27071:1428::-;;;;;;;;;;;;;:::i;33548:429::-;;;;;;;;;;;;;:::i;9398:84::-;;;;;;;;;;;;;:::i;6084:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6084:114:0;;;;;;;:::i;32998:160::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32998:160:0;;:::i;:::-;;;;-1:-1:-1;;;;;32998:160:0;;;;;;;;;;;;;;4499:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4499:41:0;-1:-1:-1;;;;;4499:41:0;;:::i;4426:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4426:41:0;-1:-1:-1;;;;;4426:41:0;;:::i;4308:24::-;;;;;;;;;;;;;:::i;29551:733::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29551:733:0;;:::i;:::-;;25242:54;;;;;;;;;;;;;:::i;9015:34::-;;;;;;;;;;;;;:::i;3952:32::-;;;;;;;;;;;;;:::i;25626:::-;;;;;;;;;;;;;:::i;25383:37::-;;;;;;;;;;;;;:::i;6355:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6355:114:0;;;;;;;:::i;25737:36::-;;;;;;;;;;;;;:::i;5972:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5972:106:0;;;;;;;:::i;6243:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6243:106:0;;;;;;;:::i;32300:315::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32300:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31648:594;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31648:594:0;;;;;;;;;;;-1:-1:-1;;;;;31648:594:0;;:::i;25588:31::-;;;;;;;;;;;;;:::i;9490:113::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9490:113:0;-1:-1:-1;;;;;9490:113:0;;:::i;4189:34::-;;;;;;;;;;;;;:::i;5262:135::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5262:135:0;;;;;;;:::i;4069:32::-;;;;;;;;;;;;;:::i;32623:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32623:291:0;;;;;;;;;;;;;;;;;;;;;;:::i;5860:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5860:106:0;;;;;;;:::i;22136:79::-;;;;;;;;;;;;;:::i;22502:92::-;;;;;;;;;;;;;:::i;8967:41::-;;;;;;;;;;;;;:::i;4250:24::-;;;;;;;;;;;;;:::i;25782:37::-;;;;;;;;;;;;;:::i;25429:40::-;;;;;;;;;;;;;:::i;4131:32::-;;;;;;;;;;;;;:::i;5403:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5403:136:0;;;;;;;:::i;28507:1036::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28507:1036:0;;:::i;25671:33::-;;;;;;;;;;;;;:::i;25476:34::-;;;;;;;;;;;;;:::i;4366:24::-;;;;;;;;;;;;;:::i;26744:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26744:319:0;;;;;;;:::i;33985:249::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4008:32;;;;;;;;;;;;;:::i;30546:1060::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30546:1060:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5545:149;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5545:149:0;;;;;;;:::i;25303:28::-;;;;;;;;;;;;;:::i;6825:126::-;;;;;;;;;;;;;:::i;25338:34::-;;;;;;;;;;;;;:::i;25523:19::-;;;;;;;;;;;;;:::i;16116:638::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16116:638:0;;;;;;;;;;;;:::i;22602:192::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22602:192:0;-1:-1:-1;;;;;22602:192:0;;:::i;25563:18::-;;;;;;;;;;;;;:::i;16762:672::-;16850:4;16867:8;16878:39;16895:8;16905;16915:1;16878:16;:39::i;:::-;16867:50;-1:-1:-1;16930:6:0;16954:27;16979:1;16955:18;:4;16964:8;16955:18;:8;:18;:::i;:::-;16954:24;:27;:24;:27;:::i;:::-;16939:12;16947:3;;16939:12;:7;:12;:::i;:::-;:42;;;;;;;-1:-1:-1;17009:8:0;:1;17015;17009:8;:5;:8;:::i;:::-;16996:10;:1;17002:3;16996:10;:5;:10;:::i;:::-;:21;;;;;;;-1:-1:-1;17028:6:0;17037:40;17068:8;:1;17074;17068:8;:5;:8;:::i;:::-;17062:3;:14;;;;;;17038:18;:4;17047:8;17038:18;:8;:18;:::i;:::-;17037:24;:40;:24;:40;:::i;:::-;17028:49;-1:-1:-1;17088:10:0;17122:3;17088:10;17138:247;17159:3;17155:1;:7;17138:247;;;17193:1;;-1:-1:-1;17193:1:0;;17209:6;17218:17;17233:1;17219:8;17193:1;;17219:8;:5;:8;:::i;17218:17::-;17209:26;-1:-1:-1;17250:6:0;17259:24;17279:3;17259:15;17272:1;17259:8;:1;17265;17259:8;:5;:8;:::i;:15::-;:19;:24;:19;:24;:::i;:::-;17250:33;;17307:1;17303;:5;;;;;;;-1:-1:-1;17333:12:0;:5;17343:1;17333:12;:9;:12;:::i;:::-;17328:1;:17;;:38;;;;-1:-1:-1;17358:8:0;:1;17364;17358:8;:5;:8;:::i;:::-;17349:5;:17;;17328:38;17325:48;;;17368:5;;;;17325:48;-1:-1:-1;;17165:3:0;;17138:247;;;-1:-1:-1;17404:22:0;17424:1;17404:15;:8;17417:1;17404:15;:12;:15;:::i;:22::-;17397:29;16762:672;-1:-1:-1;;;;;;;;;;16762:672:0:o;8914:46::-;;;;;;;;;;;;;;-1:-1:-1;;;8914:46:0;;;;:::o;6475:106::-;6532:9;6572:1;6558:11;6562:1;6228:8;6558:3;:11::i;:::-;:15;;;;;;;6475:106;-1:-1:-1;;;6475:106:0:o;27071:1428::-;27113:4;27130:22;27163:26;27200:23;27297:15;-1:-1:-1;;;;;27297:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27297:26:0;;;27293:338;;27618:1;27611:8;;;;;;;27293:338;27448:28;;;-1:-1:-1;27699:15:0;-1:-1:-1;;;;;27699:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27699:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27695:589;;28271:1;28264:8;;;;;;;27695:589;-1:-1:-1;28077:6:0;;-1:-1:-1;28120:9:0;;-1:-1:-1;;;28330:3:0;28299:18;28320:7;28299:28;:34;28296:47;;;28342:1;28335:8;;;;;;;28296:47;28396:2;:23;;;;28437:36;:21;25815:4;28437:36;:25;:36;:::i;:::-;:54;;;;;;28430:61;;;;;;27071:1428;;:::o;33548:429::-;33634:39;;;-1:-1:-1;;;33634:39:0;;33667:4;33634:39;;;;;;33600:4;;;;-1:-1:-1;;;;;33634:2:0;:24;;;;:39;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33634:39:0;;-1:-1:-1;33684:20:0;33720:10;-1:-1:-1;;;;;33720:25:0;33717:203;;-1:-1:-1;33780:21:0;33717:203;;;33873:35;;;-1:-1:-1;;;33873:35:0;;33902:4;33873:35;;;;;;-1:-1:-1;;;;;33873:10:0;:20;;;;:35;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33873:35:0;;-1:-1:-1;33717:203:0;33939:30;:9;33953:15;33939:30;:13;:30;:::i;:::-;33932:37;;;;33548:429;:::o;9398:84::-;9469:5;;9398:84;:::o;6084:114::-;6143:9;6169:21;6175:11;6179:1;5845:8;6175:3;:11::i;:::-;6188:1;6169:5;:21::i;:::-;6165:25;6084:114;-1:-1:-1;;;6084:114:0:o;32998:160::-;33051:7;33079:10;;33071:42;;;;;-1:-1:-1;;;33071:42:0;;;;;;;;;;;;-1:-1:-1;;;33071:42:0;;;;;;;;;;;;;;;-1:-1:-1;33139:10:0;32998:160;;;:::o;4499:41::-;;;;;;;;;;;;;:::o;4426:::-;;;;;;;;;;;;;:::o;4308:24::-;;;;:::o;29551:733::-;29622:41;;;-1:-1:-1;;;29622:41:0;;29657:4;29622:41;;;;;;29605:14;;-1:-1:-1;;;;;29622:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29622:41:0;;-1:-1:-1;29674:13:0;29690:22;:20;:22::i;:::-;29674:38;;29725:15;29743:35;29772:5;;29743:24;29757:9;29743;:13;;:24;;;;:::i;:::-;:28;:35;:28;:35;:::i;:::-;29725:53;;29789:14;29806:34;29834:5;;29806:23;29819:9;29806:8;:12;;:23;;;;:::i;:34::-;29789:51;;29900:2;-1:-1:-1;;;;;29900:17:0;;29918:10;29900:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29970:27;29975:10;29987:9;29970:4;:27::i;:::-;30043:14;;30040:56;;30059:37;;;-1:-1:-1;;;30059:37:0;;30073:10;30059:37;;;;;;;;;;;;-1:-1:-1;;;;;30059:4:0;:13;;;;:37;;;;;;;;;;;;;;-1:-1:-1;30059:13:0;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30040:56:0;30110:13;;30107:82;;30140:37;30155:10;30167:9;30140:14;:37::i;:::-;30206:58;;;;;;;;;;;;;;;;;;;;30219:10;;30206:58;;;;;;;;;;29551:733;;;;;:::o;25242:54::-;;;:::o;9015:34::-;9047:2;9015:34;:::o;3952:32::-;;;:::o;25626:::-;25655:3;25626:32;:::o;25383:37::-;;;:::o;6355:114::-;6414:9;6440:21;6446:9;6450:1;6453;6446:3;:9::i;:::-;6228:8;6440:5;:21::i;25737:36::-;;;:::o;5972:106::-;6029:9;6069:1;6055:11;6059:1;5845:8;6055:3;:11::i;6243:106::-;6300:9;6228:8;6326:9;6330:1;6333;6326:3;:9::i;32300:315::-;32548:4;32606:1;32572:31;32577:9;32588:1;32591:11;32572:4;:31::i;:::-;:35;;32300:315;-1:-1:-1;;;;;;;32300:315:0:o;31648:594::-;31735:4;31753:14;31769;31787:28;31804:10;31787:16;:28::i;:::-;31752:63;;;;31849:12;31836:9;:25;;31828:54;;;;;-1:-1:-1;;;31828:54:0;;;;;;;;;;;;-1:-1:-1;;;31828:54:0;;;;;;;;;;;;;;;31895:56;;;-1:-1:-1;;;31895:56:0;;31913:10;31895:56;;;;31933:4;31895:56;;;;;;;;;;;;-1:-1:-1;;;;;31895:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;31895:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;31962:2:0;:14;;31977:25;:10;31992:9;31977:25;:14;:25;:::i;:::-;31962:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32031:1;32019:9;:13;32016:51;;;32034:4;-1:-1:-1;;;;;32034:13:0;;32048:7;32057:9;32034:33;;;;;;;;;;;;;-1:-1:-1;;;;;32034:33:0;-1:-1:-1;;;;;32034:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32016:51:0;32078:31;32093:4;32099:9;32078:14;:31::i;:::-;32152:53;;;;;;;;;;;;32201:3;32152:53;;;;;;32166:10;;32152:53;;;;;;;;;;-1:-1:-1;32225:9:0;31648:594;-1:-1:-1;;;;31648:594:0:o;25588:31::-;25617:2;25588:31;:::o;9490:113::-;-1:-1:-1;;;;;9583:12:0;9545:15;9583:12;;;:5;:12;;;;;;;9490:113::o;4189:34::-;;;:::o;5262:135::-;5353:5;;;5348:16;;;;5340:49;;;;;-1:-1:-1;;;5340:49:0;;;;;;;;;;;;-1:-1:-1;;;5340:49:0;;;;;;;;;;;;;;;5262:135;;;;:::o;4069:32::-;;;:::o;32623:291::-;32796:7;32817:11;32834:24;32851:6;32834:16;:24::i;:::-;-1:-1:-1;32816:42:0;-1:-1:-1;32900:6:0;32876:21;32816:42;25815:4;32876:21;:10;:21;:::i;:::-;:30;;;;;;;32623:291;-1:-1:-1;;;;;;32623:291:0:o;5860:106::-;5917:9;5845:8;5943:9;5947:1;5950;5943:3;:9::i;22136:79::-;22201:6;;-1:-1:-1;;;;;22201:6:0;22136:79;:::o;22502:92::-;22580:6;;-1:-1:-1;;;;;22580:6:0;22566:10;:20;;22502:92::o;8967:41::-;;;;;;;;;;;;;;-1:-1:-1;;;8967:41:0;;;;:::o;4250:24::-;;;;:::o;25782:37::-;25815:4;25782:37;:::o;25429:40::-;;;:::o;4131:32::-;;;:::o;5403:136::-;5494:5;;;5489:16;;;;5481:50;;;;;-1:-1:-1;;;5481:50:0;;;;;;;;;;;;-1:-1:-1;;;5481:50:0;;;;;;;;;;;;;;28507:1036;28611:41;;;-1:-1:-1;;;28611:41:0;;28646:4;28611:41;;;;;;28594:14;;-1:-1:-1;;;;;28611:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28611:41:0;;-1:-1:-1;28663:13:0;28679:22;:20;:22::i;:::-;28663:38;;28714:10;28727:12;:10;:12::i;:::-;28714:25;-1:-1:-1;28758:13:0;;;:26;;;28783:1;28775:5;:9;28758:26;28750:65;;;;;-1:-1:-1;;;28750:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28828:15;28846:46;25815:4;28860:19;:8;28873:5;28860:19;:12;:19;:::i;:::-;:31;;;;;28846:9;;28860:31;;28846:46;:13;:46;:::i;:::-;28828:64;;29079:1;29066:10;:14;:28;;;-1:-1:-1;29084:5:0;;:10;29066:28;29058:64;;;;;-1:-1:-1;;;29058:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29174:5;;25815:4;;29174:9;29171:59;;29196:5;;29220:10;;29196:21;;29206:10;29196:21;:9;:21;:::i;:::-;:34;;;;;;29185:45;;29171:59;29271:56;;;-1:-1:-1;;;29271:56:0;;29289:10;29271:56;;;;29309:4;29271:56;;;;;;;;;;;;-1:-1:-1;;;;;29271:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;29271:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29271:56:0;29263:97;;;;;-1:-1:-1;;;29263:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29371:2;-1:-1:-1;;;;;29371:14:0;;29386:10;29371:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29438;29443:10;29455:8;29438:4;:26::i;:::-;29482:45;;;;;;;;;;;;;;29494:10;;29482:45;;;;;;;;28507:1036;;;;;;:::o;25671:33::-;;;:::o;25476:34::-;25507:3;25476:34;:::o;4366:24::-;;;;:::o;26744:319::-;22348:9;:7;:9::i;:::-;22340:54;;;;;-1:-1:-1;;;22340:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25507:3:::1;26821:4;:15;;26813:53;;;::::0;;-1:-1:-1;;;26813:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25617:2;26885;:11;;26877:46;;;::::0;;-1:-1:-1;;;26877:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26877:46:0;;;;;;;;;;;;;::::1;;25655:3;26942:2;:11;;26934:44;;;::::0;;-1:-1:-1;;;26934:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26934:44:0;;;;;;;;;;;;;::::1;;26991:3;:10:::0;;;27012:1:::1;:6:::0;;;27036:19:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;26744:319:::0;;:::o;33985:249::-;34035:9;34046:10;34069:13;34085:22;:20;:22::i;:::-;34069:38;;34120:10;34133:12;:10;:12::i;:::-;34165:9;;;;-1:-1:-1;34120:25:0;-1:-1:-1;25815:4:0;34194:19;:8;34120:25;34194:19;:12;:19;:::i;:::-;:31;;;;;;34185:41;;33985:249;;;;:::o;4008:32::-;;;:::o;30546:1060::-;30606:14;30622:18;30653:16;30672:2;-1:-1:-1;;;;;30672:26:0;;30707:4;30672:41;;;;;;;;;;;;;-1:-1:-1;;;;;30672:41:0;-1:-1:-1;;;;;30672:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30672:41:0;;-1:-1:-1;30724:15:0;30743:22;:20;:22::i;:::-;30724:41;;30778:17;30798:12;:10;:12::i;:::-;30778:32;-1:-1:-1;30824:17:0;30821:35;;-1:-1:-1;30851:1:0;;-1:-1:-1;30851:1:0;;-1:-1:-1;30843:13:0;;-1:-1:-1;;30843:13:0;30821:35;30890:16;25815:4;30909:28;:10;30924:12;30909:28;:14;:28;:::i;:::-;:40;;;;;;;-1:-1:-1;30960:14:0;30977:63;31009:12;30984:22;:7;25815:4;30984:22;:11;:22;:::i;:::-;:37;;;;;;31027:11;30977:6;:63::i;:::-;30960:80;-1:-1:-1;31065:7:0;31099:11;31053:9;31137:35;31153:18;:11;31169:1;31153:18;:15;:18;:::i;:::-;31137:11;;:35;:15;:35;:::i;:::-;31121:51;;31193:14;31210:38;31220:4;31226:8;31236;31246:1;;31210:9;:38::i;:::-;31193:55;-1:-1:-1;31259:19:0;31308:12;31281:24;31193:55;25815:4;31281:24;:13;:24;:::i;:::-;:39;;;;;;31259:61;;31349:14;31336:10;:27;31333:59;;;-1:-1:-1;31382:10:0;31333:59;31452:14;31440:9;:26;31437:57;;;-1:-1:-1;31485:9:0;31437:57;31519:14;31507:26;;31560:38;31590:7;31560:25;31567:7;31580:3;;31560:6;:25::i;:38::-;31544:54;;30546:1060;;;;;;;;;;;;;;:::o;5545:149::-;5601:9;5631:6;;;:30;;-1:-1:-1;;5646:5:0;;;5660:1;5655;5646:5;5655:1;5641:15;;;;;:20;5631:30;5623:63;;;;;-1:-1:-1;;;5623:63:0;;;;;;;;;;;;-1:-1:-1;;;5623:63:0;;;;;;;;;;;;;;25303:28;;;:::o;6825:126::-;6856:7;6880:5;;6889:1;6880:10;6876:67;;;-1:-1:-1;5845:8:0;6892:10;;6876:67;6925:18;6930:5;:3;:5::i;:::-;6937;;6925:4;:18::i;:::-;6918:25;;;;25338:34;;;:::o;25523:19::-;;;;:::o;16116:638::-;16186:4;16206:6;;:16;;;;-1:-1:-1;16216:6:0;;16206:16;16203:29;;;-1:-1:-1;16231:1:0;16224:8;;16203:29;16245:8;16256;:1;16262;16256:8;:5;:8;:::i;:::-;16245:19;-1:-1:-1;16281:6:0;16277:447;16298:3;16294:1;:7;16277:447;;;16334:3;16371:17;16386:1;16372:8;:1;16378;16372:8;:5;:8;:::i;16371:17::-;16357:11;:2;16364:3;16357:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;16422:17:0;16437:1;16423:8;:1;16429;16423:8;:5;:8;:::i;16422:17::-;16408:11;:2;16415:3;16408:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;16471:3:0;16456:12;16500:48;16471:3;16501:37;16528:9;16408:31;16535:1;16528:9;:6;:9;:::i;:::-;16501:22;16514:8;:1;16520;16514:8;:5;:8;:::i;:::-;16501;:1;16507;16501:8;:5;:8;:::i;16500:48::-;16491:57;-1:-1:-1;16563:6:0;16573:24;16593:3;16573:15;16586:1;16573:8;:1;16579;16573:8;:5;:8;:::i;:24::-;16563:35;-1:-1:-1;16623:16:0;16629:9;:2;16636:1;16629:9;:6;:9;:::i;:::-;16623:1;;:16;:5;:16;:::i;:::-;16619:1;:20;;;;;;;-1:-1:-1;16666:14:0;:7;16678:1;16666:14;:11;:14;:::i;:::-;16659:3;:21;;:46;;;;-1:-1:-1;16695:10:0;:3;16703:1;16695:10;:7;:10;:::i;:::-;16684:7;:21;;16659:46;16656:56;;;16707:5;;;;;;16656:56;-1:-1:-1;;16304:3:0;;;;;-1:-1:-1;16277:447:0;;-1:-1:-1;16277:447:0;;-1:-1:-1;16743:3:0;16116:638;-1:-1:-1;;;;16116:638:0:o;22602:192::-;22348:9;:7;:9::i;:::-;22340:54;;;;;-1:-1:-1;;;22340:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22691:22:0;::::1;22683:73;;;;-1:-1:-1::0;;;22683:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22767:19;22777:8;22767:9;:19::i;:::-;22602:192:::0;:::o;25563:18::-;;;;:::o;11366:181::-;11424:7;11456:5;;;11480:6;;;;11472:46;;;;;-1:-1:-1;;;11472:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12738:471;12796:7;13041:6;13037:47;;-1:-1:-1;13071:1:0;13064:8;;13037:47;13108:5;;;13112:1;13108;:5;:1;13132:5;;;;;:10;13124:56;;;;-1:-1:-1;;;13124:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11822:136;11880:7;11907:43;11911:1;11914;11907:43;;;;;;;;;;;;;;;;;:3;:43::i;5700:115::-;5760:9;5806:1;5786:17;5790:1;5793:9;5797:1;5800;5793:3;:9::i;:::-;5786:3;:17::i;13677:132::-;13735:7;13762:39;13766:1;13769;13762:39;;;;;;;;;;;;;;;;;:3;:39::i;9755:153::-;9824:18;9829:5;9836;9824:4;:18::i;:::-;9858:34;;;;;;;;9882:1;;-1:-1:-1;;;;;9858:34:0;;;;;;;;;;;;9755:153;;:::o;33166:374::-;33238:10;-1:-1:-1;;;;;33238:25:0;33235:298;;33299:28;;33281:12;;-1:-1:-1;;;;;33299:7:0;;;33315:6;;33281:12;33299:28;33281:12;33299:28;33315:6;33299:7;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33280:47;;;33350:7;33342:54;;;;-1:-1:-1;;;33342:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33235:298;;;;33458:10;-1:-1:-1;;;;;33458:19:0;;33478:2;33482:6;33458:31;;;;;;;;;;;;;-1:-1:-1;;;;;33458:31:0;-1:-1:-1;;;;;33458:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33458:31:0;33450:71;;;;;-1:-1:-1;;;33450:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33166:374;;:::o;9611:136::-;9677:15;9682:2;9686:5;9677:4;:15::i;:::-;9708:31;;;;;;;;-1:-1:-1;;;;;9708:31:0;;;9725:1;;9708:31;;;;;;;;;9611:136;;:::o;30292:246::-;30347:4;30379:5;30372:3;:12;;30364:51;;;;;-1:-1:-1;;;30364:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30434:3:0;:13;;30426:52;;;;;-1:-1:-1;;;30426:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30525:5;30498:24;:1;30509:11;;;30498:24;:5;:24;:::i;22802:173::-;22877:6;;;-1:-1:-1;;;;;22894:17:0;;;-1:-1:-1;;;;;;22894:17:0;;;;;;;22927:40;;22877:6;;;22894:17;22877:6;;22927:40;;22858:16;;22927:40;22802:173;;:::o;12295:192::-;12381:7;12417:12;12409:6;;;;12401:29;;;;-1:-1:-1;;;12401:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12453:5:0;;;12295:192::o;14339:345::-;14425:7;14527:12;14520:5;14512:28;;;;-1:-1:-1;;;14512:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14551:9;14567:1;14563;:5;;;;;;;14339:345;-1:-1:-1;;;;;14339:345:0:o;8059:645::-;8127:24;8135:10;8147:3;8127:7;:24::i;:::-;8166:7;;8162:447;;8190:11;8204:45;8211:30;8215:3;8220:20;8211:3;:30::i;:::-;8243:5;:3;:5::i;:::-;8204:6;:45::i;:::-;8190:59;;8391:1;8384:3;8377:15;8369:24;;;;;;8418:3;-1:-1:-1;;;;;8418:12:0;;8431:3;8436;8418:22;;;;;;;;;;;;;-1:-1:-1;;;;;8418:22:0;-1:-1:-1;;;;;8418:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8418:22:0;8410:31;;;;;;8456:39;;;-1:-1:-1;;;8456:39:0;;8465:3;8456:39;;;;8470:10;8456:39;;;;8482:12;;;;8456:39;;;;;;-1:-1:-1;;;;;8456:3:0;:8;;;;:39;;;;;;;;;;;8482:12;8456:8;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8520:15;8524:5;;8531:3;8520;:15::i;:::-;8512:5;:23;8580:10;8574:17;;;;:5;:17;;;;;;8570:27;;8593:3;8570;:27::i;:::-;8556:10;8550:17;;;;:5;:17;;;;;:47;-1:-1:-1;8162:447:0;8652:10;8646:17;;;;:5;:17;;;;;;8665:5;;8639:32;;8646:17;8639:6;:32::i;:::-;8625:10;8619:17;;;;:5;:17;;;;;;;;;:52;;;;8687:9;;;;;;;;;;;;;;;;;;8059:645;;:::o;7425:626::-;7493:17;7501:3;7506;7493:7;:17::i;:::-;7525:7;;7521:449;;7549:11;7563:43;7568:30;7572:3;7577:20;7568:3;:30::i;:::-;7600:5;:3;:5::i;:::-;7563:4;:43::i;:::-;7549:57;;7748:1;7741:3;7734:15;7726:24;;;;;;7775:48;;;-1:-1:-1;;;7775:48:0;;7792:10;7775:48;;;;7812:4;7775:48;;;;;;;;;;;;-1:-1:-1;;;;;7775:3:0;:16;;;;:48;;;;;;;;;;;;;;-1:-1:-1;7775:16:0;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7775:48:0;7767:57;;;;;;7839:3;-1:-1:-1;;;;;7839:8:0;;7848:3;7853;7865;7839:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7839:31:0;-1:-1:-1;;;;;7839:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7895:15;7899:5;;7906:3;7895;:15::i;:::-;7887:5;:23;-1:-1:-1;;;;;7942:10:0;;;;;;:5;:10;;;;;;7938:20;;7954:3;7938;:20::i;:::-;-1:-1:-1;;;;;7925:10:0;;;;;;:5;:10;;;;;:33;-1:-1:-1;7521:449:0;-1:-1:-1;;;;;8000:10:0;;;;;;:5;:10;;;;;;8012:5;;7993:25;;8000:10;7993:6;:25::i;:::-;-1:-1:-1;;;;;7980:10:0;;;;;;:5;:10;;;;;;;;;:38;;;;8034:9;;;;;;;;;;;;;;;;;;7425:626;;:::o;7086:331::-;7153:5;;:9;7149:54;;7172:31;7176:5;;7183:19;7188:6;:4;:6::i;:::-;7196:5;;7183:4;:19::i;7172:31::-;7164:5;:39;7149:54;-1:-1:-1;;;;;7231:11:0;;7216:12;7231:11;;;:5;:11;;;;;;;;;7273:5;:11;;;;;;7286:5;;7231:11;;7216:12;7268:24;;7273:11;7268:4;:24::i;:::-;7253:39;;7314:4;7307;:11;7303:57;;;7328:5;-1:-1:-1;;;;;7328:14:0;;7343:2;7354:4;7347;:11;7328:31;;;;;;;;;;;;;-1:-1:-1;;;;;7328:31:0;-1:-1:-1;;;;;7328:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7328:31:0;7320:40;;;;;;7379:30;;;-1:-1:-1;;;7379:30:0;;7403:4;7379:30;;;;;;-1:-1:-1;;;;;7379:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7379:30:0;7371:5;:38;-1:-1:-1;;;;7086:331:0:o;6959:119::-;7032:30;;;-1:-1:-1;;;7032:30:0;;7056:4;7032:30;;;;;;7001:7;;7028:42;;-1:-1:-1;;;;;7032:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:30:0;7064:5;;7028:3;:42::i;:::-;7021:49;;6959:119;:::o
Metadata Hash
ipfs://e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a813961