Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
VSQBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-01-01 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } // Audit on 5-Jan-2021 by Keno and BoringCrypto // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto contract BoringOwnableData { address public owner; address public pendingOwner; } contract BoringOwnable is BoringOwnableData { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @notice `owner` defaults to msg.sender on construction. constructor() public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. /// Can only be invoked by the current `owner`. /// @param newOwner Address of the new owner. /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`. /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise. function transferOwnership( address newOwner, bool direct, bool renounce ) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } /// @notice Needs to be called by `pendingOwner` to claim ownership. function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } /// @notice Only allows the `owner` to execute the function. modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function sub32(uint32 a, uint32 b) internal pure returns (uint32) { return sub32(a, b, "SafeMath: subtraction overflow"); } function sub32(uint32 a, uint32 b, string memory errorMessage) internal pure returns (uint32) { require(b <= a, errorMessage); uint32 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) .sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); function checkUserDepositorWhitelist( address recipient, address sender ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; function checkUserDepositorWhitelist( address recipient, address sender ) external returns ( bool ); } contract VSQBondDepository is BoringOwnable, ReentrancyGuard { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; using SafeMath for uint32; /* ======== EVENTS ======== */ event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint payout, uint remaining ); event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); event BondTermsInitialized( uint indexed _controlVariable, uint indexed _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _vestingTerm, uint indexed initialLatDcay ); event SetBondTerms( uint _parameter, uint _input ); event SetAdjustment( bool _addition, uint _increment, uint indexed _target, uint _buffer, uint indexed initialLastAdjustment ); event SetStaking( address _staking, bool _helper ); event LostTokenRecovered( address _token, uint amount ); /* ======== STATE VARIABLES ======== */ address public immutable VSQ; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints VSQ when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping( address => Bond ) public bondInfo; // stores bond information for depositors uint public totalDebt; // total value of outstanding bonds; used for pricing uint256 public lastDecay; // reference time for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint controlVariable; // scaling variable for price uint minimumPrice; // vs principle value uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 vestingTerm; // in seconds } // Info for bond holder struct Bond { uint payout; // VSQ remaining to be paid uint pricePaid; // In DAI, for front end viewing uint256 lastTime; // Last interaction uint256 vesting; // Seconds left to vest } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint256 buffer; // minimum length (in seconds) between adjustments uint256 lastTime; // time when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _VSQ, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _VSQ != address(0) ); VSQ = _VSQ; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _minimumPrice uint * @param _maxPayout uint * @param _maxDebt uint * @param _vestingTerm uint */ function initializeBondTerms( uint _controlVariable, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _vestingTerm ) external onlyOwner() { require( lastDecay == 0, "bond has already been initalized" ); require( terms.controlVariable == 0, "Bonds must be initialized from 0" ); require( _controlVariable > 0, "Bonds must be initialized greater than 0" ); require( _maxPayout > 0, "maxPayout must be initialized greater than 0"); require( _fee <= 10000, "DAO fee cannot exceed payout" ); require( _vestingTerm >= 129600, "Vesting must be longer than 36 hours" ); terms = Terms ({ controlVariable: _controlVariable, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt, vestingTerm: _vestingTerm }); lastDecay = block.timestamp; emit BondTermsInitialized( _controlVariable, _minimumPrice, _maxPayout, _fee, _maxDebt, _vestingTerm, lastDecay ); } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, DEBT, MINPRICE } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyOwner() { if ( _parameter == PARAMETER.VESTING ) { // 0 require( _input >= 129600, "Vesting must be longer than 36 hours" ); terms.vestingTerm = _input; } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 75000, "Payout cannot be above 75 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.FEE ) { // 2 require( _input <= 10000, "DAO fee cannot exceed payout" ); terms.fee = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } else if ( _parameter == PARAMETER.MINPRICE ) { // 4 terms.minimumPrice = _input; } emit SetBondTerms( uint256(_parameter), _input ); } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment ( bool _addition, uint _increment, uint _target, uint _buffer ) external onlyOwner() { require( _increment != 0 && ( _addition && terms.controlVariable < _target || !_addition && terms.controlVariable > _target ), "Invalid adjustment" ); uint256 maxIncrement = terms.controlVariable.mul( 25 ).div( 1000 ); require( _increment <= maxIncrement || maxIncrement == 0 && _increment == 1, "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastTime: block.timestamp }); emit SetAdjustment( _addition, _increment, _target, _buffer, block.timestamp ); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyOwner() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } emit SetStaking( _staking, _helper ); } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external nonReentrant returns ( uint ) { require( lastDecay != 0, "Cannot deposit before bond is initalized" ); require( _depositor == msg.sender || checkUserDepositorWhitelist( _depositor, msg.sender ), "Sender not authorized" ); require( _depositor != address(0), "Invalid address" ); decayDebt(); uint value = ITreasury( treasury ).valueOf( principle, _amount ); require( totalDebt.add( value ) <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 VSQ ( underflow protection ) require( payout <= maxPayout(), "Bond too large" ); // size protection because there is no slippage // total debt is increased totalDebt = totalDebt.add( value ); // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); require( value >= payout.add( fee ), "Bond is awaiting reconfiguration" ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) VSQ */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( treasury, _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to dao IERC20( VSQ ).safeTransfer( DAO, fee ); } // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastTime: block.timestamp, pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.timestamp.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { require( _recipient == msg.sender || checkUserDepositorWhitelist( _recipient, msg.sender ), "Redeemer not authorized" ); require( _recipient != address(0), "Invalid address" ); Bond memory info = bondInfo[ _recipient ]; // (seconds since last interaction / vesting term remaining) uint percentVested = percentVestedFor( _recipient ); if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub( block.timestamp.sub( info.lastTime ) ), lastTime: block.timestamp, pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( VSQ ).safeTransfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( VSQ ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( VSQ ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @notice get the staking permissions for a users account * @param recipient address * @param sender address */ function checkUserDepositorWhitelist( address recipient, address sender ) internal returns ( bool ) { if ( useHelper ) { // use if staking warmup is 0 return IStakingHelper( stakingHelper ).checkUserDepositorWhitelist( recipient, sender ); } else { return IStaking( staking ).checkUserDepositorWhitelist( recipient, sender ); } } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint timeCanAdjust = adjustment.lastTime.add( adjustment.buffer ); if( adjustment.rate != 0 && block.timestamp >= timeCanAdjust ) { uint initial = terms.controlVariable; if ( adjustment.add ) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if ( terms.controlVariable >= adjustment.target ) { terms.controlVariable = adjustment.target; adjustment.target = 0; adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable > adjustment.rate ? terms.controlVariable.sub( adjustment.rate ) : 0; if ( terms.controlVariable <= adjustment.target ) { terms.controlVariable = adjustment.target; adjustment.target = 0; adjustment.rate = 0; } } adjustment.lastTime = block.timestamp; emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = block.timestamp; } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( VSQ ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @notice calculate current ratio of debt to VSQ supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( VSQ ).totalSupply(); debtRatio_ = FixedPoint.fraction( currentDebt().mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** * @notice debt ratio in same terms for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { if ( isLiquidityBond ) { return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 ); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns ( uint ) { return totalDebt.sub( debtDecay() ); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns ( uint decay_ ) { uint256 timeSinceLast = block.timestamp.sub( lastDecay ); decay_ = totalDebt.mul( timeSinceLast ).div( terms.vestingTerm ); if ( decay_ > totalDebt ) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) { Bond memory bond = bondInfo[ _depositor ]; uint secondsSinceLast = block.timestamp.sub( bond.lastTime ); uint vesting = bond.vesting; if ( vesting > 0 ) { percentVested_ = secondsSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of VSQ available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = bondInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or VSQ) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != VSQ ); require( _token != principle ); emit LostTokenRecovered( _token, IERC20( _token ).balanceOf( address(this) ) ); IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) ); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_VSQ","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"initialLatDcay","type":"uint256"}],"name":"BondTermsInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LostTokenRecovered","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":"bool","name":"_addition","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_increment","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_target","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buffer","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"initialLastAdjustment","type":"uint256"}],"name":"SetAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_parameter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_input","type":"uint256"}],"name":"SetBondTerms","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staking","type":"address"},{"indexed":false,"internalType":"bool","name":"_helper","type":"bool"}],"name":"SetStaking","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VSQ","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"lastTime","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum VSQBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b506040516200509738038062005097833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001600281905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200014f57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001c157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200023357600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002a557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c614c6a6200042d60003980611fce5280612c6c528061304a525080611fa05280612c3b52806133d7525080612a395280612d875280612f58525080611aeb5280612414528061288852806129395250806109df528061200a52806120e352806124505280612805528061284c52806129765280612ca85280612e06525080612a5b5280612dad52806130a1528061347452806135b752806138b252806139125280613ab15250614c6a6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638da5cb5b11610125578063d5025625116100ad578063e30c39781161007c578063e30c39781461091b578063e392a2621461094f578063e9c70da51461096d578063f5c2ab5b146109a1578063fc7b9c18146109bf57610211565b8063d50256251461087e578063d7969060146108bf578063d7ccfb0b146108df578063e0176de8146108fd57610211565b8063b4abccba116100f4578063b4abccba14610715578063c5332b7c1461076f578063cd1234b3146107a3578063cea55f5714610810578063d4d863ce1461082e57610211565b80638da5cb5b146106235780638dbdbe6d14610657578063904b3ece146106c357806398fabd3a146106e157610211565b80634cf088d9116101a8578063759076e511610177578063759076e51461051157806377b818951461052f5780637927ebf8146105635780637b261727146105a5578063844b5c7c1461060557610211565b80634cf088d9146104475780634e71e0c81461047b578063507930ec1461048557806361d027b3146104dd57610211565b80631e321a0f116101e45780631e321a0f1461034c5780631feed31f146103875780632f3f470a146103eb578063451ee4a11461040b57610211565b8063016a42841461021657806301b88ee81461024a578063078dfbe7146102a25780631a3d0068146102fe575b600080fd5b61021e6109dd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a01565b6040518082815260200191505060405180910390f35b6102fc600480360360608110156102b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050610a98565b005b61034a6004803603608081101561031457600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610d52565b005b6103856004803603604081101561036257600080fd5b81019080803560ff16906020019092919080359060200190929190505050611042565b005b6103d56004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611365565b6040518082815260200191505060405180910390f35b6103f36117d2565b60405180821515815260200191505060405180910390f35b6104136117e5565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61044f611816565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61048361183c565b005b6104c76004803603602081101561049b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a03565b6040518082815260200191505060405180910390f35b6104e5611ae9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610519611b0d565b6040518082815260200191505060405180910390f35b610537611b30565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61058f6004803603602081101561057957600080fd5b8101908080359060200190929190505050611b56565b6040518082815260200191505060405180910390f35b610603600480360360c08110156105bb57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611b91565b005b61060d611f9c565b6040518082815260200191505060405180910390f35b61062b6121b2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ad6004803603606081101561066d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121d6565b6040518082815260200191505060405180910390f35b6106cb612c37565b6040518082815260200191505060405180910390f35b6106e9612d85565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107576004803603602081101561072b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612da9565b60405180821515815260200191505060405180910390f35b610777613048565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107e5600480360360208110156107b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061306c565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61081861309c565b6040518082815260200191505060405180910390f35b61087c6004803603604081101561084457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613191565b005b6108866133ab565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108c76133d5565b60405180821515815260200191505060405180910390f35b6108e76133f9565b6040518082815260200191505060405180910390f35b610905613460565b6040518082815260200191505060405180910390f35b610923613534565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61095761355a565b6040518082815260200191505060405180910390f35b6109756135b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a96135d9565b6040518082815260200191505060405180910390f35b6109c76135df565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610a0d83611a03565b90506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a6757809250610a91565b610a8e612710610a8084846135e590919063ffffffff16565b61366b90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8115610d0b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580610b985750805b610c0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f776e61626c653a207a65726f2061646472657373000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d4d565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008314158015610e4a5750838015610e30575081600560000154105b80610e49575083158015610e48575081600560000154115b5b5b610ebc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e76616c69642061646a7573746d656e74000000000000000000000000000081525060200191505060405180910390fd5b6000610eeb6103e8610edd60196005600001546135e590919063ffffffff16565b61366b90919063ffffffff16565b90508084111580610f085750600081148015610f075750600184145b5b610f7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280861515815260200185815260200184815260200183815260200142815250600b60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505042837f801c1dd2df206cc8f7c9edbaf171e23708d4a305e80d2cabb29fff1e4cd73f2f878786604051808415158152602001838152602001828152602001935050505060405180910390a35050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600481111561111057fe5b82600481111561111c57fe5b141561118c576201fa4081101561117e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614be76024913960400191505060405180910390fd5b806005800181905550611317565b6001600481111561119957fe5b8260048111156111a557fe5b141561121657620124f8811115611207576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b086021913960400191505060405180910390fd5b80600560020181905550611316565b6002600481111561122357fe5b82600481111561122f57fe5b14156112bc576127108111156112ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600560030181905550611315565b600360048111156112c957fe5b8260048111156112d557fe5b14156112ea5780600560040181905550611314565b6004808111156112f657fe5b82600481111561130257fe5b141561131357806005600101819055505b5b5b5b5b7f6ce30ede0614e2c337df047a16883821e992fff8189523906fdc63fa247b014e82600481111561134457fe5b82604051808381526020018281526020019250505060405180910390a15050565b60003373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806113a757506113a683336136b5565b5b611419576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f52656465656d6572206e6f7420617574686f72697a656400000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b6114c4614a86565b601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061154385611a03565b9050612710811061162357601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261161a858584600001516138a4565b925050506117cc565b60006116506127106116428486600001516135e590919063ffffffff16565b61366b90919063ffffffff16565b90506040518060800160405280611674838660000151613c7990919063ffffffff16565b8152602001846020015181526020014281526020016116b66116a3866040015142613c7990919063ffffffff16565b8660600151613c7990919063ffffffff16565b815250601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26117c68686836138a4565b93505050505b92915050565b600460149054906101000a900460ff1681565b600b8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611a0d614a86565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611a9a826040015142613c7990919063ffffffff16565b90506000826060015190506000811115611adc57611ad581611ac7612710856135e590919063ffffffff16565b61366b90919063ffffffff16565b9350611ae1565b600093505b505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b2b611b1a61355a565b601154613c7990919063ffffffff16565b905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b8a662386f26fc10000611b7c611b7785611b726133f9565b613cc3565b613fa4565b61366b90919063ffffffff16565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060125414611cca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f626f6e642068617320616c7265616479206265656e20696e6974616c697a656481525060200191505060405180910390fd5b600060056000015414611d45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b60008611611d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614ae06028913960400191505060405180910390fd5b60008411611df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614b98602c913960400191505060405180910390fd5b612710831115611e6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b6201fa40811015611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614be76024913960400191505060405180910390fd5b6040518060c00160405280878152602001868152602001858152602001848152602001838152602001828152506005600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050504260128190555060125485877fe9a2e3e0ea1db8e8d98c18bdd491a371e94350a66ce9f76bfe89d1baa99ef1a0878787876040518085815260200184815260200183815260200182815260200194505050505060405180910390a4505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156120d9576120d260646120c47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b81019080805190602001909291905050506120b66133f9565b6135e590919063ffffffff16565b61366b90919063ffffffff16565b90506121af565b6121ac606461219e7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561214757600080fd5b505afa15801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b810190808051906020019092919050505060ff16600a0a6121906133f9565b6135e590919063ffffffff16565b61366b90919063ffffffff16565b90505b90565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600280541415612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60028081905550600060125414156122b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614b296028913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806122f357506122f282336136b5565b5b612365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f53656e646572206e6f7420617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b612410613fe0565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156124c157600080fd5b505afa1580156124d5573d6000803e3d6000fd5b505050506040513d60208110156124eb57600080fd5b810190808051906020019092919050505090506005600401546125198260115461400b90919063ffffffff16565b111561258d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000612597611f9c565b905060006125a3614093565b9050808610156125fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614bc46023913960400191505060405180910390fd5b600061260984611b56565b905062989680811015612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61268c613460565b811115612701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6127168460115461400b90919063ffffffff16565b601181905550600061274a61271061273c600560030154856135e590919063ffffffff16565b61366b90919063ffffffff16565b905061275f818361400b90919063ffffffff16565b8510156127d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e64206973206177616974696e67207265636f6e66696775726174696f6e81525060200191505060405180910390fd5b60006127fb826127ed8589613c7990919063ffffffff16565b613c7990919063ffffffff16565b905061284a33308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614118909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156128fb57600080fd5b505af115801561290f573d6000803e3d6000fd5b505050506040513d602081101561292557600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156129f057600080fd5b505af1158015612a04573d6000803e3d6000fd5b505050506040513d6020811015612a1a57600080fd5b81019080805190602001909291905050505060008214612aa057612a9f7f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166141d99092919063ffffffff16565b5b6040518060800160405280612b0085601060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461400b90919063ffffffff16565b81526020018681526020014281526020016005800154815250601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505084612b9b60058001544261400b90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612bdb61309c565b612be3614093565b612beb611f9c565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4612c1f61427b565b82965050505050505060016002819055509392505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612d7757612d70633b9aca00612d627f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d1157600080fd5b505afa158015612d25573d6000803e3d6000fd5b505050506040513d6020811015612d3b57600080fd5b8101908080519060200190929190505050612d5461309c565b6135e590919063ffffffff16565b61366b90919063ffffffff16565b9050612d82565b612d7f61309c565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e0457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5d57600080fd5b7f243a2623004d785f69b32e4c3554598be81aab5a716683781ec11c8ba61a212a828373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ee657600080fd5b505afa158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b8101908080519060200190929190505050604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a161303f7f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fde57600080fd5b505afa158015612ff2573d6000803e3d6000fd5b505050506040513d602081101561300857600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166141d99092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60106020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561310557600080fd5b505afa158015613119573d6000803e3d6000fd5b505050506040513d602081101561312f57600080fd5b8101908080519060200190929190505050905061318b670de0b6b3a764000061317d613178613172633b9aca00613164611b0d565b6135e590919063ffffffff16565b85613cc3565b613fa4565b61366b90919063ffffffff16565b91505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561328c57600080fd5b80156132f3576001600460146101000a81548160ff02191690831515021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613350565b6000600460146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b7f73caa800c10cd22f14eb0c9c372b61140240e409486c87e70d1ad9d79e7f2c698282604051808373ffffffffffffffffffffffffffffffffffffffff16815260200182151581526020019250505060405180910390a15050565b60058060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061344562989680613437633b9aca0061342961341561309c565b6005600001546135e590919063ffffffff16565b61400b90919063ffffffff16565b61366b90919063ffffffff16565b905060056001015481101561345d5760056001015490505b90565b600061352f620186a06135216005600201547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134d857600080fd5b505afa1580156134ec573d6000803e3d6000fd5b505050506040513d602081101561350257600080fd5b81019080805190602001909291905050506135e590919063ffffffff16565b61366b90919063ffffffff16565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061357260125442613c7990919063ffffffff16565b905061359f6005800154613591836011546135e590919063ffffffff16565b61366b90919063ffffffff16565b91506011548211156135b15760115491505b5090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b60115481565b6000808314156135f85760009050613665565b600082840290508284828161360957fe5b0414613660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b776021913960400191505060405180910390fd5b809150505b92915050565b60006136ad83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061442e565b905092915050565b6000600460149054906101000a900460ff16156137b757600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634048590e84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561377557600080fd5b505af1158015613789573d6000803e3d6000fd5b505050506040513d602081101561379f57600080fd5b8101908080519060200190929190505050905061389e565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634048590e84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561386057600080fd5b505af1158015613874573d6000803e3d6000fd5b505050506040513d602081101561388a57600080fd5b810190808051906020019092919050505090505b92915050565b6000826138fb576138f684837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166141d99092919063ffffffff16565b613c6f565b600460149054906101000a900460ff1615613aaf577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156139c357600080fd5b505af11580156139d7573d6000803e3d6000fd5b505050506040513d60208110156139ed57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015613a9257600080fd5b505af1158015613aa6573d6000803e3d6000fd5b50505050613c6e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b6257600080fd5b505af1158015613b76573d6000803e3d6000fd5b505050506040513d6020811015613b8c57600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015613c3157600080fd5b505af1158015613c45573d6000803e3d6000fd5b505050506040513d6020811015613c5b57600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b6000613cbb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506144f4565b905092915050565b613ccb614aae565b60008211613d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614b516026913960400191505060405180910390fd5b6000831415613d6257604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050613f9e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311613e9b57600082607060ff1685901b81613daf57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613e66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050613f9e565b6000613eb7846e010000000000000000000000000000856145b4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681613fd857fe5b049050919050565b613ffc613feb61355a565b601154613c7990919063ffffffff16565b60118190555042601281905550565b600080828401905083811015614089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006140df629896806140d1633b9aca006140c36140af61309c565b6005600001546135e590919063ffffffff16565b61400b90919063ffffffff16565b61366b90919063ffffffff16565b90506005600101548110156140fb576005600101549050614115565b6000600560010154146141145760006005600101819055505b5b90565b6141d3846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614676565b50505050565b6142768363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614676565b505050565b600061429a600b60030154600b6004015461400b90919063ffffffff16565b90506000600b60010154141580156142b25750804210155b1561442b5760006005600001549050600b60000160009054906101000a900460ff161561433b576142f6600b6001015460056000015461400b90919063ffffffff16565b600560000181905550600b600201546005600001541061433657600b600201546005600001819055506000600b600201819055506000600b600101819055505b6143b2565b600b6001015460056000015411614353576000614371565b614370600b60010154600560000154613c7990919063ffffffff16565b5b600560000181905550600b60020154600560000154116143b157600b600201546005600001819055506000600b600201819055506000600b600101819055505b5b42600b600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600560000154600b60010154600b60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b600080831182906144da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561449f578082015181840152602081019050614484565b50505050905090810190601f1680156144cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816144e657fe5b049050809150509392505050565b60008383111582906145a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561456657808201518184015260208101905061454b565b50505050905090810190601f1680156145935780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006145c38686614765565b91509150600084806145d157fe5b8688099050828111156145e5576001820391505b808303925084821061465f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61466a8383876147b8565b93505050509392505050565b60606146d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166148559092919063ffffffff16565b9050600081511115614760578080602001905160208110156146f957600080fd5b810190808051906020019092919050505061475f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614c0b602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061479257fe5b848609905083850292508281039150828110156147b0576001820391505b509250929050565b60008082600003831690508083816147cc57fe5b0492508085816147d857fe5b04945060018182600003816147e957fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060614864848460008561486d565b90509392505050565b606061487885614a73565b6148ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061493a5780518252602082019150602081019050602083039250614917565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461499c576040519150601f19603f3d011682016040523d82523d6000602084013e6149a1565b606091505b509150915081156149b6578092505050614a6b565b6000815111156149c95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a30578082015181840152602081019050614a15565b50505050905090810190601f168015614a5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe426f6e6473206d75737420626520696e697469616c697a65642067726561746572207468616e20305061796f75742063616e6e6f742062652061626f76652037352070657263656e7443616e6e6f74206465706f736974206265666f726520626f6e6420697320696e6974616c697a65644669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d61785061796f7574206d75737420626520696e697469616c697a65642067726561746572207468616e2030536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220df75655642e0f1ef4c6e5a85ffd67a497d59cb1ab845bf2a21d1018f8ea6cbfc64736f6c6343000705003300000000000000000000000029f1e986fca02b7e54138c04c4f503dddd250558000000000000000000000000c2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e0000000000000000000000008c7290399cecbbbf31e471951cc4c2ce91f5073c0000000000000000000000004f64c22fb06ab877bf63f7064fa21c5c51cc85bf000000000000000000000000feeadb0798ef580b1394eb38659cf85cc25d43e4
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000029f1e986fca02b7e54138c04c4f503dddd250558000000000000000000000000c2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e0000000000000000000000008c7290399cecbbbf31e471951cc4c2ce91f5073c0000000000000000000000004f64c22fb06ab877bf63f7064fa21c5c51cc85bf000000000000000000000000feeadb0798ef580b1394eb38659cf85cc25d43e4
-----Decoded View---------------
Arg [0] : _VSQ (address): 0x29f1e986fca02b7e54138c04c4f503dddd250558
Arg [1] : _principle (address): 0xc2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e
Arg [2] : _treasury (address): 0x8c7290399cecbbbf31e471951cc4c2ce91f5073c
Arg [3] : _DAO (address): 0x4f64c22fb06ab877bf63f7064fa21c5c51cc85bf
Arg [4] : _bondCalculator (address): 0xfeeadb0798ef580b1394eb38659cf85cc25d43e4
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000029f1e986fca02b7e54138c04c4f503dddd250558
Arg [1] : 000000000000000000000000c2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e
Arg [2] : 0000000000000000000000008c7290399cecbbbf31e471951cc4c2ce91f5073c
Arg [3] : 0000000000000000000000004f64c22fb06ab877bf63f7064fa21c5c51cc85bf
Arg [4] : 000000000000000000000000feeadb0798ef580b1394eb38659cf85cc25d43e4
Deployed ByteCode Sourcemap
18681:20223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19939:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37954:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3991:506;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25358:837;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24280:882;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29611:1415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20469:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20554:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20338:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4579:340;;;:::i;:::-;;37351:431;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20009:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36692:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20391:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34368:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22894:1130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35472:331;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3137:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26923:2537;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36318:275;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20086:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38538:363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20257:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20620:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35927:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26328:366;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20499:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20158:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34634:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34099:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3164:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36900:288;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19869:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20795:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20713:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19939:34;;;:::o;37954:400::-;38026:19;38059:18;38080:30;38098:10;38080:16;:30::i;:::-;38059:51;;38121:11;38135:8;:22;38145:10;38135:22;;;;;;;;;;;;;;;:29;;;38121:43;;38199:5;38182:13;:22;38177:170;;38239:6;38222:23;;38177:170;;;38295:40;38328:5;38295:27;38307:13;38295:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;38278:57;;38177:170;37954:400;;;;;:::o;3991:506::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4130:6:::1;4126:364;;;4204:1;4184:22;;:8;:22;;;;:34;;;;4210:8;4184:34;4176:68;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;4318:8;4290:37;;4311:5;::::0;::::1;;;;;;;;4290:37;;;;;;;;;;;;4350:8;4342:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;4396:1;4373:12;;:25;;;;;;;;;;;;;;;;;;4126:364;;;4470:8;4455:12;;:23;;;;;;;;;;;;;;;;;;4126:364;3991:506:::0;;;:::o;25358:837::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25543:1:::1;25529:10;:15;;:116;;;;;25550:9;:44;;;;;25587:7;25563:5;:21;;;:31;25550:44;:93;;;;25599:9;25598:10;:45;;;;;25636:7;25612:5;:21;;;:31;25598:45;25550:93;25529:116;25520:162;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25693:20;25716:43;25753:4;25716:31;25743:2;25716:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;25693:66;;25793:12;25779:10;:26;;:87;;;;25846:1;25830:12;:17;:36;;;;;25865:1;25851:10;:15;25830:36;25779:87;25770:121;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25917:179;;;;;;;;25944:9;25917:179;;;;;;25974:10;25917:179;;;;26007:7;25917:179;;;;26037:7;25917:179;;;;26069:15;25917:179;;::::0;25904:10:::1;:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26170:15;26152:7;26114:73;26129:9;26140:10;26161:7;26114:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5100:1;25358:837:::0;;;;:::o;24280:882::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24391:17:::1;24377:31;;;;;;;;:10;:31;;;;;;;;;24372:722;;;24450:6;24440;:16;;24431:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24533:6;24513:5;:17:::0;::::1;:26;;;;24372:722;;;24576:16;24562:30;;;;;;;;:10;:30;;;;;;;;;24557:537;;;24634:5;24624:6;:15;;24615:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24711:6;24693:5;:15;;:24;;;;24557:537;;;24754:13;24740:27;;;;;;;;:10;:27;;;;;;;;;24735:359;;;24809:5;24799:6;:15;;24790:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24875:6;24863:5;:9;;:18;;;;24735:359;;;24918:14;24904:28;;;;;;;;:10;:28;;;;;;;;;24899:195;;;24971:6;24955:5;:13;;:22;;;;24899:195;;;25014:18;25000:32:::0;::::1;;;;;;;:10;:32;;;;;;;;;24995:99;;;25076:6;25055:5;:18;;:27;;;;24995:99;24899:195;24735:359;24557:537;24372:722;25111:43;25133:10;25125:19;;;;;;;;25146:6;25111:43;;;;;;;;;;;;;;;;;;;;;;;;24280:882:::0;;:::o;29611:1415::-;29681:4;29730:10;29716:24;;:10;:24;;;:81;;;;29744:53;29773:10;29785;29744:27;:53::i;:::-;29716:81;29707:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29868:1;29846:24;;:10;:24;;;;29837:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29904:16;;:::i;:::-;29923:8;:22;29933:10;29923:22;;;;;;;;;;;;;;;29904:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30026:18;30047:30;30065:10;30047:16;:30::i;:::-;30026:51;;30112:5;30095:13;:22;30090:929;;30161:8;:22;30171:10;30161:22;;;;;;;;;;;;;;;;30154:29;;;;;;;;;;;;;;;;;;;;;;;;;;30237:10;30223:42;;;30249:4;:11;;;30262:1;30223:42;;;;;;;;;;;;;;;;;;;;;;;;30305:46;30318:10;30330:6;30338:4;:11;;;30305;:46::i;:::-;30298:53;;;;;;30090:929;30470:11;30484:45;30522:5;30484:32;30501:13;30484:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;30470:59;;30612:245;;;;;;;;30644:25;30661:6;30644:4;:11;;;:15;;:25;;;;:::i;:::-;30612:245;;;;30827:4;:14;;;30612:245;;;;30782:15;30612:245;;;;30697:56;30715:36;30736:4;:13;;;30715:15;:19;;:36;;;;:::i;:::-;30697:4;:12;;;:16;;:56;;;;:::i;:::-;30612:245;;;30587:8;:22;30597:10;30587:22;;;;;;;;;;;;;;;:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30893:10;30879:65;;;30905:6;30913:8;:22;30923:10;30913:22;;;;;;;;;;;;;;;:29;;;30879:65;;;;;;;;;;;;;;;;;;;;;;;;30966:41;30979:10;30991:6;30999;30966:11;:41::i;:::-;30959:48;;;;;29611:1415;;;;;:::o;20469:21::-;;;;;;;;;;;;;:::o;20554:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20338:22::-;;;;;;;;;;;;;:::o;4579:340::-;4623:21;4647:12;;;;;;;;;;;4623:36;;4713:13;4699:27;;:10;:27;;;4691:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4829:13;4801:42;;4822:5;;;;;;;;;;4801:42;;;;;;;;;;;;4862:13;4854:5;;:21;;;;;;;;;;;;;;;;;;4909:1;4886:12;;:25;;;;;;;;;;;;;;;;;;4579:340;:::o;37351:431::-;37421:19;37454:16;;:::i;:::-;37473:8;:22;37483:10;37473:22;;;;;;;;;;;;;;;37454:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37506:21;37530:36;37551:4;:13;;;37530:15;:19;;:36;;;;:::i;:::-;37506:60;;37577:12;37592:4;:12;;;37577:27;;37632:1;37622:7;:11;37617:158;;;37668:44;37703:7;37668:29;37690:5;37668:16;:20;;:29;;;;:::i;:::-;:33;;:44;;;;:::i;:::-;37651:61;;37617:158;;;37762:1;37745:18;;37617:158;37351:431;;;;;;:::o;20009:33::-;;;:::o;36692:106::-;36737:4;36762:28;36777:11;:9;:11::i;:::-;36762:9;;:13;;:28;;;;:::i;:::-;36755:35;;36692:106;:::o;20391:28::-;;;;;;;;;;;;;:::o;34368:161::-;34424:4;34449:72;34515:4;34449:60;:42;34470:6;34478:11;:9;:11::i;:::-;34449:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;34442:79;;34368:161;;;:::o;22894:1130::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23145:1:::1;23132:9;;:14;23123:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23229:1;23204:5;:21;;;:26;23195:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23307:1;23288:16;:20;23279:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23387:1;23374:10;:14;23365:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23465:5;23457:4;:13;;23448:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23540:6;23524:12;:22;;23515:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23609:241;;;;;;;;23648:16;23609:241;;;;23693:13;23609:241;;;;23732:10;23609:241;;;;23762:4;23609:241;;;;23790:8;23609:241;;;;23826:12;23609:241;;::::0;23601:5:::1;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23875:15;23863:9;:27;;;;24005:9;;23948:13;23930:16;23908:108;23963:10;23975:4;23981:8;23991:12;23908:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22894:1130:::0;;;;;;:::o;35472:331::-;35520:11;35549:15;35545:251;;;35591:85;35671:3;35591:74;35625:14;35608:42;;;35652:9;35608:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35591:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;35582:94;;35545:251;;;35718:66;35779:3;35718:55;35749:9;35741:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35735:36;;:2;:36;35718:11;:9;:11::i;:::-;:15;;:55;;;;:::i;:::-;:59;;:66;;;;:::i;:::-;35709:75;;35545:251;35472:331;:::o;3137:20::-;;;;;;;;;;;;:::o;26923:2537::-;27058:4;1724:1;2321:7;;:19;;2313:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1724:1;2454:7;:18;;;;27098:1:::1;27085:9;;:14;;27076:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27179:10;27165:24;;:10;:24;;;:81;;;;27193:53;27222:10;27234;27193:27;:53::i;:::-;27165:81;27156:117;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27315:1;27293:24;;:10;:24;;;;27284:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27351:11;:9;:11::i;:::-;27375:10;27399:8;27388:29;;;27419:9;27430:7;27388:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;27375:64;;27485:5;:13;;;27459:22;27474:5;27459:9;;:13;;:22;;;;:::i;:::-;:39;;27450:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27545:15;27563:16;:14;:16::i;:::-;27545:34;;27613:16;27632:12;:10;:12::i;:::-;27613:31;;27679:11;27666:9;:24;;27657:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27767:11;27781:18;27792:5;27781:9;:18::i;:::-;27767:32;;27863:8;27853:6;:18;;27844:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27968:11;:9;:11::i;:::-;27958:6;:21;;27949:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28108:22;28123:5;28108:9;;:13;;:22;;;;:::i;:::-;28096:9;:34;;;;28178:8;28189:36;28218:5;28189:23;28201:5;:9;;;28189:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;28178:47;;28256:17;28268:3;28256:6;:10;;:17;;;;:::i;:::-;28247:5;:26;;28238:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28324:11;28338:30;28363:3;28338:19;28349:6;28338:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;28324:44;;28549:74;28587:10;28607:4;28614:7;28557:9;28549:36;;;;:74;;;;;;:::i;:::-;28642:9;28634:27;;;28663:8;28673:7;28634:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;28704:8;28693:29;;;28724:7;28733:9;28744:6;28693:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;28777:1;28770:3;:8;28765:112;;28826:38;28854:3;28859;28834;28826:26;;;;:38;;;;;:::i;:::-;28765:112;28951:201;;;;;;;;28980:43;29015:6;28980:8;:22;28990:10;28980:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;28951:201;;;;29130:10;28951:201;;;;29089:15;28951:201;;;;29047:5;:17:::0;::::1;;28951:201;;::::0;28926:8:::1;:22;28936:10;28926:22;;;;;;;;;;;;;;;:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29281:10;29239:40;29260:5;:17:::0;::::1;;29239:15;:19;;:40;;;;:::i;:::-;29231:6;29209:84;29222:7;29209:84;;;;;;;;;;;;;;;;;;29359:11;:9;:11::i;:::-;29345:12;:10;:12::i;:::-;29327:16;:14;:16::i;:::-;29309:63;;;;;;;;;;29387:8;:6;:8::i;:::-;29445:6;29438:13;;;;;;;;1680:1:::0;2633:7;:22;;;;26923:2537;;;;;:::o;36318:275::-;36375:4;36398:15;36393:193;;;36438:85;36518:3;36438:74;36472:14;36455:42;;;36499:9;36455:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36438:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;36431:92;;;;36393:193;36563:11;:9;:11::i;:::-;36556:18;;36318:275;;:::o;20086:28::-;;;:::o;38538:363::-;38601:4;38638:3;38628:13;;:6;:13;;;;38619:24;;;;;;38673:9;38663:19;;:6;:19;;;;38654:30;;;;;;38702:73;38722:6;38738;38730:26;;;38766:4;38730:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38702:73;;;;;;;;;;;;;;;;;;;;;;;;;;38788:81;38819:3;38832:6;38824:26;;;38860:4;38824:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38796:6;38788:29;;;;:81;;;;;:::i;:::-;38889:4;38882:11;;38538:363;;;:::o;20257:39::-;;;:::o;20620:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35927:270::-;35970:15;36002:11;36024:3;36016:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36002:41;;36067:122;36183:4;36067:110;:92;36102:24;36121:3;36102:13;:11;:13::i;:::-;:17;;:24;;;;:::i;:::-;36142:6;36067:19;:92::i;:::-;:108;:110::i;:::-;:114;;:122;;;;:::i;:::-;36054:135;;35927:270;;:::o;26328:366::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26443:1:::1;26423:22;;:8;:22;;;;26414:33;;;::::0;::::1;;26463:7;26458:180;;;26500:4;26488:9;;:16;;;;;;;;;;;;;;;;;;26535:8;26519:13;;:24;;;;;;;;;;;;;;;;;;26458:180;;;26588:5;26576:9;;:17;;;;;;;;;;;;;;;;;;26618:8;26608:7;;:18;;;;;;;;;;;;;;;;;;26458:180;26655:31;26667:8;26677:7;26655:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;26328:366:::0;;:::o;20499:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20158:37::-;;;:::o;34634:261::-;34677:11;34719:69;34783:3;34719:58;34765:10;34719:40;34746:11;:9;:11::i;:::-;34719:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;34710:78;;34813:5;:18;;;34804:6;:27;34799:89;;;34858:5;:18;;;34849:27;;34799:89;34634:261;:::o;34099:140::-;34142:4;34167:64;34223:6;34167:50;34200:5;:15;;;34175:3;34167:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:50;;;;:::i;:::-;:54;;:64;;;;:::i;:::-;34160:71;;34099:140;:::o;3164:27::-;;;;;;;;;;;;;:::o;36900:288::-;36943:11;36968:21;36992:32;37013:9;;36992:15;:19;;:32;;;;:::i;:::-;36968:56;;37044:55;37080:5;:17;;;37044:30;37059:13;37044:9;;:13;;:30;;;;:::i;:::-;:34;;:55;;;;:::i;:::-;37035:64;;37124:9;;37115:6;:18;37110:71;;;37160:9;;37151:18;;37110:71;36900:288;;:::o;19869:28::-;;;:::o;20795:24::-;;;;:::o;20713:21::-;;;;:::o;6018:250::-;6076:7;6105:1;6100;:6;6096:47;;;6130:1;6123:8;;;;6096:47;6155:9;6171:1;6167;:5;6155:17;;6200:1;6195;6191;:5;;;;;;:10;6183:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6259:1;6252:8;;;6018:250;;;;;:::o;6276:132::-;6334:7;6361:39;6365:1;6368;6361:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6354:46;;6276:132;;;;:::o;32106:387::-;32199:4;32222:9;;;;;;;;;;;32217:269;;;32302:13;;;;;;;;;;;32286:59;;;32347:9;32358:6;32286:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32279:87;;;;32217:269;32416:7;;;;;;;;;;;32406:47;;;32455:9;32466:6;32406:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32399:75;;32106:387;;;;;:::o;31256:694::-;31345:4;31369:6;31363:555;;31427:49;31455:10;31467:7;31435:3;31427:26;;;;:49;;;;;:::i;:::-;31363:555;;;31555:9;;;;;;;;;;;31550:357;;;31624:3;31616:21;;;31639:13;;;;;;;;;;;31654:7;31616:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31698:13;;;;;;;;;;;31682:37;;;31721:7;31730:10;31682:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31550:357;;;31791:3;31783:21;;;31806:7;;;;;;;;;;;31815;31783:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31853:7;;;;;;;;;;;31843:25;;;31870:7;31879:10;31843:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31550:357;31363:555;31935:7;31928:14;;31256:694;;;;;:::o;5331:136::-;5389:7;5416:43;5420:1;5423;5416:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5409:50;;5331:136;;;;:::o;17129:719::-;17210:16;;:::i;:::-;17261:1;17247:11;:15;17239:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17333:1;17320:9;:14;17316:50;;;17343:23;;;;;;;;17364:1;17343:23;;;;;17336:30;;;;17316:50;17404:2;17383:24;;:9;:24;17379:462;;17424:14;17469:11;16555:3;17442:23;;:9;:23;;17441:39;;;;;;17424:56;;17521:2;17503:21;;:6;:21;;17495:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17581:26;;;;;;;;17599:6;17581:26;;;;;17574:33;;;;;17379:462;17640:14;17657:45;17673:9;16597:31;17690:11;17657:15;:45::i;:::-;17640:62;;17743:2;17725:21;;:6;:21;;17717:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17803:26;;;;;;;;17821:6;17803:26;;;;;17796:33;;;17129:719;;;;;:::o;16984:137::-;17055:4;17097:16;17086:4;:7;;;17081:13;;:32;;;;;;17074:39;;16984:137;;;:::o;33827:127::-;33880:28;33895:11;:9;:11::i;:::-;33880:9;;:13;;:28;;;;:::i;:::-;33868:9;:40;;;;33931:15;33919:9;:27;;;;33827:127::o;5142:181::-;5200:7;5220:9;5236:1;5232;:5;5220:17;;5261:1;5256;:6;;5248:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5314:1;5307:8;;;5142:181;;;;:::o;35022:345::-;35063:11;35097:69;35161:3;35097:58;35143:10;35097:40;35124:11;:9;:11::i;:::-;35097:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;35088:78;;35191:5;:18;;;35182:6;:27;35177:183;;;35236:5;:18;;;35227:27;;35177:183;;;35307:1;35285:5;:18;;;:23;35280:80;;35347:1;35326:5;:18;;:22;;;;35280:80;35177:183;35022:345;:::o;13652:205::-;13753:96;13773:5;13803:27;;;13832:4;13838:2;13842:5;13780:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13753:19;:96::i;:::-;13652:205;;;;:::o;13467:177::-;13550:86;13570:5;13600:23;;;13625:2;13629:5;13577:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13550:19;:86::i;:::-;13467:177;;;:::o;32585:1181::-;32623:18;32644:44;32669:10;:17;;;32644:10;:19;;;:23;;:44;;;;:::i;:::-;32623:65;;32722:1;32703:10;:15;;;:20;;:56;;;;;32746:13;32727:15;:32;;32703:56;32699:1060;;;32777:12;32792:5;:21;;;32777:36;;32833:10;:14;;;;;;;;;;;;32828:756;;;32893:44;32920:10;:15;;;32893:5;:21;;;:25;;:44;;;;:::i;:::-;32869:5;:21;;:68;;;;32986:10;:17;;;32961:5;:21;;;:42;32956:220;;33053:10;:17;;;33029:5;:21;;:41;;;;33113:1;33093:10;:17;;:21;;;;33155:1;33137:10;:15;;:19;;;;32956:220;32828:756;;;33264:10;:15;;;33240:5;:21;;;:39;:90;;33329:1;33240:90;;;33282:44;33309:10;:15;;;33282:5;:21;;;:25;;:44;;;;:::i;:::-;33240:90;33216:5;:21;;:114;;;;33379:10;:17;;;33354:5;:21;;;:42;33349:220;;33446:10;:17;;;33422:5;:21;;:41;;;;33506:1;33486:10;:17;;:21;;;;33548:1;33530:10;:15;;:19;;;;33349:220;32828:756;33620:15;33598:10;:19;;:37;;;;33655:92;33682:7;33691:5;:21;;;33714:10;:15;;;33731:10;:14;;;;;;;;;;;;33655:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32699:1060;;32585:1181;:::o;6416:189::-;6502:7;6534:1;6530;:5;6537:12;6522:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6561:9;6577:1;6573;:5;;;;;;6561:17;;6596:1;6589:8;;;6416:189;;;;;:::o;5475:192::-;5561:7;5594:1;5589;:6;;5597:12;5581:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5621:9;5637:1;5633;:5;5621:17;;5658:1;5651:8;;;5475:192;;;;;:::o;16029:347::-;16135:7;16156:9;16167;16180:13;16188:1;16191;16180:7;:13::i;:::-;16155:38;;;;16204:10;16230:1;16217:15;;;;;16227:1;16224;16217:15;16204:28;;16252:1;16247:2;:6;16243:18;;;16260:1;16255:6;;;;16243:18;16277:2;16272:7;;;;16302:1;16298;:5;16290:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16352:16;16360:1;16363;16366;16352:7;:16::i;:::-;16345:23;;;;;16029:347;;;;;:::o;14870:420::-;14953:23;14979:69;15007:4;14979:69;;;;;;;;;;;;;;;;;14987:5;14979:27;;;;:69;;;;;:::i;:::-;14953:95;;15083:1;15063:10;:17;:21;15059:224;;;15205:10;15194:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15186:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15059:224;14870:420;;;:::o;15321:210::-;15382:9;15393;15415:10;15449:2;15428:25;;;;;15438:1;15435;15428:25;15415:38;;15472:1;15468;:5;15464:9;;15493:1;15488:2;:6;15484:10;;15514:1;15509:2;:6;15505:18;;;15522:1;15517:6;;;;15505:18;15321:210;;;;;;:::o;15539:482::-;15645:7;15665:12;15685:1;15684:2;;15680:1;:6;15665:21;;15702:4;15697:9;;;;;;;;;15722:4;15717:9;;;;;;;;;15764:1;15757:4;15749;15748:5;;15747:14;;;;;;:18;15742:1;:24;15737:29;;;;15777:9;15789:1;15777:13;;15814:1;15810;:5;15806:1;:9;15801:14;;;;15839:1;15835;:5;15831:1;:9;15826:14;;;;15864:1;15860;:5;15856:1;:9;15851:14;;;;15889:1;15885;:5;15881:1;:9;15876:14;;;;15914:1;15910;:5;15906:1;:9;15901:14;;;;15939:1;15935;:5;15931:1;:9;15926:14;;;;15964:1;15960;:5;15956:1;:9;15951:14;;;;15989:1;15985;:5;15981:1;:9;15976:14;;;;16012:1;16008;:5;16001:12;;;;15539:482;;;;;:::o;8117:232::-;8256:12;8288:53;8311:6;8319:4;8325:1;8328:12;8288:22;:53::i;:::-;8281:60;;8117:232;;;;;:::o;9175:1025::-;9351:12;9384:18;9395:6;9384:10;:18::i;:::-;9376:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9510:12;9524:23;9551:6;:11;;9571:8;9582:4;9551:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9509:78;;;;9602:7;9598:595;;;9633:10;9626:17;;;;;;9598:595;9767:1;9747:10;:17;:21;9743:439;;;10010:10;10004:17;10071:15;10058:10;10054:2;10050:19;10043:44;9958:148;10153:12;10146:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9175:1025;;;;;;;:::o;7290:233::-;7350:4;7369:12;7480:7;7468:20;7460:28;;7514:1;7507:4;:8;7500:15;;;7290:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://df75655642e0f1ef4c6e5a85ffd67a497d59cb1ab845bf2a21d1018f8ea6cbfc
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.