Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x2b2315aa143d76f72ee41f680a10c40ddfa038cf42a701c4cefe007de8202584 | 0x60806040 | 14349252 | 637 days 10 hrs ago | 0x16cc37d06fe5061cd0023fb8d142abaabb396a2b | IN | Create: DVM | 0 MATIC | 0.003524325 |
[ Download CSV Export ]
Contract Name:
DVM
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-11 */ // File: contracts/lib/InitializableOwnable.sol /* Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0 */ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; /** * @title Ownable * @author DODO Breeder * * @notice Ownership related functions */ contract InitializableOwnable { address public _OWNER_; address public _NEW_OWNER_; bool internal _INITIALIZED_; // ============ Events ============ event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // ============ Modifiers ============ modifier notInitialized() { require(!_INITIALIZED_, "DODO_INITIALIZED"); _; } modifier onlyOwner() { require(msg.sender == _OWNER_, "NOT_OWNER"); _; } // ============ Functions ============ function initOwner(address newOwner) public notInitialized { _INITIALIZED_ = true; _OWNER_ = newOwner; } function transferOwnership(address newOwner) public onlyOwner { emit OwnershipTransferPrepared(_OWNER_, newOwner); _NEW_OWNER_ = newOwner; } function claimOwnership() public { require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM"); emit OwnershipTransferred(_OWNER_, _NEW_OWNER_); _OWNER_ = _NEW_OWNER_; _NEW_OWNER_ = address(0); } } // File: contracts/lib/FeeRateModel.sol interface IFeeRateImpl { function getFeeRate(address pool, address trader) external view returns (uint256); } interface IFeeRateModel { function getFeeRate(address trader) external view returns (uint256); } contract FeeRateModel is InitializableOwnable { address public feeRateImpl; function setFeeProxy(address _feeRateImpl) public onlyOwner { feeRateImpl = _feeRateImpl; } function getFeeRate(address trader) external view returns (uint256) { if(feeRateImpl == address(0)) return 0; return IFeeRateImpl(feeRateImpl).getFeeRate(msg.sender,trader); } } // File: contracts/intf/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } // File: contracts/lib/SafeMath.sol /** * @title SafeMath * @author DODO Breeder * * @notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; } function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } // File: contracts/lib/DecimalMath.sol /** * @title DecimalMath * @author DODO Breeder * * @notice Functions for fixed point number with 18 decimals */ library DecimalMath { using SafeMath for uint256; uint256 internal constant ONE = 10**18; uint256 internal constant ONE2 = 10**36; function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d) / (10**18); } function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d).divCeil(10**18); } function divFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).div(d); } function divCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).divCeil(d); } function reciprocalFloor(uint256 target) internal pure returns (uint256) { return uint256(10**36).div(target); } function reciprocalCeil(uint256 target) internal pure returns (uint256) { return uint256(10**36).divCeil(target); } } // File: contracts/lib/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; 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 { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length 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)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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"); } } } // File: contracts/lib/ReentrancyGuard.sol /** * @title ReentrancyGuard * @author DODO Breeder * * @notice Protect functions from Reentrancy Attack */ contract ReentrancyGuard { // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations // zero-state of _ENTERED_ is false bool private _ENTERED_; modifier preventReentrant() { require(!_ENTERED_, "REENTRANT"); _ENTERED_ = true; _; _ENTERED_ = false; } } // File: contracts/lib/DODOMath.sol /** * @title DODOMath * @author DODO Breeder * * @notice Functions for complex calculating. Including ONE Integration and TWO Quadratic solutions */ library DODOMath { using SafeMath for uint256; /* Integrate dodo curve from V1 to V2 require V0>=V1>=V2>0 res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1) let V1-V2=delta res = i*delta*(1-k+k(V0^2/V1/V2)) i is the price of V-res trading pair support k=1 & k=0 case [round down] */ function _GeneralIntegrate( uint256 V0, uint256 V1, uint256 V2, uint256 i, uint256 k ) internal pure returns (uint256) { require(V0 > 0, "TARGET_IS_ZERO"); uint256 fairAmount = i.mul(V1.sub(V2)); // i*delta if (k == 0) { return fairAmount.div(DecimalMath.ONE); } uint256 V0V0V1V2 = DecimalMath.divFloor(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.ONE.sub(k).add(penalty).mul(fairAmount).div(DecimalMath.ONE2); } /* Follow the integration function above i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Assume Q2=Q0, Given Q1 and deltaB, solve Q0 i is the price of delta-V trading pair give out target of V support k=1 & k=0 case [round down] */ function _SolveQuadraticFunctionForTarget( uint256 V1, uint256 delta, uint256 i, uint256 k ) internal pure returns (uint256) { if (V1 == 0) { return 0; } if (k == 0) { return V1.add(DecimalMath.mulFloor(i, delta)); } // V0 = V1*(1+(sqrt-1)/2k) // sqrt = √(1+4kidelta/V1) // premium = 1+(sqrt-1)/2k // uint256 sqrt = (4 * k).mul(i).mul(delta).div(V1).add(DecimalMath.ONE2).sqrt(); uint256 sqrt; uint256 ki = (4 * k).mul(i); if (ki == 0) { sqrt = DecimalMath.ONE; } else if ((ki * delta) / ki == delta) { sqrt = (ki * delta).div(V1).add(DecimalMath.ONE2).sqrt(); } else { sqrt = ki.div(V1).mul(delta).add(DecimalMath.ONE2).sqrt(); } uint256 premium = DecimalMath.divFloor(sqrt.sub(DecimalMath.ONE), k * 2).add(DecimalMath.ONE); // V0 is greater than or equal to V1 according to the solution return DecimalMath.mulFloor(V1, premium); } /* Follow the integration expression above, we have: i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Given Q1 and deltaB, solve Q2 This is a quadratic function and the standard version is aQ2^2 + bQ2 + c = 0, where a=1-k -b=(1-k)Q1-kQ0^2/Q1+i*deltaB c=-kQ0^2 and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k) note: another root is negative, abondan if deltaBSig=true, then Q2>Q1, user sell Q and receive B if deltaBSig=false, then Q2<Q1, user sell B and receive Q return |Q1-Q2| as we only support sell amount as delta, the deltaB is always negative the input ideltaB is actually -ideltaB in the equation i is the price of delta-V trading pair support k=1 & k=0 case [round down] */ function _SolveQuadraticFunctionForTrade( uint256 V0, uint256 V1, uint256 delta, uint256 i, uint256 k ) internal pure returns (uint256) { require(V0 > 0, "TARGET_IS_ZERO"); if (delta == 0) { return 0; } if (k == 0) { return DecimalMath.mulFloor(i, delta) > V1 ? V1 : DecimalMath.mulFloor(i, delta); } if (k == DecimalMath.ONE) { // if k==1 // Q2=Q1/(1+ideltaBQ1/Q0/Q0) // temp = ideltaBQ1/Q0/Q0 // Q2 = Q1/(1+temp) // Q1-Q2 = Q1*(1-1/(1+temp)) = Q1*(temp/(1+temp)) // uint256 temp = i.mul(delta).mul(V1).div(V0.mul(V0)); uint256 temp; uint256 idelta = i.mul(delta); if (idelta == 0) { temp = 0; } else if ((idelta * V1) / idelta == V1) { temp = (idelta * V1).div(V0.mul(V0)); } else { temp = delta.mul(V1).div(V0).mul(i).div(V0); } return V1.mul(temp).div(temp.add(DecimalMath.ONE)); } // calculate -b value and sig // b = kQ0^2/Q1-i*deltaB-(1-k)Q1 // part1 = (1-k)Q1 >=0 // part2 = kQ0^2/Q1-i*deltaB >=0 // bAbs = abs(part1-part2) // if part1>part2 => b is negative => bSig is false // if part2>part1 => b is positive => bSig is true uint256 part2 = k.mul(V0).div(V1).mul(V0).add(i.mul(delta)); // kQ0^2/Q1-i*deltaB uint256 bAbs = DecimalMath.ONE.sub(k).mul(V1); // (1-k)Q1 bool bSig; if (bAbs >= part2) { bAbs = bAbs - part2; bSig = false; } else { bAbs = part2 - bAbs; bSig = true; } bAbs = bAbs.div(DecimalMath.ONE); // calculate sqrt uint256 squareRoot = DecimalMath.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(k, V0).mul(V0) ); // 4(1-k)kQ0^2 squareRoot = bAbs.mul(bAbs).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0) // final res uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k) uint256 numerator; if (bSig) { numerator = squareRoot.sub(bAbs); } else { numerator = bAbs.add(squareRoot); } uint256 V2 = DecimalMath.divCeil(numerator, denominator); if (V2 > V1) { return 0; } else { return V1 - V2; } } } // File: contracts/lib/PMMPricing.sol /** * @title Pricing * @author DODO Breeder * * @notice DODO Pricing model */ library PMMPricing { using SafeMath for uint256; enum RState {ONE, ABOVE_ONE, BELOW_ONE} struct PMMState { uint256 i; uint256 K; uint256 B; uint256 Q; uint256 B0; uint256 Q0; RState R; } // ============ buy & sell ============ function sellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns (uint256 receiveQuoteAmount, RState newR) { if (state.R == RState.ONE) { // case 1: R=1 // R falls below one receiveQuoteAmount = _ROneSellBaseToken(state, payBaseAmount); newR = RState.BELOW_ONE; } else if (state.R == RState.ABOVE_ONE) { uint256 backToOnePayBase = state.B0.sub(state.B); uint256 backToOneReceiveQuote = state.Q.sub(state.Q0); // case 2: R>1 // complex case, R status depends on trading amount if (payBaseAmount < backToOnePayBase) { // case 2.1: R status do not change receiveQuoteAmount = _RAboveSellBaseToken(state, payBaseAmount); newR = RState.ABOVE_ONE; if (receiveQuoteAmount > backToOneReceiveQuote) { // [Important corner case!] may enter this branch when some precision problem happens. And consequently contribute to negative spare quote amount // to make sure spare quote>=0, mannually set receiveQuote=backToOneReceiveQuote receiveQuoteAmount = backToOneReceiveQuote; } } else if (payBaseAmount == backToOnePayBase) { // case 2.2: R status changes to ONE receiveQuoteAmount = backToOneReceiveQuote; newR = RState.ONE; } else { // case 2.3: R status changes to BELOW_ONE receiveQuoteAmount = backToOneReceiveQuote.add( _ROneSellBaseToken(state, payBaseAmount.sub(backToOnePayBase)) ); newR = RState.BELOW_ONE; } } else { // state.R == RState.BELOW_ONE // case 3: R<1 receiveQuoteAmount = _RBelowSellBaseToken(state, payBaseAmount); newR = RState.BELOW_ONE; } } function sellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns (uint256 receiveBaseAmount, RState newR) { if (state.R == RState.ONE) { receiveBaseAmount = _ROneSellQuoteToken(state, payQuoteAmount); newR = RState.ABOVE_ONE; } else if (state.R == RState.ABOVE_ONE) { receiveBaseAmount = _RAboveSellQuoteToken(state, payQuoteAmount); newR = RState.ABOVE_ONE; } else { uint256 backToOnePayQuote = state.Q0.sub(state.Q); uint256 backToOneReceiveBase = state.B.sub(state.B0); if (payQuoteAmount < backToOnePayQuote) { receiveBaseAmount = _RBelowSellQuoteToken(state, payQuoteAmount); newR = RState.BELOW_ONE; if (receiveBaseAmount > backToOneReceiveBase) { receiveBaseAmount = backToOneReceiveBase; } } else if (payQuoteAmount == backToOnePayQuote) { receiveBaseAmount = backToOneReceiveBase; newR = RState.ONE; } else { receiveBaseAmount = backToOneReceiveBase.add( _ROneSellQuoteToken(state, payQuoteAmount.sub(backToOnePayQuote)) ); newR = RState.ABOVE_ONE; } } } // ============ R = 1 cases ============ function _ROneSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { // in theory Q2 <= targetQuoteTokenAmount // however when amount is close to 0, precision problems may cause Q2 > targetQuoteTokenAmount return DODOMath._SolveQuadraticFunctionForTrade( state.Q0, state.Q0, payBaseAmount, state.i, state.K ); } function _ROneSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.B0, state.B0, payQuoteAmount, DecimalMath.reciprocalFloor(state.i), state.K ); } // ============ R < 1 cases ============ function _RBelowSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._GeneralIntegrate( state.Q0, state.Q.add(payQuoteAmount), state.Q, DecimalMath.reciprocalFloor(state.i), state.K ); } function _RBelowSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.Q0, state.Q, payBaseAmount, state.i, state.K ); } // ============ R > 1 cases ============ function _RAboveSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { return DODOMath._GeneralIntegrate( state.B0, state.B.add(payBaseAmount), state.B, state.i, state.K ); } function _RAboveSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.B0, state.B, payQuoteAmount, DecimalMath.reciprocalFloor(state.i), state.K ); } // ============ Helper functions ============ function adjustedTarget(PMMState memory state) internal pure { if (state.R == RState.BELOW_ONE) { state.Q0 = DODOMath._SolveQuadraticFunctionForTarget( state.Q, state.B.sub(state.B0), state.i, state.K ); } else if (state.R == RState.ABOVE_ONE) { state.B0 = DODOMath._SolveQuadraticFunctionForTarget( state.B, state.Q.sub(state.Q0), DecimalMath.reciprocalFloor(state.i), state.K ); } } function getMidPrice(PMMState memory state) internal pure returns (uint256) { if (state.R == RState.BELOW_ONE) { uint256 R = DecimalMath.divFloor(state.Q0.mul(state.Q0).div(state.Q), state.Q); R = DecimalMath.ONE.sub(state.K).add(DecimalMath.mulFloor(state.K, R)); return DecimalMath.divFloor(state.i, R); } else { uint256 R = DecimalMath.divFloor(state.B0.mul(state.B0).div(state.B), state.B); R = DecimalMath.ONE.sub(state.K).add(DecimalMath.mulFloor(state.K, R)); return DecimalMath.mulFloor(state.i, R); } } } // File: contracts/DODOVendingMachine/impl/DVMStorage.sol contract DVMStorage is ReentrancyGuard { using SafeMath for uint256; bool public _IS_OPEN_TWAP_ = false; bool internal _DVM_INITIALIZED_; // ============ Core Address ============ address public _MAINTAINER_; IERC20 public _BASE_TOKEN_; IERC20 public _QUOTE_TOKEN_; uint112 public _BASE_RESERVE_; uint112 public _QUOTE_RESERVE_; uint32 public _BLOCK_TIMESTAMP_LAST_; uint256 public _BASE_PRICE_CUMULATIVE_LAST_; // ============ Shares (ERC20) ============ string public symbol; uint8 public decimals; string public name; uint256 public totalSupply; mapping(address => uint256) internal _SHARES_; mapping(address => mapping(address => uint256)) internal _ALLOWED_; // ================= Permit ====================== bytes32 public DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public nonces; // ============ Variables for Pricing ============ uint256 public _LP_FEE_RATE_; IFeeRateModel public _MT_FEE_RATE_MODEL_; uint256 public _K_; uint256 public _I_; // ============ Helper Functions ============ function getPMMState() public view returns (PMMPricing.PMMState memory state) { state.i = _I_; state.K = _K_; state.B = _BASE_RESERVE_; state.Q = _QUOTE_RESERVE_; state.B0 = 0; // will be calculated in adjustedTarget state.Q0 = 0; state.R = PMMPricing.RState.ABOVE_ONE; PMMPricing.adjustedTarget(state); } function getPMMStateForCall() external view returns ( uint256 i, uint256 K, uint256 B, uint256 Q, uint256 B0, uint256 Q0, uint256 R ) { PMMPricing.PMMState memory state = getPMMState(); i = state.i; K = state.K; B = state.B; Q = state.Q; B0 = state.B0; Q0 = state.Q0; R = uint256(state.R); } function getMidPrice() public view returns (uint256 midPrice) { return PMMPricing.getMidPrice(getPMMState()); } } // File: contracts/DODOVendingMachine/impl/DVMVault.sol contract DVMVault is DVMStorage { using SafeMath for uint256; using SafeERC20 for IERC20; // ============ Events ============ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event Mint(address indexed user, uint256 value); event Burn(address indexed user, uint256 value); // ============ View Functions ============ function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve) { baseReserve = _BASE_RESERVE_; quoteReserve = _QUOTE_RESERVE_; } function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate) { lpFeeRate = _LP_FEE_RATE_; mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(user); } // ============ Asset In ============ function getBaseInput() public view returns (uint256 input) { return _BASE_TOKEN_.balanceOf(address(this)).sub(uint256(_BASE_RESERVE_)); } function getQuoteInput() public view returns (uint256 input) { return _QUOTE_TOKEN_.balanceOf(address(this)).sub(uint256(_QUOTE_RESERVE_)); } // ============ TWAP UPDATE =========== function _twapUpdate() internal { uint32 blockTimestamp = uint32(block.timestamp % 2**32); uint32 timeElapsed = blockTimestamp - _BLOCK_TIMESTAMP_LAST_; if (timeElapsed > 0 && _BASE_RESERVE_ != 0 && _QUOTE_RESERVE_ != 0) { _BASE_PRICE_CUMULATIVE_LAST_ += getMidPrice() * timeElapsed; } _BLOCK_TIMESTAMP_LAST_ = blockTimestamp; } // ============ Set States ============ function _setReserve(uint256 baseReserve, uint256 quoteReserve) internal { require(baseReserve <= uint112(-1) && quoteReserve <= uint112(-1), "OVERFLOW"); _BASE_RESERVE_ = uint112(baseReserve); _QUOTE_RESERVE_ = uint112(quoteReserve); if(_IS_OPEN_TWAP_) _twapUpdate(); } function _sync() internal { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); require(baseBalance <= uint112(-1) && quoteBalance <= uint112(-1), "OVERFLOW"); if (baseBalance != _BASE_RESERVE_) { _BASE_RESERVE_ = uint112(baseBalance); } if (quoteBalance != _QUOTE_RESERVE_) { _QUOTE_RESERVE_ = uint112(quoteBalance); } if(_IS_OPEN_TWAP_) _twapUpdate(); } function sync() external preventReentrant { _sync(); } // ============ Asset Out ============ function _transferBaseOut(address to, uint256 amount) internal { if (amount > 0) { _BASE_TOKEN_.safeTransfer(to, amount); } } function _transferQuoteOut(address to, uint256 amount) internal { if (amount > 0) { _QUOTE_TOKEN_.safeTransfer(to, amount); } } // ============ Shares (ERC20) ============ /** * @dev transfer token for a specified address * @param to The address to transfer to. * @param amount The amount to be transferred. */ function transfer(address to, uint256 amount) public returns (bool) { require(amount <= _SHARES_[msg.sender], "BALANCE_NOT_ENOUGH"); _SHARES_[msg.sender] = _SHARES_[msg.sender].sub(amount); _SHARES_[to] = _SHARES_[to].add(amount); emit Transfer(msg.sender, to, amount); return true; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the the balance of. * @return balance An uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) external view returns (uint256 balance) { return _SHARES_[owner]; } /** * @dev Transfer tokens from one address to another * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param amount uint256 the amount of tokens to be transferred */ function transferFrom( address from, address to, uint256 amount ) public returns (bool) { require(amount <= _SHARES_[from], "BALANCE_NOT_ENOUGH"); require(amount <= _ALLOWED_[from][msg.sender], "ALLOWANCE_NOT_ENOUGH"); _SHARES_[from] = _SHARES_[from].sub(amount); _SHARES_[to] = _SHARES_[to].add(amount); _ALLOWED_[from][msg.sender] = _ALLOWED_[from][msg.sender].sub(amount); emit Transfer(from, to, amount); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * @param spender The address which will spend the funds. * @param amount The amount of tokens to be spent. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(msg.sender, spender, amount); return true; } function _approve( address owner, address spender, uint256 amount ) private { _ALLOWED_[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Function to check the amount of tokens that an owner _ALLOWED_ to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view returns (uint256) { return _ALLOWED_[owner][spender]; } function _mint(address user, uint256 value) internal { require(value > 1000, "MINT_INVALID"); _SHARES_[user] = _SHARES_[user].add(value); totalSupply = totalSupply.add(value); emit Mint(user, value); emit Transfer(address(0), user, value); } function _burn(address user, uint256 value) internal { _SHARES_[user] = _SHARES_[user].sub(value); totalSupply = totalSupply.sub(value); emit Burn(user, value); emit Transfer(user, address(0), value); } // ============================ Permit ====================================== function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "DODO_DVM_LP: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require( recoveredAddress != address(0) && recoveredAddress == owner, "DODO_DVM_LP: INVALID_SIGNATURE" ); _approve(owner, spender, value); } } // File: contracts/intf/IDODOCallee.sol interface IDODOCallee { function DVMSellShareCall( address sender, uint256 burnShareAmount, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DVMFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DPPFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DSPFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function CPCancelCall( address sender, uint256 amount, bytes calldata data ) external; function CPClaimBidCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; } // File: contracts/DODOVendingMachine/impl/DVMTrader.sol contract DVMTrader is DVMVault { using SafeMath for uint256; // ============ Events ============ event DODOSwap( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, address trader, address receiver ); event DODOFlashLoan( address borrower, address assetTo, uint256 baseAmount, uint256 quoteAmount ); // ============ Trade Functions ============ function sellBase(address to) external preventReentrant returns (uint256 receiveQuoteAmount) { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 baseInput = baseBalance.sub(uint256(_BASE_RESERVE_)); uint256 mtFee; (receiveQuoteAmount, mtFee) = querySellBase(tx.origin, baseInput); _transferQuoteOut(to, receiveQuoteAmount); _transferQuoteOut(_MAINTAINER_, mtFee); _setReserve(baseBalance, _QUOTE_TOKEN_.balanceOf(address(this))); emit DODOSwap( address(_BASE_TOKEN_), address(_QUOTE_TOKEN_), baseInput, receiveQuoteAmount, msg.sender, to ); } function sellQuote(address to) external preventReentrant returns (uint256 receiveBaseAmount) { uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 quoteInput = quoteBalance.sub(uint256(_QUOTE_RESERVE_)); uint256 mtFee; (receiveBaseAmount, mtFee) = querySellQuote(tx.origin, quoteInput); _transferBaseOut(to, receiveBaseAmount); _transferBaseOut(_MAINTAINER_, mtFee); _setReserve(_BASE_TOKEN_.balanceOf(address(this)), quoteBalance); emit DODOSwap( address(_QUOTE_TOKEN_), address(_BASE_TOKEN_), quoteInput, receiveBaseAmount, msg.sender, to ); } function flashLoan( uint256 baseAmount, uint256 quoteAmount, address assetTo, bytes calldata data ) external preventReentrant { _transferBaseOut(assetTo, baseAmount); _transferQuoteOut(assetTo, quoteAmount); if (data.length > 0) IDODOCallee(assetTo).DVMFlashLoanCall(msg.sender, baseAmount, quoteAmount, data); uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); // no input -> pure loss require( baseBalance >= _BASE_RESERVE_ || quoteBalance >= _QUOTE_RESERVE_, "FLASH_LOAN_FAILED" ); // sell quote if (baseBalance < _BASE_RESERVE_) { uint256 quoteInput = quoteBalance.sub(uint256(_QUOTE_RESERVE_)); (uint256 receiveBaseAmount, uint256 mtFee) = querySellQuote(tx.origin, quoteInput); require(uint256(_BASE_RESERVE_).sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED"); _transferBaseOut(_MAINTAINER_, mtFee); emit DODOSwap( address(_QUOTE_TOKEN_), address(_BASE_TOKEN_), quoteInput, receiveBaseAmount, msg.sender, assetTo ); } // sell base if (quoteBalance < _QUOTE_RESERVE_) { uint256 baseInput = baseBalance.sub(uint256(_BASE_RESERVE_)); (uint256 receiveQuoteAmount, uint256 mtFee) = querySellBase(tx.origin, baseInput); require(uint256(_QUOTE_RESERVE_).sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED"); _transferQuoteOut(_MAINTAINER_, mtFee); emit DODOSwap( address(_BASE_TOKEN_), address(_QUOTE_TOKEN_), baseInput, receiveQuoteAmount, msg.sender, assetTo ); } _sync(); emit DODOFlashLoan(msg.sender, assetTo, baseAmount, quoteAmount); } // ============ Query Functions ============ function querySellBase(address trader, uint256 payBaseAmount) public view returns (uint256 receiveQuoteAmount, uint256 mtFee) { (receiveQuoteAmount, ) = PMMPricing.sellBaseToken(getPMMState(), payBaseAmount); uint256 lpFeeRate = _LP_FEE_RATE_; uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); mtFee = DecimalMath.mulFloor(receiveQuoteAmount, mtFeeRate); receiveQuoteAmount = receiveQuoteAmount .sub(DecimalMath.mulFloor(receiveQuoteAmount, lpFeeRate)) .sub(mtFee); } function querySellQuote(address trader, uint256 payQuoteAmount) public view returns (uint256 receiveBaseAmount, uint256 mtFee) { (receiveBaseAmount, ) = PMMPricing.sellQuoteToken(getPMMState(), payQuoteAmount); uint256 lpFeeRate = _LP_FEE_RATE_; uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); mtFee = DecimalMath.mulFloor(receiveBaseAmount, mtFeeRate); receiveBaseAmount = receiveBaseAmount .sub(DecimalMath.mulFloor(receiveBaseAmount, lpFeeRate)) .sub(mtFee); } } // File: contracts/DODOVendingMachine/impl/DVMFunding.sol contract DVMFunding is DVMVault { // ============ Events ============ event BuyShares(address to, uint256 increaseShares, uint256 totalShares); event SellShares(address payer, address to, uint256 decreaseShares, uint256 totalShares); // ============ Buy & Sell Shares ============ // buy shares [round down] function buyShares(address to) external preventReentrant returns ( uint256 shares, uint256 baseInput, uint256 quoteInput ) { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 baseReserve = _BASE_RESERVE_; uint256 quoteReserve = _QUOTE_RESERVE_; baseInput = baseBalance.sub(baseReserve); quoteInput = quoteBalance.sub(quoteReserve); require(baseInput > 0, "NO_BASE_INPUT"); // Round down when withdrawing. Therefore, never be a situation occuring balance is 0 but totalsupply is not 0 // But May Happen,reserve >0 But totalSupply = 0 if (totalSupply == 0) { // case 1. initial supply require(baseBalance >= 10**3, "INSUFFICIENT_LIQUIDITY_MINED"); shares = baseBalance; // 以免出现balance很大但shares很小的情况 } else if (baseReserve > 0 && quoteReserve == 0) { // case 2. supply when quote reserve is 0 shares = baseInput.mul(totalSupply).div(baseReserve); } else if (baseReserve > 0 && quoteReserve > 0) { // case 3. normal case uint256 baseInputRatio = DecimalMath.divFloor(baseInput, baseReserve); uint256 quoteInputRatio = DecimalMath.divFloor(quoteInput, quoteReserve); uint256 mintRatio = quoteInputRatio < baseInputRatio ? quoteInputRatio : baseInputRatio; shares = DecimalMath.mulFloor(totalSupply, mintRatio); } _mint(to, shares); _setReserve(baseBalance, quoteBalance); emit BuyShares(to, shares, _SHARES_[to]); } // sell shares [round down] function sellShares( uint256 shareAmount, address to, uint256 baseMinAmount, uint256 quoteMinAmount, bytes calldata data, uint256 deadline ) external preventReentrant returns (uint256 baseAmount, uint256 quoteAmount) { require(deadline >= block.timestamp, "TIME_EXPIRED"); require(shareAmount <= _SHARES_[msg.sender], "DLP_NOT_ENOUGH"); uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 totalShares = totalSupply; baseAmount = baseBalance.mul(shareAmount).div(totalShares); quoteAmount = quoteBalance.mul(shareAmount).div(totalShares); require( baseAmount >= baseMinAmount && quoteAmount >= quoteMinAmount, "WITHDRAW_NOT_ENOUGH" ); _burn(msg.sender, shareAmount); _transferBaseOut(to, baseAmount); _transferQuoteOut(to, quoteAmount); _sync(); if (data.length > 0) { IDODOCallee(to).DVMSellShareCall( msg.sender, shareAmount, baseAmount, quoteAmount, data ); } emit SellShares(msg.sender, to, shareAmount, _SHARES_[msg.sender]); } } // File: contracts/DODOVendingMachine/impl/DVM.sol /** * @title DODO VendingMachine * @author DODO Breeder * * @notice DODOVendingMachine initialization */ contract DVM is DVMTrader, DVMFunding { function init( address maintainer, address baseTokenAddress, address quoteTokenAddress, uint256 lpFeeRate, address mtFeeRateModel, uint256 i, uint256 k, bool isOpenTWAP ) external { require(!_DVM_INITIALIZED_, "DVM_INITIALIZED"); _DVM_INITIALIZED_ = true; require(baseTokenAddress != quoteTokenAddress, "BASE_QUOTE_CAN_NOT_BE_SAME"); _BASE_TOKEN_ = IERC20(baseTokenAddress); _QUOTE_TOKEN_ = IERC20(quoteTokenAddress); require(i > 0 && i <= 10**36); _I_ = i; require(k <= 10**18); _K_ = k; _LP_FEE_RATE_ = lpFeeRate; _MT_FEE_RATE_MODEL_ = IFeeRateModel(mtFeeRateModel); _MAINTAINER_ = maintainer; _IS_OPEN_TWAP_ = isOpenTWAP; if(isOpenTWAP) _BLOCK_TIMESTAMP_LAST_ = uint32(block.timestamp % 2**32); string memory connect = "_"; string memory suffix = "DLP"; name = string(abi.encodePacked(suffix, connect, addressToShortString(address(this)))); symbol = "DLP"; decimals = _BASE_TOKEN_.decimals(); // ============================== Permit ==================================== uint256 chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( // keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f, keccak256(bytes(name)), keccak256(bytes("1")), chainId, address(this) ) ); // ========================================================================== } function addressToShortString(address _addr) public pure returns (string memory) { bytes32 value = bytes32(uint256(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(8); for (uint256 i = 0; i < 4; i++) { str[i * 2] = alphabet[uint8(value[i + 12] >> 4)]; str[1 + i * 2] = alphabet[uint8(value[i + 12] & 0x0f)]; } return string(str); } // ============ Version Control ============ function version() external pure returns (string memory) { return "DVM 1.0.2"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"increaseShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalShares","type":"uint256"}],"name":"BuyShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"address","name":"assetTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"name":"DODOFlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DODOSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"decreaseShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalShares","type":"uint256"}],"name":"SellShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_PRICE_CUMULATIVE_LAST_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_RESERVE_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCK_TIMESTAMP_LAST_","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_IS_OPEN_TWAP_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_I_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_K_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LP_FEE_RATE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAINTAINER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MT_FEE_RATE_MODEL_","outputs":[{"internalType":"contract IFeeRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_RESERVE_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addressToShortString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"buyShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"baseInput","type":"uint256"},{"internalType":"uint256","name":"quoteInput","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"address","name":"assetTo","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseInput","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"midPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPMMState","outputs":[{"components":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint256","name":"Q","type":"uint256"},{"internalType":"uint256","name":"B0","type":"uint256"},{"internalType":"uint256","name":"Q0","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"R","type":"uint8"}],"internalType":"struct PMMPricing.PMMState","name":"state","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPMMStateForCall","outputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint256","name":"Q","type":"uint256"},{"internalType":"uint256","name":"B0","type":"uint256"},{"internalType":"uint256","name":"Q0","type":"uint256"},{"internalType":"uint256","name":"R","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuoteInput","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserFeeRate","outputs":[{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"mtFeeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultReserve","outputs":[{"internalType":"uint256","name":"baseReserve","type":"uint256"},{"internalType":"uint256","name":"quoteReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maintainer","type":"address"},{"internalType":"address","name":"baseTokenAddress","type":"address"},{"internalType":"address","name":"quoteTokenAddress","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"address","name":"mtFeeRateModel","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payBaseAmount","type":"uint256"}],"name":"querySellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payQuoteAmount","type":"uint256"}],"name":"querySellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shareAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"baseMinAmount","type":"uint256"},{"internalType":"uint256","name":"quoteMinAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"sellShares","outputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040526000805461ff001916905534801561001b57600080fd5b50613ec28061002b6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637d72150411610151578063d4b97046116100c3578063ee27c68911610087578063ee27c689146104e1578063f6b06e70146104e9578063f811d692146104f1578063fd1ed7e9146104f9578063fe24cb7f14610514578063fff6cae91461051c57610269565b8063d4b9704614610498578063d505accf146104a0578063dd62ed3e146104b3578063dd93f59a146104c6578063ec2fd46d146104d957610269565b8063a9059cbb11610115578063a9059cbb1461043c578063ab44a7a31461044f578063b56ceaa614610457578063bbf5ce781461046a578063bd6015b414610472578063d0a494e41461048557610269565b80637d721504146103e25780637ecebe00146103f7578063880a4d871461040a57806395d89b411461041f578063a382d1b91461042757610269565b80634322ec83116101ea57806354fd4d50116101ae57806354fd4d501461039157806365f6fcbb1461039957806366410a21146103a157806370a08231146103b457806371f9100c146103c757806379a04876146103cf57610269565b80634322ec831461032a578063440966091461033f5780634a248d2a146103525780634c85b4251461035a5780635039972a1461037c57610269565b80632df6cb48116102315780632df6cb48146102e757806330adf81f146102ef578063313ce567146102f757806336223ce91461030c5780633644e5151461032257610269565b806306fdde031461026e578063095ea7b31461028c57806317101940146102ac57806318160ddd146102bf57806323b872dd146102d4575b600080fd5b610276610524565b6040516102839190613914565b60405180910390f35b61029f61029a3660046134e7565b6105b2565b6040516102839190613882565b6102766102ba366004613361565b6105c9565b6102c76106f3565b604051610283919061388d565b61029f6102e2366004613439565b6106f9565b61029f61087d565b6102c761088b565b6102ff6108af565b6040516102839190613de0565b6103146108b8565b604051610283929190613d7b565b6102c76108d3565b6103326108d9565b6040516102839190613758565b61031461034d366004613361565b6108ef565b61033261097a565b61036d610368366004613361565b610989565b60405161028393929190613d89565b61038f61038a3660046133b0565b610c66565b005b610276610fa4565b6102c7610fc8565b6103146103af3660046134e7565b61106f565b6102c76103c2366004613361565b611144565b6102c761115f565b6103146103dd3660046134e7565b6111ab565b6103ea6111bf565b6040516102839190613d67565b6102c7610405366004613361565b6111ce565b6104126111e0565b6040516102839190613dcf565b6102766111f3565b61042f61124e565b6040516102839190613d0d565b61029f61044a3660046134e7565b6112a2565b6102c7611371565b610314610465366004613545565b611377565b6103ea611670565b6102c7610480366004613361565b611686565b61038f6104933660046135bf565b611872565b610332611ca0565b61038f6104ae366004613479565b611caf565b6102c76104c136600461337c565b611e1e565b6102c76104d4366004613361565b611e49565b6102c7612019565b6102c761201f565b610332612031565b6102c7612040565b610501612046565b6040516102839796959493929190613d9f565b6102c76120a9565b61038f6120af565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105aa5780601f1061057f576101008083540402835291602001916105aa565b820191906000526020600020905b81548152906001019060200180831161058d57829003601f168201915b505050505081565b60006105bf3384846120f3565b5060015b92915050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160088082528184019093526060926001600160a01b0385169291849160208201818036833701905050905060005b60048110156106e8578260048583600c016020811061063a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061065a57fe5b602001015160f81c60f81b82826002028151811061067457fe5b60200101906001600160f81b031916908160001a905350828482600c016020811061069b57fe5b825191901a600f169081106106ac57fe5b602001015160f81c60f81b8282600202600101815181106106c957fe5b60200101906001600160f81b031916908160001a90535060010161061f565b50925050505b919050565b60085481565b6001600160a01b03831660009081526009602052604081205482111561073a5760405162461bcd60e51b815260040161073190613bd2565b60405180910390fd5b6001600160a01b0384166000908152600a6020908152604080832033845290915290205482111561077d5760405162461bcd60e51b815260040161073190613972565b6001600160a01b0384166000908152600960205260409020546107a6908363ffffffff61215b16565b6001600160a01b0380861660009081526009602052604080822093909355908516815220546107db908363ffffffff61218316565b6001600160a01b038085166000908152600960209081526040808320949094559187168152600a8252828120338252909152205461081f908363ffffffff61215b16565b6001600160a01b038086166000818152600a60209081526040808320338452909152908190209390935591519085169190600080516020613e4d8339815191529061086b90869061388d565b60405180910390a35060019392505050565b600054610100900460ff1681565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b6003546001600160701b0380821692600160701b9092041690565b600b5481565b600054630100000090046001600160a01b031681565b600d54600e54604051638198edbf60e01b81526000916001600160a01b031690638198edbf90610923908690600401613758565b60206040518083038186803b15801561093b57600080fd5b505afa15801561094f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610973919061352d565b9050915091565b6001546001600160a01b031681565b600080548190819060ff16156109b15760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a08231906109ee903090600401613758565b60206040518083038186803b158015610a0657600080fd5b505afa158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3e919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610a74903090600401613758565b60206040518083038186803b158015610a8c57600080fd5b505afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac4919061352d565b6003549091506001600160701b0380821691600160701b900416610aee848363ffffffff61215b16565b9550610b00838263ffffffff61215b16565b945060008611610b225760405162461bcd60e51b815260040161073190613a57565b600854610b53576103e8841015610b4b5760405162461bcd60e51b815260040161073190613b9b565b839650610be8565b600082118015610b61575080155b15610b9257610b8b82610b7f600854896121af90919063ffffffff16565b9063ffffffff6121e916565b9650610be8565b600082118015610ba25750600081115b15610be8576000610bb3878461221b565b90506000610bc1878461221b565b90506000828210610bd25782610bd4565b815b9050610be260085482612239565b99505050505b610bf2888861225b565b610bfc8484612355565b6001600160a01b038816600090815260096020526040908190205490517f1c172440bdebb59cd92a7f08f4227903a3305ab6f880cb25f93eddb66843a10291610c48918b918b91613861565b60405180910390a150506000805460ff191690555092949193509150565b60005462010000900460ff1615610c8f5760405162461bcd60e51b815260040161073190613aa6565b6000805462ff00001916620100001790556001600160a01b038781169087161415610ccc5760405162461bcd60e51b8152600401610731906139eb565b600180546001600160a01b03808a166001600160a01b03199283161790925560028054928916929091169190911790558215801590610d1a57506ec097ce7bc90715b34b9f10000000008311155b610d2357600080fd5b6010839055670de0b6b3a7640000821115610d3d57600080fd5b600f829055600d859055600e80546001600160a01b038087166001600160a01b03199092169190911790915560008054831580156101000261ff0019948d166301000000026301000000600160b81b03199093169290921793909316179055610dbe57600380546001600160e01b03164263ffffffff16600160e01b021790555b60408051808201825260018152605f60f81b602080830191909152825180840190935260038352620444c560ec1b90830152908082610dfc306105c9565b604051602001610e0e939291906136f8565b60405160208183030381529060405260079080519060200190610e3292919061322b565b50604080518082019091526003808252620444c560ec1b6020909201918252610e5d9160059161322b565b50600160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610eac57600080fd5b505afa158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190613626565b6006805460ff191660ff9290921691909117905560405146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90610f2b90600790613688565b60408051918290038220828201825260018352603160f81b6020938401529051610f7c93927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69186913091016138e8565b60408051601f198184030181529190528051602090910120600b555050505050505050505050565b604080518082019091526009815268222b2690189718171960b91b60208201525b90565b6003546001546040516370a0823160e01b815260009261106a926001600160701b03909116916001600160a01b03909116906370a082319061100e903090600401613758565b60206040518083038186803b15801561102657600080fd5b505afa15801561103a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e919061352d565b9063ffffffff61215b16565b905090565b60008061108361107d61124e565b846123e4565b50600d54600e54604051638198edbf60e01b815292945090916000916001600160a01b031690638198edbf906110bd908990600401613758565b60206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d919061352d565b90506111198482612239565b92506111398361105e61112c8786612239565b879063ffffffff61215b16565b935050509250929050565b6001600160a01b031660009081526009602052604090205490565b6003546002546040516370a0823160e01b815260009261106a92600160701b9091046001600160701b0316916001600160a01b03909116906370a082319061100e903090600401613758565b6000806110836111b961124e565b846124ea565b6003546001600160701b031681565b600c6020526000908152604090205481565b600354600160e01b900463ffffffff1681565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105aa5780601f1061057f576101008083540402835291602001916105aa565b6112566132a9565b6010548152600f5460208201526003546001600160701b038082166040840152600160701b90910416606082015260006080820181905260a0820152600160c0820152610fc5816125eb565b336000908152600960205260408120548211156112d15760405162461bcd60e51b815260040161073190613bd2565b336000908152600960205260409020546112f1908363ffffffff61215b16565b33600090815260096020526040808220929092556001600160a01b03851681522054611323908363ffffffff61218316565b6001600160a01b038416600081815260096020526040908190209290925590513390600080516020613e4d8339815191529061136090869061388d565b60405180910390a350600192915050565b600d5481565b60008054819060ff161561139d5760405162461bcd60e51b8152600401610731906139c8565b6000805460ff19166001179055428310156113ca5760405162461bcd60e51b815260040161073190613cc4565b336000908152600960205260409020548911156113f95760405162461bcd60e51b815260040161073190613b73565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061142a903090600401613758565b60206040518083038186803b15801561144257600080fd5b505afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906114b0903090600401613758565b60206040518083038186803b1580156114c857600080fd5b505afa1580156114dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611500919061352d565b60085490915061151a81610b7f858f63ffffffff6121af16565b945061153081610b7f848f63ffffffff6121af16565b93508985101580156115425750888410155b61155e5760405162461bcd60e51b815260040161073190613b46565b611568338d612695565b6115728b86612762565b61157c8b85612785565b6115846127a8565b86156115f3578a6001600160a01b0316632411d338338e88888d8d6040518763ffffffff1660e01b81526004016115c0969594939291906137ce565b600060405180830381600087803b1580156115da57600080fd5b505af11580156115ee573d6000803e3d6000fd5b505050505b7f55caccde83781f39bfc1296eff45655b6496729443a7d48958b18b3b685600a5338c8e60096000336001600160a01b03166001600160a01b031681526020019081526020016000205460405161164d949392919061376c565b60405180910390a150506000805460ff1916905550909890975095505050505050565b600354600160701b90046001600160701b031681565b6000805460ff16156116aa5760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a08231906116e7903090600401613758565b60206040518083038186803b1580156116ff57600080fd5b505afa158015611713573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611737919061352d565b60035490915060009061175a9083906001600160701b031663ffffffff61215b16565b9050600061176832836111ab565b90945090506117778585612785565b60005461179490630100000090046001600160a01b031682612785565b6002546040516370a0823160e01b815261181f9185916001600160a01b03909116906370a08231906117ca903090600401613758565b60206040518083038186803b1580156117e257600080fd5b505afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a919061352d565b612355565b600154600254604051600080516020613e6d83398151915292611858926001600160a01b03918216929116908690899033908c9061380e565b60405180910390a150506000805460ff1916905550919050565b60005460ff16156118955760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660011790556118ac8386612762565b6118b68385612785565b80156119235760405163eb2021c360e01b81526001600160a01b0384169063eb2021c3906118f09033908990899088908890600401613795565b600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b505050505b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611954903090600401613758565b60206040518083038186803b15801561196c57600080fd5b505afa158015611980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a4919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906119da903090600401613758565b60206040518083038186803b1580156119f257600080fd5b505afa158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a919061352d565b6003549091506001600160701b031682101580611a595750600354600160701b90046001600160701b03168110155b611a755760405162461bcd60e51b815260040161073190613947565b6003546001600160701b0316821015611b5b57600354600090611aa9908390600160701b90046001600160701b031661215b565b9050600080611ab8328461106f565b60035491935091508290611adb906001600160701b03168763ffffffff61215b16565b1115611af95760405162461bcd60e51b815260040161073190613947565b600054611b1690630100000090046001600160a01b031682612762565b600254600154604051600080516020613e6d83398151915292611b4f926001600160a01b03918216929116908790879033908f9061380e565b60405180910390a15050505b600354600160701b90046001600160701b0316811015611c4857600354600090611b959084906001600160701b031663ffffffff61215b16565b9050600080611ba432846111ab565b60035491935091508290611bc890600160701b90046001600160701b03168661215b565b1115611be65760405162461bcd60e51b815260040161073190613947565b600054611c0390630100000090046001600160a01b031682612785565b600154600254604051600080516020613e6d83398151915292611c3c926001600160a01b03918216929116908790879033908f9061380e565b60405180910390a15050505b611c506127a8565b7f0b82e93068db15abd9fbb2682c65462ea8a0a10582dce93a5664818e296f54eb33868989604051611c85949392919061376c565b60405180910390a150506000805460ff191690555050505050565b6002546001600160a01b031681565b42841015611ccf5760405162461bcd60e51b815260040161073190613b18565b600b546001600160a01b0388166000908152600c602090815260408083208054600181019091559051929392611d30927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d9101613896565b60405160208183030381529060405280519060200120604051602001611d5792919061373d565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051611d9494939291906138ca565b6020604051602081039080840390855afa158015611db6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611dec5750886001600160a01b0316816001600160a01b0316145b611e085760405162461bcd60e51b815260040161073190613c8d565b611e138989896120f3565b505050505050505050565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b6000805460ff1615611e6d5760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660011781556002546040516370a0823160e01b81526001600160a01b03909116906370a0823190611eaa903090600401613758565b60206040518083038186803b158015611ec257600080fd5b505afa158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa919061352d565b600354909150600090611f1e908390600160701b90046001600160701b031661215b565b90506000611f2c328361106f565b9094509050611f3b8585612762565b600054611f5890630100000090046001600160a01b031682612762565b6001546040516370a0823160e01b8152611fe0916001600160a01b0316906370a0823190611f8a903090600401613758565b60206040518083038186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fda919061352d565b84612355565b600254600154604051600080516020613e6d83398151915292611858926001600160a01b03918216929116908690899033908c9061380e565b600f5481565b600061106a61202c61124e565b61296f565b600e546001600160a01b031681565b60105481565b60008060008060008060006120596132a9565b61206161124e565b905080600001519750806020015196508060400151955080606001519450806080015193508060a0015192508060c00151600281111561209d57fe5b91505090919293949596565b60045481565b60005460ff16156120d25760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660011790556120e76127a8565b6000805460ff19169055565b6001600160a01b038084166000818152600a602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061214e90859061388d565b60405180910390a3505050565b60008282111561217d5760405162461bcd60e51b815260040161073190613af5565b50900390565b6000828201838110156121a85760405162461bcd60e51b815260040161073190613c20565b9392505050565b6000826121be575060006105c3565b828202828482816121cb57fe5b04146121a85760405162461bcd60e51b815260040161073190613cea565b600080821161220a5760405162461bcd60e51b815260040161073190613a7e565b81838161221357fe5b049392505050565b60006121a882610b7f85670de0b6b3a764000063ffffffff6121af16565b6000670de0b6b3a7640000612254848463ffffffff6121af16565b8161221357fe5b6103e8811161227c5760405162461bcd60e51b815260040161073190613acf565b6001600160a01b0382166000908152600960205260409020546122a5908263ffffffff61218316565b6001600160a01b0383166000908152600960205260409020556008546122d1908263ffffffff61218316565b6008556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859061230f90849061388d565b60405180910390a2816001600160a01b031660006001600160a01b0316600080516020613e4d83398151915283604051612349919061388d565b60405180910390a35050565b6001600160701b03821180159061237357506001600160701b038111155b61238f5760405162461bcd60e51b815260040161073190613bfe565b600380546001600160701b03838116600160701b02600160701b600160e01b03199186166001600160701b0319909316929092171617905560005460ff61010090910416156123e0576123e0612a61565b5050565b600080808460c0015160028111156123f857fe5b1415612413576124088484612af6565b9150600190506124e3565b60018460c00151600281111561242557fe5b1415612435576124088484612b1d565b600061245285606001518660a0015161215b90919063ffffffff16565b905060006124718660800151876040015161215b90919063ffffffff16565b90508185101561249c576124858686612b3a565b93506002925080841115612497578093505b6124e0565b818514156124b057809350600092506124e0565b6124d96124cc876124c7888663ffffffff61215b16565b612af6565b829063ffffffff61218316565b9350600192505b50505b9250929050565b600080808460c0015160028111156124fe57fe5b14156125195761250e8484612b75565b9150600290506124e3565b60018460c00151600281111561252b57fe5b14156125d657600061254e8560400151866080015161215b90919063ffffffff16565b9050600061256d8660a00151876060015161215b90919063ffffffff16565b905081851015612598576125818686612b94565b93506001925080841115612593578093505b6125cf565b818514156125ac57809350600092506125cf565b6125c86124cc876125c3888663ffffffff61215b16565b612b75565b9350600292505b50506124e3565b6125e08484612bc6565b946002945092505050565b60028160c0015160028111156125fd57fe5b141561263c5761263281606001516126268360800151846040015161215b90919063ffffffff16565b83516020850151612be5565b60a0820152612692565b60018160c00151600281111561264e57fe5b14156126925761268c81604001516126778360a00151846060015161215b90919063ffffffff16565b835161268290612d0b565b8460200151612be5565b60808201525b50565b6001600160a01b0382166000908152600960205260409020546126be908263ffffffff61215b16565b6001600160a01b0383166000908152600960205260409020556008546126ea908263ffffffff61215b16565b6008556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061272890849061388d565b60405180910390a260006001600160a01b0316826001600160a01b0316600080516020613e4d83398151915283604051612349919061388d565b80156123e0576001546123e0906001600160a01b0316838363ffffffff612d2c16565b80156123e0576002546123e0906001600160a01b0316838363ffffffff612d2c16565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a08231906127d9903090600401613758565b60206040518083038186803b1580156127f157600080fd5b505afa158015612805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612829919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a082319061285f903090600401613758565b60206040518083038186803b15801561287757600080fd5b505afa15801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af919061352d565b90506001600160701b0382118015906128cf57506001600160701b038111155b6128eb5760405162461bcd60e51b815260040161073190613bfe565b6003546001600160701b0316821461291957600380546001600160701b0319166001600160701b0384161790555b600354600160701b90046001600160701b031681146129575760038054600160701b600160e01b031916600160701b6001600160701b038416021790555b600054610100900460ff16156123e0576123e0612a61565b600060028260c00151600281111561298357fe5b1415612a0e57606082015160a08301516000916129b9916129af9190610b7f908063ffffffff6121af16565b846060015161221b565b90506129f66129cc846020015183612239565b60208501516129ea90670de0b6b3a76400009063ffffffff61215b16565b9063ffffffff61218316565b9050612a0683600001518261221b565b9150506106ee565b60408201516080830151600091612a3e91612a349190610b7f908063ffffffff6121af16565b846040015161221b565b9050612a516129cc846020015183612239565b9050612a06836000015182612239565b60035463ffffffff42811691600160e01b90048116820390811615801590612a9357506003546001600160701b031615155b8015612ab05750600354600160701b90046001600160701b031615155b15612ad0578063ffffffff16612ac461201f565b60048054919092020190555b506003805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b60006121a88360800151846080015184612b138760000151612d0b565b8760200151612d87565b60006121a88360800151846040015184612b138760000151612d0b565b60006121a88360a00151612b5b84866060015161218390919063ffffffff16565b60608601518651612b6b90612d0b565b8760200151613007565b60006121a88360a001518460a001518486600001518760200151612d87565b60006121a88360800151612bb584866040015161218390919063ffffffff16565b604086015186516020880151613007565b60006121a88360a0015184606001518486600001518760200151612d87565b600084612bf457506000612d03565b81612c1a57612c13612c068486612239565b869063ffffffff61218316565b9050612d03565b600080612c30600485028663ffffffff6121af16565b905080612c4757670de0b6b3a76400009150612cc7565b858187830281612c5357fe5b041415612c8e57612c87612c826ec097ce7bc90715b34b9f10000000006129ea848a028b63ffffffff6121e916565b6130e0565b9150612cc7565b612cc4612c826ec097ce7bc90715b34b9f10000000006129ea89612cb8868d63ffffffff6121e916565b9063ffffffff6121af16565b91505b6000612cf1670de0b6b3a76400006129ea612ce8868363ffffffff61215b16565b8860020261221b565b9050612cfd8882612239565b93505050505b949350505050565b60006105c36ec097ce7bc90715b34b9f10000000008363ffffffff6121e916565b612d828363a9059cbb60e01b8484604051602401612d4b929190613848565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613117565b505050565b6000808611612da85760405162461bcd60e51b8152600401610731906139a0565b83612db557506000612ffe565b81612de25784612dc58486612239565b11612dd957612dd48385612239565b612ddb565b845b9050612ffe565b670de0b6b3a7640000821415612ea257600080612e05858763ffffffff6121af16565b905080612e155760009150612e6e565b868188830281612e2157fe5b041415612e5157612e4a612e3b898063ffffffff6121af16565b8289029063ffffffff6121e916565b9150612e6e565b612e6b88610b7f87612cb883838c8e63ffffffff6121af16565b91505b612e99612e8983670de0b6b3a764000063ffffffff61218316565b610b7f898563ffffffff6121af16565b92505050612ffe565b6000612ecf612eb7858763ffffffff6121af16565b6129ea89612cb88a610b7f898463ffffffff6121af16565b90506000612eef87612cb8670de0b6b3a76400008763ffffffff61215b16565b90506000828210612f0557508190036000612f0b565b50810360015b612f2382670de0b6b3a764000063ffffffff6121e916565b91506000612f5a612f476004612cb8670de0b6b3a76400008a63ffffffff61215b16565b612f558c612cb88a8f612239565b612239565b9050612f73612c82826129ea868063ffffffff6121af16565b90506000612f946002612cb8670de0b6b3a76400008a63ffffffff61215b16565b905060008315612fb557612fae838663ffffffff61215b16565b9050612fc8565b612fc5858463ffffffff61218316565b90505b6000612fd482846131d4565b90508b811115612fee576000975050505050505050612ffe565b8b039650612ffe95505050505050565b95945050505050565b60008086116130285760405162461bcd60e51b8152600401610731906139a0565b600061304a61303d878763ffffffff61215b16565b859063ffffffff6121af16565b9050826130715761306981670de0b6b3a764000063ffffffff6121e916565b915050612ffe565b600061309061308a88610b7f8b8063ffffffff6121af16565b8761221b565b9050600061309e8583612239565b90506130d36ec097ce7bc90715b34b9f1000000000610b7f85612cb8856129ea670de0b6b3a76400008c63ffffffff61215b16565b9998505050505050505050565b80600160028204015b818110156131115780915060028182858161310057fe5b04018161310957fe5b0490506130e9565b50919050565b60006060836001600160a01b031683604051613133919061366c565b6000604051808303816000865af19150503d8060008114613170576040519150601f19603f3d011682016040523d82523d6000602084013e613175565b606091505b5091509150816131975760405162461bcd60e51b815260040161073190613a22565b8051156131ce57808060200190518101906131b29190613511565b6131ce5760405162461bcd60e51b815260040161073190613c43565b50505050565b60006121a8826131f285670de0b6b3a764000063ffffffff6121af16565b9063ffffffff6131fe16565b60008061320b84846121e9565b905082810284038015613223575060010190506105c3565b5090506105c3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061326c57805160ff1916838001178555613299565b82800160010185558215613299579182015b8281111561329957825182559160200191906001019061327e565b506132a59291506132f0565b5090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060028111156132eb57fe5b905290565b610fc591905b808211156132a557600081556001016132f6565b80356001600160a01b03811681146105c357600080fd5b60008083601f840112613332578182fd5b50813567ffffffffffffffff811115613349578182fd5b6020830191508360208285010111156124e357600080fd5b600060208284031215613372578081fd5b6121a8838361330a565b6000806040838503121561338e578081fd5b613398848461330a565b91506133a7846020850161330a565b90509250929050565b600080600080600080600080610100898b0312156133cc578384fd5b6133d68a8a61330a565b97506133e58a60208b0161330a565b96506133f48a60408b0161330a565b95506060890135945061340a8a60808b0161330a565b935060a0890135925060c0890135915060e089013561342881613e2f565b809150509295985092959890939650565b60008060006060848603121561344d578283fd5b833561345881613e1a565b9250602084013561346881613e1a565b929592945050506040919091013590565b600080600080600080600060e0888a031215613493578283fd5b61349d898961330a565b96506134ac8960208a0161330a565b9550604088013594506060880135935060808801356134ca81613e3d565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156134f9578182fd5b613503848461330a565b946020939093013593505050565b600060208284031215613522578081fd5b81516121a881613e2f565b60006020828403121561353e578081fd5b5051919050565b600080600080600080600060c0888a03121561355f578283fd5b87359650602088013561357181613e1a565b95506040880135945060608801359350608088013567ffffffffffffffff81111561359a578384fd5b6135a68a828b01613321565b989b979a5095989497959660a090950135949350505050565b6000806000806000608086880312156135d6578081fd5b85359450602086013593506135ee876040880161330a565b9250606086013567ffffffffffffffff811115613609578182fd5b61361588828901613321565b969995985093965092949392505050565b600060208284031215613637578081fd5b81516121a881613e3d565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000825161367e818460208701613dee565b9190910192915050565b60008083546001808216600081146136a757600181146136be576136ed565b60ff198316865260028304607f16860193506136ed565b600283048786526020808720875b838110156136e55781548a8201529085019082016136cc565b505050860193505b509195945050505050565b6000845161370a818460208901613dee565b845190830161371d828260208901613dee565b8451918101613730838260208901613dee565b9091019695505050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b600060018060a01b0387168252856020830152846040830152608060608301526137c3608083018486613642565b979650505050505050565b600060018060a01b038816825286602083015285604083015284606083015260a0608083015261380260a083018486613642565b98975050505050505050565b6001600160a01b0396871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000602082528251806020840152613933816040850160208701613dee565b601f01601f19169190910160400192915050565b60208082526011908201527011931054d217d313d05397d19052531151607a1b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b6020808252600e908201526d5441524745545f49535f5a45524f60901b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252601a908201527f424153455f51554f54455f43414e5f4e4f545f42455f53414d45000000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600d908201526c1393d7d09054d157d253941555609a1b604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b6020808252600f908201526e11159357d253925512505312569151608a1b604082015260600190565b6020808252600c908201526b1352539517d253959053125160a21b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252601490820152731113d113d7d1159357d3140e881156141254915160621b604082015260600190565b6020808252601390820152720ae92a89088a482aebe9c9ea8be8a9c9eaa8e9606b1b604082015260600190565b6020808252600e908201526d08898a0be9c9ea8be8a9c9eaa8e960931b604082015260600190565b6020808252601c908201527f494e53554646494349454e545f4c49515549444954595f4d494e454400000000604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600890820152674f564552464c4f5760c01b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601e908201527f444f444f5f44564d5f4c503a20494e56414c49445f5349474e41545552450000604082015260600190565b6020808252600c908201526b1512535157d156141254915160a21b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160038110613d5a57fe5b8060c08401525092915050565b6001600160701b0391909116815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60005b83811015613e09578181015183820152602001613df1565b838111156131ce5750506000910152565b6001600160a01b038116811461269257600080fd5b801515811461269257600080fd5b60ff8116811461269257600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc2c0245e056d5fb095f04cd6373bc770802ebd1e6c918eb78fdef843cdb37b0fa26469706673582212204925c03cf305d35bcf4b0b82617cf8c8cc62059793ed9dc495500ded4ec77d7a64736f6c63430006090033
Deployed ByteCode Sourcemap
45448:2535:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25842:18;;;:::i;:::-;;;;;;;;;;;;;;;;32784:150;;;;;;;;;:::i;:::-;;;;;;;;47371:451;;;;;;;;;:::i;25869:26::-;;;:::i;:::-;;;;;;;;32009:525;;;;;;;;;:::i;25329:34::-;;;:::i;26230:108::-;;;:::i;25814:21::-;;;:::i;:::-;;;;;;;;28223:181;;;:::i;:::-;;;;;;;;;26087:31;;;:::i;25461:27::-;;;:::i;:::-;;;;;;;;28412:202;;;;;;;;;:::i;25497:26::-;;;:::i;42083:1781::-;;;;;;;;;:::i;:::-;;;;;;;;;;45493:1870;;;;;;;;;:::i;:::-;;47886:94;;;:::i;28667:152::-;;;:::i;41082:585::-;;;;;;;;;:::i;31599:115::-;;;;;;;;;:::i;28827:155::-;;;:::i;40487:587::-;;;;;;;;;:::i;25566:29::-;;;:::i;:::-;;;;;;;;26345:41;;;;;;;;;:::i;25639:36::-;;;:::i;:::-;;;;;;;;25787:20;;;:::i;26642:382::-;;;:::i;:::-;;;;;;;;31031:336;;;;;;;;;:::i;26453:28::-;;;:::i;43905:1366::-;;;;;;;;;:::i;25602:30::-;;;:::i;36730:761::-;;;;;;;;;:::i;38271:2156::-;;;;;;;;;:::i;25530:27::-;;;:::i;34271:831::-;;;;;;;;;:::i;33492:132::-;;;;;;;;;:::i;37499:764::-;;;;;;;;;:::i;26535:18::-;;;:::i;27543:125::-;;;:::i;26488:40::-;;;:::i;26560:18::-;;;:::i;27032:503::-;;;:::i;:::-;;;;;;;;;;;;;;25684:43;;;:::i;30350:68::-;;;:::i;25842:18::-;;;;;;;;;;;;;;;-1:-1:-1;;25842:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32784:150::-;32850:4;32867:37;32876:10;32888:7;32897:6;32867:8;:37::i;:::-;-1:-1:-1;32922:4:0;32784:150;;;;;:::o;47371:451::-;47513:42;;;;;;;;;;;-1:-1:-1;;;47513:42:0;;;;47587:12;;47597:1;47587:12;;;;;;;;;47437:13;;-1:-1:-1;;;;;47487:14:0;;;47513:42;47437:13;;47587:12;;;;;;;;;;-1:-1:-1;;47568:31:0;-1:-1:-1;47615:9:0;47610:176;47634:1;47630;:5;47610:176;;;47670:8;47702:1;47685:5;47691:1;47695:2;47691:6;47685:13;;;;;;;;;;-1:-1:-1;;;;;47685:18:0;;;;47679:25;;47670:35;;;;;;;;;;;;;;;;;;47657:3;47661:1;47665;47661:5;47657:10;;;;;;;;;;;:48;-1:-1:-1;;;;;47657:48:0;;;;;;;;;47737:8;47752:5;47758:1;47762:2;47758:6;47752:13;;;;;;;47737:37;;47752:13;;;47768:4;47746:27;;47737:37;;;;;;;;;;;;;;47720:3;47728:1;47732;47728:5;47724:1;:9;47720:14;;;;;;;;;;;:54;-1:-1:-1;;;;;47720:54:0;;;;;;;;-1:-1:-1;47637:3:0;;47610:176;;;-1:-1:-1;47810:3:0;-1:-1:-1;;;47371:451:0;;;;:::o;25869:26::-;;;;:::o;32009:525::-;-1:-1:-1;;;;;32158:14:0;;32123:4;32158:14;;;:8;:14;;;;;;32148:24;;;32140:55;;;;-1:-1:-1;;;32140:55:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32224:15:0;;;;;;:9;:15;;;;;;;;32240:10;32224:27;;;;;;;;32214:37;;;32206:70;;;;-1:-1:-1;;;32206:70:0;;;;;;;;;-1:-1:-1;;;;;32306:14:0;;;;;;:8;:14;;;;;;:26;;32325:6;32306:26;:18;:26;:::i;:::-;-1:-1:-1;;;;;32289:14:0;;;;;;;:8;:14;;;;;;:43;;;;32358:12;;;;;;;:24;;32375:6;32358:24;:16;:24;:::i;:::-;-1:-1:-1;;;;;32343:12:0;;;;;;;:8;:12;;;;;;;;:39;;;;32423:15;;;;;:9;:15;;;;;32439:10;32423:27;;;;;;;:39;;32455:6;32423:39;:31;:39;:::i;:::-;-1:-1:-1;;;;;32393:15:0;;;;;;;:9;:15;;;;;;;;32409:10;32393:27;;;;;;;;;:69;;;;32478:26;;;;;;32393:15;-1:-1:-1;;;;;;;;;;;32478:26:0;;;32497:6;;32478:26;;;;;;;;;;-1:-1:-1;32522:4:0;32009:525;;;;;:::o;25329:34::-;;;;;;;;;:::o;26230:108::-;26272:66;26230:108;:::o;25814:21::-;;;;;;:::o;28223:181::-;28341:14;;-1:-1:-1;;;;;28341:14:0;;;;-1:-1:-1;;;28381:15:0;;;;;28223:181::o;26087:31::-;;;;:::o;25461:27::-;;;;;;-1:-1:-1;;;;;25461:27:0;;:::o;28412:202::-;28534:13;;28570:19;;:36;;-1:-1:-1;;;28570:36:0;;28473:17;;-1:-1:-1;;;;;28570:19:0;;:30;;:36;;28601:4;;28570:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28558:48;;28412:202;;;:::o;25497:26::-;;;-1:-1:-1;;;;;25497:26:0;;:::o;42083:1781::-;42190:14;10848:9;;42190:14;;;;10848:9;;10847:10;10839:32;;;;-1:-1:-1;;;10839:32:0;;;;;;;;;10882:9;:16;;-1:-1:-1;;10882:16:0;10894:4;10882:16;;;;;42319:12;:37:::1;::::0;-1:-1:-1;;;42319:37:0;;-1:-1:-1;;;;;42319:12:0;;::::1;::::0;:22:::1;::::0;:37:::1;::::0;42350:4:::1;::::0;42319:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42390:13;::::0;:38:::1;::::0;-1:-1:-1;;;42390:38:0;;42297:59;;-1:-1:-1;42367:20:0::1;::::0;-1:-1:-1;;;;;42390:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;42422:4:::1;::::0;42390:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42461:14;::::0;42367:61;;-1:-1:-1;;;;;;42461:14:0;;::::1;::::0;-1:-1:-1;;;42509:15:0;::::1;;42549:28;:11:::0;42461:14;42549:28:::1;:15;:28;:::i;:::-;42537:40:::0;-1:-1:-1;42601:30:0::1;:12:::0;42618;42601:30:::1;:16;:30;:::i;:::-;42588:43;;42662:1;42650:9;:13;42642:39;;;;-1:-1:-1::0;;;42642:39:0::1;;;;;;;;;42878:11;::::0;42874:855:::1;;42973:5;42958:11;:20;;42950:61;;;;-1:-1:-1::0;;;42950:61:0::1;;;;;;;;;43035:11;43026:20;;42874:855;;;43135:1;43121:11;:15;:36;;;;-1:-1:-1::0;43140:17:0;;43121:36:::1;43117:612;;;43238:43;43269:11;43238:26;43252:11;;43238:9;:13;;:26;;;;:::i;:::-;:30:::0;:43:::1;:30;:43;:::i;:::-;43229:52;;43117:612;;;43317:1;43303:11;:15;:35;;;;;43337:1;43322:12;:16;43303:35;43299:430;;;43391:22;43416:44;43437:9;43448:11;43416:20;:44::i;:::-;43391:69;;43475:23;43501:46;43522:10;43534:12;43501:20;:46::i;:::-;43475:72;;43562:17;43600:14;43582:15;:32;:67;;43635:14;43582:67;;;43617:15;43582:67;43562:87;;43673:44;43694:11;;43707:9;43673:20;:44::i;:::-;43664:53;;43299:430;;;;43739:17;43745:2;43749:6;43739:5;:17::i;:::-;43767:38;43779:11;43792:12;43767:11;:38::i;:::-;-1:-1:-1::0;;;;;43843:12:0;::::1;;::::0;;;:8:::1;:12;::::0;;;;;;;43821:35;;::::1;::::0;::::1;::::0;43831:2;;43835:6;;43821:35:::1;;;;;;;;;;-1:-1:-1::0;;10933:5:0;10921:17;;-1:-1:-1;;10921:17:0;;;-1:-1:-1;42083:1781:0;;;;-1:-1:-1;42083:1781:0;-1:-1:-1;42083:1781:0:o;45493:1870::-;45770:17;;;;;;;45769:18;45761:46;;;;-1:-1:-1;;;45761:46:0;;;;;;;;;45818:17;:24;;-1:-1:-1;;45818:24:0;;;;;-1:-1:-1;;;;;45871:37:0;;;;;;;;45863:76;;;;-1:-1:-1;;;45863:76:0;;;;;;;;;45950:12;:39;;-1:-1:-1;;;;;45950:39:0;;;-1:-1:-1;;;;;;45950:39:0;;;;;;;46000:13;:41;;;;;;;;;;;;;;;46062:5;;;;;:20;;;46076:6;46071:1;:11;;46062:20;46054:29;;;;;;46094:3;:7;;;46127:6;46122:11;;;46114:20;;;;;;46145:3;:7;;;46165:13;:25;;;46201:19;:51;;-1:-1:-1;;;;;46201:51:0;;;-1:-1:-1;;;;;;46201:51:0;;;;;;;;;;-1:-1:-1;46263:25:0;;46301:27;;;;46201:51;46301:27;-1:-1:-1;;46263:25:0;;;;;-1:-1:-1;;;;;;46263:25:0;;;;;;;46301:27;;;;;;;46339:71;;46354:22;:56;;-1:-1:-1;;;;;46354:56:0;46386:15;:23;;-1:-1:-1;;;46354:56:0;;;;46339:71;46423:27;;;;;;;;;;;-1:-1:-1;;;46423:27:0;;;;;;;;46461:28;;;;;;;;;;;-1:-1:-1;;;46461:28:0;;;;46423:27;46461:28;46423:27;46550:35;46579:4;46550:20;:35::i;:::-;46516:70;;;;;;;;;;;;;;;;;;;;;;;;46502:4;:85;;;;;;;;;;;;:::i;:::-;-1:-1:-1;46598:14:0;;;;;;;;;;;;;-1:-1:-1;;;46598:14:0;;;;;;;;;:6;;:14;:::i;:::-;;46634:12;;;;;;;;;-1:-1:-1;;;;;46634:12:0;-1:-1:-1;;;;;46634:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46623:8;:34;;-1:-1:-1;;46623:34:0;;;;;;;;;;;;47122:22;;46818:9;;47037:66;;47122:22;;47138:4;;47122:22;;;;;;;;;;;;47173:10;;;;;;;;-1:-1:-1;;;47173:10:0;;;;;46891:366;;;;;47163:21;;47203:7;;47237:4;;46891:366;;;;;;;-1:-1:-1;;46891:366:0;;;;;;;;;46867:401;;46891:366;46867:401;;;;46848:16;:420;-1:-1:-1;;;;;;;;;;;45493:1870:0:o;47886:94::-;47954:18;;;;;;;;;;;;-1:-1:-1;;;47954:18:0;;;;47886:94;;:::o;28667:152::-;28795:14;;;28745:12;:37;;-1:-1:-1;;;28745:37:0;;28712:13;;28745:66;;-1:-1:-1;;;;;28795:14:0;;;;-1:-1:-1;;;;;28745:12:0;;;;:22;;:37;;28776:4;;28745:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;:66;:41;:66;:::i;:::-;28738:73;;28667:152;:::o;41082:585::-;41194:25;41221:13;41276:56;41302:13;:11;:13::i;:::-;41317:14;41276:25;:56::i;:::-;-1:-1:-1;41365:13:0;;41409:19;;:38;;-1:-1:-1;;;41409:38:0;;41252:80;;-1:-1:-1;41365:13:0;;41345:17;;-1:-1:-1;;;;;41409:19:0;;:30;;:38;;41440:6;;41409:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41389:58;;41466:50;41487:17;41506:9;41466:20;:50::i;:::-;41458:58;;41547:112;41653:5;41547:87;41583:50;41604:17;41623:9;41583:20;:50::i;:::-;41547:17;;:87;:35;:87;:::i;:112::-;41527:132;;41082:585;;;;;;;:::o;31599:115::-;-1:-1:-1;;;;;31691:15:0;31656;31691;;;:8;:15;;;;;;;31599:115::o;28827:155::-;28957:15;;28906:13;;:38;;-1:-1:-1;;;28906:38:0;;28873:13;;28906:68;;-1:-1:-1;;;28957:15:0;;;-1:-1:-1;;;;;28957:15:0;;-1:-1:-1;;;;;28906:13:0;;;;:23;;:38;;28938:4;;28906:38;;;;40487:587;40597:26;40625:13;40681:54;40706:13;:11;:13::i;:::-;40721;40681:24;:54::i;25566:29::-;;;-1:-1:-1;;;;;25566:29:0;;:::o;26345:41::-;;;;;;;;;;;;;:::o;25639:36::-;;;-1:-1:-1;;;25639:36:0;;;;;:::o;25787:20::-;;;;;;;;;;;;;;;-1:-1:-1;;25787:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26642:382;26686:32;;:::i;:::-;26741:3;;26731:13;;26765:3;;26755:7;;;:13;26789:14;;-1:-1:-1;;;;;26789:14:0;;;26779:7;;;:24;-1:-1:-1;;;26824:15:0;;;;26814:7;;;:25;-1:-1:-1;26850:8:0;;;:12;;;26913:8;;;:12;26789:14;26936:7;;;:37;26984:32;26731:13;26984:25;:32::i;31031:336::-;31137:10;31093:4;31128:20;;;:8;:20;;;;;;31118:30;;;31110:61;;;;-1:-1:-1;;;31110:61:0;;;;;;;;;31216:10;31207:20;;;;:8;:20;;;;;;:32;;31232:6;31207:32;:24;:32;:::i;:::-;31193:10;31184:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;31265:12:0;;;;;;:24;;31282:6;31265:24;:16;:24;:::i;:::-;-1:-1:-1;;;;;31250:12:0;;;;;;:8;:12;;;;;;;:39;;;;31305:32;;31314:10;;-1:-1:-1;;;;;;;;;;;31305:32:0;;;31330:6;;31305:32;;;;;;;;;;-1:-1:-1;31355:4:0;31031:336;;;;:::o;26453:28::-;;;;:::o;43905:1366::-;44140:18;10848:9;;44140:18;;10848:9;;10847:10;10839:32;;;;-1:-1:-1;;;10839:32:0;;;;;;;;;10882:9;:16;;-1:-1:-1;;10882:16:0;10894:4;10882:16;;;44212:15:::1;44200:27:::0;::::1;;44192:52;;;;-1:-1:-1::0;;;44192:52:0::1;;;;;;;;;44287:10;44278:20;::::0;;;:8:::1;:20;::::0;;;;;44263:35;::::1;;44255:62;;;;-1:-1:-1::0;;;44255:62:0::1;;;;;;;;;44350:12;::::0;:37:::1;::::0;-1:-1:-1;;;44350:37:0;;44328:19:::1;::::0;-1:-1:-1;;;;;44350:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;44381:4:::1;::::0;44350:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44421:13;::::0;:38:::1;::::0;-1:-1:-1;;;44421:38:0;;44328:59;;-1:-1:-1;44398:20:0::1;::::0;-1:-1:-1;;;;;44421:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;44453:4:::1;::::0;44421:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44492:11;::::0;44398:61;;-1:-1:-1;44529:45:0::1;44492:11:::0;44529:28:::1;:11:::0;44545;44529:28:::1;:15;:28;:::i;:45::-;44516:58:::0;-1:-1:-1;44599:46:0::1;44633:11:::0;44599:29:::1;:12:::0;44616:11;44599:29:::1;:16;:29;:::i;:46::-;44585:60;;44694:13;44680:10;:27;;:60;;;;;44726:14;44711:11;:29;;44680:60;44658:129;;;;-1:-1:-1::0;;;44658:129:0::1;;;;;;;;;44800:30;44806:10;44818:11;44800:5;:30::i;:::-;44841:32;44858:2;44862:10;44841:16;:32::i;:::-;44884:34;44902:2;44906:11;44884:17;:34::i;:::-;44929:7;:5;:7::i;:::-;44953:15:::0;;44949:236:::1;;44997:2;-1:-1:-1::0;;;;;44985:32:0::1;;45036:10;45065:11;45095:10;45124:11;45154:4;;44985:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44949:236;45202:61;45213:10;45225:2;45229:11;45242:8;:20;45251:10;-1:-1:-1::0;;;;;45242:20:0::1;-1:-1:-1::0;;;;;45242:20:0::1;;;;;;;;;;;;;45202:61;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;10933:5:0;10921:17;;-1:-1:-1;;10921:17:0;;;-1:-1:-1;43905:1366:0;;;;-1:-1:-1;43905:1366:0;-1:-1:-1;;;;;;43905:1366:0:o;25602:30::-;;;-1:-1:-1;;;25602:30:0;;-1:-1:-1;;;;;25602:30:0;;:::o;36730:761::-;36822:26;10848:9;;;;10847:10;10839:32;;;;-1:-1:-1;;;10839:32:0;;;;;;;;;10882:9;:16;;-1:-1:-1;;10882:16:0;10894:4;10882:16;;;;;36888:12;:37:::1;::::0;-1:-1:-1;;;36888:37:0;;-1:-1:-1;;;;;36888:12:0;;::::1;::::0;:22:::1;::::0;:37:::1;::::0;36919:4:::1;::::0;36888:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36980:14;::::0;36866:59;;-1:-1:-1;36936:17:0::1;::::0;36956:40:::1;::::0;36866:59;;-1:-1:-1;;;;;36980:14:0::1;36956:40;:15;:40;:::i;:::-;36936:60;;37007:13;37061:35;37075:9;37086;37061:13;:35::i;:::-;37031:65:::0;;-1:-1:-1;37031:65:0;-1:-1:-1;37109:41:0::1;37127:2:::0;37031:65;37109:17:::1;:41::i;:::-;37179:12;::::0;37161:38:::1;::::0;37179:12;;::::1;-1:-1:-1::0;;;;;37179:12:0::1;37193:5:::0;37161:17:::1;:38::i;:::-;37235:13;::::0;:38:::1;::::0;-1:-1:-1;;;37235:38:0;;37210:64:::1;::::0;37222:11;;-1:-1:-1;;;;;37235:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;37267:4:::1;::::0;37235:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37210:11;:64::i;:::-;37323:12;::::0;37359:13:::1;::::0;37292:191:::1;::::0;-1:-1:-1;;;;;;;;;;;37292:191:0;::::1;::::0;-1:-1:-1;;;;;37323:12:0;;::::1;::::0;37359:13;::::1;::::0;37388:9;;37412:18;;37445:10:::1;::::0;37470:2;;37292:191:::1;;;;;;;;;;-1:-1:-1::0;;10933:5:0;10921:17;;-1:-1:-1;;10921:17:0;;;-1:-1:-1;36730:761:0;;-1:-1:-1;36730:761:0:o;38271:2156::-;10848:9;;;;10847:10;10839:32;;;;-1:-1:-1;;;10839:32:0;;;;;;;;;10882:9;:16;;-1:-1:-1;;10882:16:0;10894:4;10882:16;;;38449:37:::1;38466:7:::0;38475:10;38449:16:::1;:37::i;:::-;38497:39;38515:7;38524:11;38497:17;:39::i;:::-;38553:15:::0;;38549:114:::1;;38583:80;::::0;-1:-1:-1;;;38583:80:0;;-1:-1:-1;;;;;38583:37:0;::::1;::::0;::::1;::::0;:80:::1;::::0;38621:10:::1;::::0;38633;;38645:11;;38658:4;;;;38583:80:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38549:114;38698:12;::::0;:37:::1;::::0;-1:-1:-1;;;38698:37:0;;38676:19:::1;::::0;-1:-1:-1;;;;;38698:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;38729:4:::1;::::0;38698:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38769:13;::::0;:38:::1;::::0;-1:-1:-1;;;38769:38:0;;38676:59;;-1:-1:-1;38746:20:0::1;::::0;-1:-1:-1;;;;;38769:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;38801:4:::1;::::0;38769:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38899:14;::::0;38746:61;;-1:-1:-1;;;;;;38899:14:0::1;38884:29:::0;::::1;;::::0;:64:::1;;-1:-1:-1::0;38933:15:0::1;::::0;-1:-1:-1;;;38933:15:0;::::1;-1:-1:-1::0;;;;;38933:15:0::1;38917:31:::0;::::1;;38884:64;38862:131;;;;-1:-1:-1::0;;;38862:131:0::1;;;;;;;;;39047:14;::::0;-1:-1:-1;;;;;39047:14:0::1;39033:28:::0;::::1;39029:625;;;39124:15;::::0;39078:18:::1;::::0;39099:42:::1;::::0;:12;;-1:-1:-1;;;39124:15:0;::::1;-1:-1:-1::0;;;;;39124:15:0::1;39099:16;:42::i;:::-;39078:63;;39157:25;39184:13:::0;39201:37:::1;39216:9;39227:10;39201:14;:37::i;:::-;39269:14;::::0;39156:82;;-1:-1:-1;39156:82:0;-1:-1:-1;39156:82:0;;39261:40:::1;::::0;-1:-1:-1;;;;;39269:14:0::1;39289:11:::0;39261:40:::1;:27;:40;:::i;:::-;:61;;39253:91;;;;-1:-1:-1::0;;;39253:91:0::1;;;;;;;;;39378:12;::::0;39361:37:::1;::::0;39378:12;;::::1;-1:-1:-1::0;;;;;39378:12:0::1;39392:5:::0;39361:16:::1;:37::i;:::-;39453:13;::::0;;39494:12;39418:224:::1;::::0;-1:-1:-1;;;;;;;;;;;39418:224:0;::::1;::::0;-1:-1:-1;;;;;39453:13:0;;::::1;::::0;39494:12;::::1;::::0;39526:10;;39555:17;;39591:10:::1;::::0;39620:7;;39418:224:::1;;;;;;;;;;39029:625;;;;39707:15;::::0;-1:-1:-1;;;39707:15:0;::::1;-1:-1:-1::0;;;;;39707:15:0::1;39692:30:::0;::::1;39688:627;;;39783:14;::::0;39739:17:::1;::::0;39759:40:::1;::::0;:11;;-1:-1:-1;;;;;39783:14:0::1;39759:40;:15;:40;:::i;:::-;39739:60;;39815:26;39843:13:::0;39860:35:::1;39874:9;39885;39860:13;:35::i;:::-;39926:15;::::0;39814:81;;-1:-1:-1;39814:81:0;-1:-1:-1;39814:81:0;;39918:42:::1;::::0;-1:-1:-1;;;39926:15:0;::::1;-1:-1:-1::0;;;;;39926:15:0::1;39947:12:::0;39918:28:::1;:42::i;:::-;:64;;39910:94;;;;-1:-1:-1::0;;;39910:94:0::1;;;;;;;;;40039:12;::::0;40021:38:::1;::::0;40039:12;;::::1;-1:-1:-1::0;;;;;40039:12:0::1;40053:5:::0;40021:17:::1;:38::i;:::-;40114:12;::::0;40154:13:::1;::::0;40079:224:::1;::::0;-1:-1:-1;;;;;;;;;;;40079:224:0;::::1;::::0;-1:-1:-1;;;;;40114:12:0;;::::1;::::0;40154:13;::::1;::::0;40187:9;;40215:18;;40252:10:::1;::::0;40281:7;;40079:224:::1;;;;;;;;;;39688:627;;;;40327:7;:5;:7::i;:::-;40360:59;40374:10;40386:7;40395:10;40407:11;40360:59;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;10933:5:0;10921:17;;-1:-1:-1;;10921:17:0;;;-1:-1:-1;;;;;38271:2156:0:o;25530:27::-;;;-1:-1:-1;;;;;25530:27:0;;:::o;34271:831::-;34493:15;34481:8;:27;;34473:60;;;;-1:-1:-1;;;34473:60:0;;;;;;;;;34649:16;;-1:-1:-1;;;;;34767:13:0;;34544:14;34767:13;;;:6;:13;;;;;;;;:15;;;;;;;;34716:77;;34544:14;;34649:16;34716:77;;26272:66;;34744:5;;34751:7;;34760:5;;34767:15;34784:8;;34716:77;;;;;;;;;;;;;;;;34684:128;;;;;;34585:242;;;;;;;;;;;;;;;;;;;;;;;34561:277;;;;;;34544:294;;34849:24;34876:26;34886:6;34894:1;34897;34900;34876:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34876:26:0;;-1:-1:-1;;34876:26:0;;;-1:-1:-1;;;;;;;34935:30:0;;;;;;:59;;;34989:5;-1:-1:-1;;;;;34969:25:0;:16;-1:-1:-1;;;;;34969:25:0;;34935:59;34913:139;;;;-1:-1:-1;;;34913:139:0;;;;;;;;;35063:31;35072:5;35079:7;35088:5;35063:8;:31::i;:::-;34271:831;;;;;;;;;:::o;33492:132::-;-1:-1:-1;;;;;33591:16:0;;;33564:7;33591:16;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;33492:132::o;37499:764::-;37592:25;10848:9;;;;10847:10;10839:32;;;;-1:-1:-1;;;10839:32:0;;;;;;;;;10882:9;:16;;-1:-1:-1;;10882:16:0;10894:4;10882:16;;;37658:13:::1;::::0;:38:::1;::::0;-1:-1:-1;;;37658:38:0;;-1:-1:-1;;;;;37658:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;37690:4:::1;::::0;37658:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37753:15;::::0;37635:61;;-1:-1:-1;37707:18:0::1;::::0;37728:42:::1;::::0;37635:61;;-1:-1:-1;;;37753:15:0;::::1;-1:-1:-1::0;;;;;37753:15:0::1;37728:16;:42::i;:::-;37707:63;;37781:13;37834:37;37849:9;37860:10;37834:14;:37::i;:::-;37805:66:::0;;-1:-1:-1;37805:66:0;-1:-1:-1;37884:39:0::1;37901:2:::0;37805:66;37884:16:::1;:39::i;:::-;37951:12;::::0;37934:37:::1;::::0;37951:12;;::::1;-1:-1:-1::0;;;;;37951:12:0::1;37965:5:::0;37934:16:::1;:37::i;:::-;37994:12;::::0;:37:::1;::::0;-1:-1:-1;;;37994:37:0;;37982:64:::1;::::0;-1:-1:-1;;;;;37994:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;38025:4:::1;::::0;37994:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38033:12;37982:11;:64::i;:::-;38095:13;::::0;;38132:12;38064:191:::1;::::0;-1:-1:-1;;;;;;;;;;;38064:191:0;::::1;::::0;-1:-1:-1;;;;;38095:13:0;;::::1;::::0;38132:12;::::1;::::0;38160:10;;38185:17;;38217:10:::1;::::0;38242:2;;38064:191:::1;;26535:18:::0;;;;:::o;27543:125::-;27587:16;27623:37;27646:13;:11;:13::i;:::-;27623:22;:37::i;26488:40::-;;;-1:-1:-1;;;;;26488:40:0;;:::o;26560:18::-;;;;:::o;27032:503::-;27129:9;27153;27177;27201;27225:10;27250;27275:9;27312:32;;:::i;:::-;27347:13;:11;:13::i;:::-;27312:48;;27375:5;:7;;;27371:11;;27397:5;:7;;;27393:11;;27419:5;:7;;;27415:11;;27441:5;:7;;;27437:11;;27464:5;:8;;;27459:13;;27488:5;:8;;;27483:13;;27519:5;:7;;;27511:16;;;;;;;;27507:20;;27032:503;;;;;;;;:::o;25684:43::-;;;;:::o;30350:68::-;10848:9;;;;10847:10;10839:32;;;;-1:-1:-1;;;10839:32:0;;;;;;;;;10882:9;:16;;-1:-1:-1;;10882:16:0;10894:4;10882:16;;;30403:7:::1;:5;:7::i;:::-;10933:5:::0;10921:17;;-1:-1:-1;;10921:17:0;;;30350:68::o;32942:209::-;-1:-1:-1;;;;;33061:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;;:34;;;33111:32;;;;;33089:6;;33111:32;;;;;;;;;;32942:209;;;:::o;5547:137::-;5605:7;5638:1;5633;:6;;5625:28;;;;-1:-1:-1;;;5625:28:0;;;;;;;;;-1:-1:-1;5671:5:0;;;5547:137::o;5692:161::-;5750:7;5782:5;;;5806:6;;;;5798:28;;;;-1:-1:-1;;;5798:28:0;;;;;;;;;5844:1;5692:161;-1:-1:-1;;;5692:161:0:o;4868:226::-;4926:7;4950:6;4946:47;;-1:-1:-1;4980:1:0;4973:8;;4946:47;5017:5;;;5021:1;5017;:5;:1;5041:5;;;;;:10;5033:32;;;;-1:-1:-1;;;5033:32:0;;;;;;;;5102:141;5160:7;5192:1;5188;:5;5180:32;;;;-1:-1:-1;;;5180:32:0;;;;;;;;;5234:1;5230;:5;;;;;;;5102:141;-1:-1:-1;;;5102:141:0:o;6668:128::-;6736:7;6763:25;6786:1;6763:18;:6;6774;6763:18;:10;:18;:::i;6394:127::-;6462:7;6506:6;6489:13;:6;6500:1;6489:13;:10;:13;:::i;:::-;:24;;;;33632:291;33712:4;33704:5;:12;33696:37;;;;-1:-1:-1;;;33696:37:0;;;;;;;;;-1:-1:-1;;;;;33761:14:0;;;;;;:8;:14;;;;;;:25;;33780:5;33761:25;:18;:25;:::i;:::-;-1:-1:-1;;;;;33744:14:0;;;;;;:8;:14;;;;;:42;33811:11;;:22;;33827:5;33811:22;:15;:22;:::i;:::-;33797:11;:36;33849:17;;-1:-1:-1;;;;;33849:17:0;;;;;;;33860:5;;33849:17;;;;;;;;;;33903:4;-1:-1:-1;;;;;33882:33:0;33899:1;-1:-1:-1;;;;;33882:33:0;-1:-1:-1;;;;;;;;;;;33909:5:0;33882:33;;;;;;;;;;;;;;;33632:291;;:::o;29487:313::-;-1:-1:-1;;;;;29579:26:0;;;;;:57;;-1:-1:-1;;;;;;29609:27:0;;;29579:57;29571:78;;;;-1:-1:-1;;;29571:78:0;;;;;;;;;29660:14;:37;;-1:-1:-1;;;;;29708:39:0;;;-1:-1:-1;;;29708:39:0;-1:-1:-1;;;;;;;;29660:37:0;;;-1:-1:-1;;;;;;29660:37:0;;;;;;;29708:39;;;;29660:14;29763;;29660:37;29763:14;;;;29760:32;;;29779:13;:11;:13::i;:::-;29487:313;;:::o;19563:1389::-;19684:25;;;19744:5;:7;;;:21;;;;;;;;;19740:1205;;;19802:42;19822:5;19829:14;19802:19;:42::i;:::-;19782:62;;19866:16;19859:23;;19740:1205;;;19915:16;19904:5;:7;;;:27;;;;;;;;;19900:1045;;;19968:44;19990:5;19997:14;19968:21;:44::i;19900:1045::-;20083:25;20111:21;20124:5;:7;;;20111:5;:8;;;:12;;:21;;;;:::i;:::-;20083:49;;20147:28;20178:21;20190:5;:8;;;20178:5;:7;;;:11;;:21;;;;:::i;:::-;20147:52;;20235:17;20218:14;:34;20214:720;;;20293:44;20315:5;20322:14;20293:21;:44::i;:::-;20273:64;;20363:16;20356:23;;20422:20;20402:17;:40;20398:129;;;20487:20;20467:40;;20398:129;20214:720;;;20570:17;20552:14;:35;20548:386;;;20628:20;20608:40;;20674:10;20667:17;;20548:386;;;20745:131;20792:65;20812:5;20819:37;:14;20838:17;20819:37;:18;:37;:::i;:::-;20792:19;:65::i;:::-;20745:20;;:131;:24;:131;:::i;:::-;20725:151;;20902:16;20895:23;;20548:386;19900:1045;;;19563:1389;;;;;:::o;17506:2049::-;17625:26;;;17686:5;:7;;;:21;;;;;;;;;17682:1866;;;17807:40;17826:5;17833:13;17807:18;:40::i;:::-;17786:61;;17869:16;17862:23;;17682:1866;;;17918:16;17907:5;:7;;;:27;;;;;;;;;17903:1645;;;17951:24;17978:21;17991:5;:7;;;17978:5;:8;;;:12;;:21;;;;:::i;:::-;17951:48;;18014:29;18046:21;18058:5;:8;;;18046:5;:7;;;:11;;:21;;;;:::i;:::-;18014:53;;18195:16;18179:13;:32;18175:1156;;;18306:42;18327:5;18334:13;18306:20;:42::i;:::-;18285:63;;18374:16;18367:23;;18434:21;18413:18;:42;18409:402;;;18770:21;18749:42;;18409:402;18175:1156;;;18853:16;18836:13;:33;18832:499;;;18965:21;18944:42;;19012:10;19005:17;;18832:499;;;19144:129;19192:62;19211:5;19218:35;:13;19236:16;19218:35;:17;:35;:::i;:::-;19192:18;:62::i;19144:129::-;19123:150;;19299:16;19292:23;;18832:499;17903:1645;;;;;19456:42;19477:5;19484:13;19456:20;:42::i;:::-;19435:63;19520:16;;-1:-1:-1;17506:2049:0;-1:-1:-1;;;17506:2049:0:o;23945:604::-;24032:16;24021:5;:7;;;:27;;;;;;;;;24017:525;;;24076:174;24136:5;:7;;;24162:21;24174:5;:8;;;24162:5;:7;;;:11;;:21;;;;:::i;:::-;24202:7;;24228;;;;24076:41;:174::i;:::-;24065:8;;;:185;24017:525;;;24283:16;24272:5;:7;;;:27;;;;;;;;;24268:274;;;24327:203;24387:5;:7;;;24413:21;24425:5;:8;;;24413:5;:7;;;:11;;:21;;;;:::i;:::-;24481:7;;24453:36;;:27;:36::i;:::-;24508:5;:7;;;24327:41;:203::i;:::-;24316:8;;;:214;24268:274;23945:604;:::o;33931:243::-;-1:-1:-1;;;;;34012:14:0;;;;;;:8;:14;;;;;;:25;;34031:5;34012:25;:18;:25;:::i;:::-;-1:-1:-1;;;;;33995:14:0;;;;;;:8;:14;;;;;:42;34062:11;;:22;;34078:5;34062:22;:15;:22;:::i;:::-;34048:11;:36;34100:17;;-1:-1:-1;;;;;34100:17:0;;;;;;;34111:5;;34100:17;;;;;;;;;;34156:1;-1:-1:-1;;;;;34133:33:0;34142:4;-1:-1:-1;;;;;34133:33:0;-1:-1:-1;;;;;;;;;;;34160:5:0;34133:33;;;;;;;30472:161;30550:10;;30546:80;;30577:12;;:37;;-1:-1:-1;;;;;30577:12:0;30603:2;30607:6;30577:37;:25;:37;:::i;30641:163::-;30720:10;;30716:81;;30747:13;;:38;;-1:-1:-1;;;;;30747:13:0;30774:2;30778:6;30747:38;:26;:38;:::i;29808:532::-;29867:12;;:37;;-1:-1:-1;;;29867:37:0;;29845:19;;-1:-1:-1;;;;;29867:12:0;;:22;;:37;;29898:4;;29867:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29938:13;;:38;;-1:-1:-1;;;29938:38:0;;29845:59;;-1:-1:-1;29915:20:0;;-1:-1:-1;;;;;29938:13:0;;;;:23;;:38;;29970:4;;29938:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29915:61;-1:-1:-1;;;;;;29995:26:0;;;;;:57;;-1:-1:-1;;;;;;30025:27:0;;;29995:57;29987:78;;;;-1:-1:-1;;;29987:78:0;;;;;;;;;30095:14;;-1:-1:-1;;;;;30095:14:0;30080:29;;30076:99;;30126:14;:37;;-1:-1:-1;;;;;;30126:37:0;-1:-1:-1;;;;;30126:37:0;;;;;30076:99;30205:15;;-1:-1:-1;;;30205:15:0;;-1:-1:-1;;;;;30205:15:0;30189:31;;30185:103;;30237:15;:39;;-1:-1:-1;;;;;;;;30237:39:0;-1:-1:-1;;;;;;;;30237:39:0;;;;;;30185:103;30303:14;;;;;;;30300:32;;;30319:13;:11;:13::i;24557:621::-;24624:7;24659:16;24648:5;:7;;;:27;;;;;;;;;24644:527;;;24752:7;;;;24738:8;;;;24692:9;;24704:66;;24725:35;;24752:7;24725:22;;24738:8;24725:22;:12;:22;:::i;:35::-;24762:5;:7;;;24704:20;:66::i;:::-;24692:78;;24789:66;24822:32;24843:5;:7;;;24852:1;24822:20;:32::i;:::-;24809:7;;;;24789:28;;6333:6;;24789:28;:19;:28;:::i;:::-;:32;:66;:32;:66;:::i;:::-;24785:70;;24877:32;24898:5;:7;;;24907:1;24877:20;:32::i;:::-;24870:39;;;;;24644:527;25002:7;;;;24988:8;;;;24942:9;;24954:66;;24975:35;;25002:7;24975:22;;24988:8;24975:22;:12;:22;:::i;:35::-;25012:5;:7;;;24954:20;:66::i;:::-;24942:78;;25039:66;25072:32;25093:5;:7;;;25102:1;25072:20;:32::i;25039:66::-;25035:70;;25127:32;25148:5;:7;;;25157:1;25127:20;:32::i;29041:391::-;29188:22;;29115:23;:15;:23;;;-1:-1:-1;;;29188:22:0;;;;29171:39;;;29225:15;;;;;;:38;;-1:-1:-1;29244:14:0;;-1:-1:-1;;;;;29244:14:0;:19;;29225:38;:62;;;;-1:-1:-1;29267:15:0;;-1:-1:-1;;;29267:15:0;;-1:-1:-1;;;;;29267:15:0;:20;;29225:62;29221:154;;;29352:11;29336:27;;:13;:11;:13::i;:::-;29304:28;:59;;29336:27;;;;29304:59;;;29221:154;-1:-1:-1;29385:22:0;:39;;;;;;-1:-1:-1;;;29385:39:0;-1:-1:-1;;;;;29385:39:0;;;;;;;;;29041:391::o;21586:446::-;21726:7;21801:223;21860:5;:8;;;21887:5;:8;;;21914:14;21947:36;21975:5;:7;;;21947:27;:36::i;:::-;22002:5;:7;;;21801:40;:223::i;23437:447::-;23579:7;23654:222;23713:5;:8;;;23740:5;:7;;;23766:14;23799:36;23827:5;:7;;;23799:27;:36::i;22088:446::-;22230:7;22305:221;22350:5;:8;;;22377:27;22389:14;22377:5;:7;;;:11;;:27;;;;:::i;:::-;22423:7;;;;22477;;22449:36;;:27;:36::i;:::-;22504:5;:7;;;22305:26;:221::i;21008:570::-;21146:7;21377:193;21436:5;:8;;;21463:5;:8;;;21490:13;21522:5;:7;;;21548:5;:7;;;21377:40;:193::i;23014:415::-;23154:7;23230:191;23275:5;:8;;;23302:26;23314:13;23302:5;:7;;;:11;;:26;;;;:::i;:::-;23347:7;;;;23373;;23399;;;;23230:26;:191::i;22542:416::-;22682:7;22758:192;22817:5;:8;;;22844:5;:7;;;22870:13;22902:5;:7;;;22928:5;:7;;;22758:40;:192::i;12445:1111::-;12602:7;12626;12622:48;;-1:-1:-1;12657:1:0;12650:8;;12622:48;12684:6;12680:84;;12714:38;12721:30;12742:1;12745:5;12721:20;:30::i;:::-;12714:2;;:38;:6;:38;:::i;:::-;12707:45;;;;12680:84;12975:12;;13011:14;13012:1;:5;;13023:1;13011:14;:11;:14;:::i;:::-;12998:27;-1:-1:-1;13040:7:0;13036:273;;6333:6;13064:22;;13036:273;;;13129:5;13123:2;13114:5;13109:2;:10;13108:17;;;;;;:26;13104:205;;;13158:49;:42;6379:6;13158:20;13159:10;;;13175:2;13158:20;:16;:20;:::i;:42::-;:47;:49::i;:::-;13151:56;;13104:205;;;13247:50;:43;6379:6;13247:21;13262:5;13247:10;:2;13254;13247:10;:6;:10;:::i;:::-;:14;:21;:14;:21;:::i;:50::-;13240:57;;13104:205;13319:15;13350:75;6333:6;13350:54;13371:25;:4;6333:6;13371:25;:8;:25;:::i;:::-;13398:1;13402;13398:5;13350:20;:54::i;:75::-;13319:106;;13515:33;13536:2;13540:7;13515:20;:33::i;:::-;13508:40;;;;;12445:1111;;;;;;;:::o;6943:126::-;7007:7;7034:27;7042:6;7054;7034:27;:19;:27;:::i;7783:211::-;7900:86;7920:5;7950:23;;;7975:2;7979:5;7927:58;;;;;;;;;;;;;;-1:-1:-1;;7927:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7927:58:0;-1:-1:-1;;;;;;7927:58:0;;;;;;;;;;7900:19;:86::i;:::-;7783:211;;;:::o;14410:2627::-;14587:7;14620:1;14615:2;:6;14607:33;;;;-1:-1:-1;;;14607:33:0;;;;;;;;;14655:10;14651:51;;-1:-1:-1;14689:1:0;14682:8;;14651:51;14718:6;14714:119;;14781:2;14748:30;14769:1;14772:5;14748:20;:30::i;:::-;:35;:73;;14791:30;14812:1;14815:5;14791:20;:30::i;:::-;14748:73;;;14786:2;14748:73;14741:80;;;;14714:119;6333:6;14849:1;:20;14845:713;;;15156:12;;15200;:1;15206:5;15200:12;:5;:12;:::i;:::-;15183:29;-1:-1:-1;15231:11:0;15227:255;;15270:1;15263:8;;15227:255;;;15323:2;15313:6;15307:2;15298:6;:11;15297:22;;;;;;:28;15293:189;;;15353:29;15371:10;15378:2;;15371:10;:6;:10;:::i;:::-;15354:11;;;;15353:29;:17;:29;:::i;:::-;15346:36;;15293:189;;;15430:36;15463:2;15430:28;15456:1;15430:21;15463:2;15430:28;:5;15440:2;15430:13;:9;:13;:::i;:36::-;15423:43;;15293:189;15503:43;15520:25;:4;6333:6;15520:25;:8;:25;:::i;:::-;15503:12;:2;15510:4;15503:12;:6;:12;:::i;:43::-;15496:50;;;;;;14845:713;15882:13;15898:43;15928:12;:1;15934:5;15928:12;:5;:12;:::i;:::-;15898:25;15920:2;15898:17;15912:2;15898:9;:1;15920:2;15898:9;:5;:9;:::i;:43::-;15882:59;-1:-1:-1;15973:12:0;15988:30;16015:2;15988:22;6333:6;16008:1;15988:22;:19;:22;:::i;:30::-;15973:45;;16042:9;16074:5;16066:4;:13;16062:170;;-1:-1:-1;16103:12:0;;;16137:5;16062:170;;;-1:-1:-1;16182:12:0;;16216:4;16062:170;16249:25;:4;6333:6;16249:25;:8;:25;:::i;:::-;16242:32;-1:-1:-1;16314:18:0;16348:137;16387:29;16414:1;16387:22;6333:6;16407:1;16387:22;:19;:22;:::i;:29::-;16435:35;16467:2;16435:27;16456:1;16459:2;16435:20;:27::i;:35::-;16348:20;:137::i;:::-;16314:171;-1:-1:-1;16524:37:0;:30;16314:171;16524:14;16533:4;;16524:14;:8;:14;:::i;:37::-;16511:50;-1:-1:-1;16622:19:0;16644:29;16671:1;16644:22;6333:6;16664:1;16644:22;:19;:22;:::i;:29::-;16622:51;;16694:17;16726:4;16722:134;;;16759:20;:10;16774:4;16759:20;:14;:20;:::i;:::-;16747:32;;16722:134;;;16824:20;:4;16833:10;16824:20;:8;:20;:::i;:::-;16812:32;;16722:134;16868:10;16881:43;16901:9;16912:11;16881:19;:43::i;:::-;16868:56;;16944:2;16939;:7;16935:95;;;16970:1;16963:8;;;;;;;;;;;16935:95;17011:7;;;-1:-1:-1;17004:14:0;;-1:-1:-1;;;;;;17004:14:0;14410:2627;;;;;;;;:::o;11525:612::-;11685:7;11718:1;11713:2;:6;11705:33;;;;-1:-1:-1;;;11705:33:0;;;;;;;;;11749:18;11770:17;11776:10;:2;11783;11776:10;:6;:10;:::i;:::-;11770:1;;:17;:5;:17;:::i;:::-;11749:38;-1:-1:-1;11813:6:0;11809:77;;11843:31;:10;6333:6;11843:31;:14;:31;:::i;:::-;11836:38;;;;;11809:77;11896:16;11915:44;11936:18;11951:2;11936:10;11943:2;;11936:10;:6;:10;:::i;:18::-;11956:2;11915:20;:44::i;:::-;11896:63;;11970:15;11988:33;12009:1;12012:8;11988:20;:33::i;:::-;11970:51;-1:-1:-1;12056:73:0;6379:6;12056:51;12096:10;12056:35;11970:51;12056:22;6333:6;12076:1;12056:22;:19;:22;:::i;:73::-;12049:80;11525:612;-1:-1:-1;;;;;;;;;11525:612:0:o;5861:205::-;5943:1;5951;5947;5943:5;;:9;5979:80;5990:1;5986;:5;5979:80;;;6012:1;6008:5;;6046:1;6041;6037;6033;:5;;;;;;:9;6032:15;;;;;;6028:19;;5979:80;;;5861:205;;;;:::o;9356:1046::-;10016:12;10030:23;10065:5;-1:-1:-1;;;;;10057:19:0;10077:4;10057:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10015:67;;;;10101:7;10093:52;;;;-1:-1:-1;;;10093:52:0;;;;;;;;;10162:17;;:21;10158:237;;10317:10;10306:30;;;;;;;;;;;;;;10298:85;;;;-1:-1:-1;;;10298:85:0;;;;;;;;;9356:1046;;;;:::o;6804:131::-;6871:7;6898:29;6925:1;6898:18;:6;6909;6898:18;:10;:18;:::i;:::-;:26;:29;:26;:29;:::i;5251:288::-;5313:7;5333:16;5352:9;5356:1;5359;5352:3;:9::i;:::-;5333:28;-1:-1:-1;5396:12:0;;;5392:16;;5423:13;;5419:113;;-1:-1:-1;5471:1:0;5460:12;;-1:-1:-1;5453:19:0;;5419:113;-1:-1:-1;5512:8:0;-1:-1:-1;5505:15:0;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;43969:54;;46386:35;;46376:2;;46435:1;;46425:12;559:336;;;673:3;666:4;658:6;654:17;650:27;640:2;;-1:-1;;681:12;640:2;-1:-1;711:20;;751:18;740:30;;737:2;;;-1:-1;;773:12;737:2;817:4;809:6;805:17;793:29;;868:3;817:4;848:17;809:6;834:32;;831:41;828:2;;;885:1;;875:12;1451:241;;1555:2;1543:9;1534:7;1530:23;1526:32;1523:2;;;-1:-1;;1561:12;1523:2;1623:53;1668:7;1644:22;1623:53;;1699:366;;;1820:2;1808:9;1799:7;1795:23;1791:32;1788:2;;;-1:-1;;1826:12;1788:2;1888:53;1933:7;1909:22;1888:53;;;1878:63;;1996:53;2041:7;1978:2;2021:9;2017:22;1996:53;;;1986:63;;1782:283;;;;;;2072:1115;;;;;;;;;2292:3;2280:9;2271:7;2267:23;2263:33;2260:2;;;-1:-1;;2299:12;2260:2;2361:53;2406:7;2382:22;2361:53;;;2351:63;;2469:53;2514:7;2451:2;2494:9;2490:22;2469:53;;;2459:63;;2577:53;2622:7;2559:2;2602:9;2598:22;2577:53;;;2567:63;;2667:2;2710:9;2706:22;970:20;2675:63;;2794:53;2839:7;2775:3;2819:9;2815:22;2794:53;;;2784:63;;2884:3;2928:9;2924:22;970:20;2893:63;;2993:3;3037:9;3033:22;970:20;3002:63;;3102:3;3143:9;3139:22;206:20;231:30;255:5;231:30;;;3111:60;;;;2254:933;;;;;;;;;;;;3194:491;;;;3332:2;3320:9;3311:7;3307:23;3303:32;3300:2;;;-1:-1;;3338:12;3300:2;85:6;72:20;97:33;124:5;97:33;;;3390:63;-1:-1;3490:2;3529:22;;72:20;97:33;72:20;97:33;;;3294:391;;3498:63;;-1:-1;;;3598:2;3637:22;;;;970:20;;3294:391;3692:991;;;;;;;;3896:3;3884:9;3875:7;3871:23;3867:33;3864:2;;;-1:-1;;3903:12;3864:2;3965:53;4010:7;3986:22;3965:53;;;3955:63;;4073:53;4118:7;4055:2;4098:9;4094:22;4073:53;;;4063:63;;4163:2;4206:9;4202:22;970:20;4171:63;;4271:2;4314:9;4310:22;970:20;4279:63;;4379:3;4421:9;4417:22;1246:20;1271:31;1296:5;1271:31;;;3858:825;;;;-1:-1;3858:825;;;;4388:61;4486:3;4526:22;;475:20;;-1:-1;4595:3;4635:22;;;475:20;;3858:825;-1:-1;;3858:825;4690:366;;;4811:2;4799:9;4790:7;4786:23;4782:32;4779:2;;;-1:-1;;4817:12;4779:2;4879:53;4924:7;4900:22;4879:53;;;4869:63;4969:2;5008:22;;;;970:20;;-1:-1;;;4773:283;5063:257;;5175:2;5163:9;5154:7;5150:23;5146:32;5143:2;;;-1:-1;;5181:12;5143:2;354:6;348:13;366:30;390:5;366:30;;5327:263;;5442:2;5430:9;5421:7;5417:23;5413:32;5410:2;;;-1:-1;;5448:12;5410:2;-1:-1;1118:13;;5404:186;-1:-1;5404:186;5597:993;;;;;;;;5805:3;5793:9;5784:7;5780:23;5776:33;5773:2;;;-1:-1;;5812:12;5773:2;983:6;970:20;5864:63;;5964:2;6007:9;6003:22;72:20;97:33;124:5;97:33;;;5972:63;-1:-1;6072:2;6111:22;;970:20;;-1:-1;6180:2;6219:22;;970:20;;-1:-1;6316:3;6301:19;;6288:33;6341:18;6330:30;;6327:2;;;-1:-1;;6363:12;6327:2;6401:64;6457:7;6448:6;6437:9;6433:22;6401:64;;;5767:823;;;;-1:-1;5767:823;;;;;;6502:3;6542:22;;;970:20;;5767:823;-1:-1;;;;5767:823;6597:741;;;;;;6771:3;6759:9;6750:7;6746:23;6742:33;6739:2;;;-1:-1;;6778:12;6739:2;983:6;970:20;6830:63;;6930:2;6973:9;6969:22;970:20;6938:63;;7056:53;7101:7;7038:2;7081:9;7077:22;7056:53;;;7046:63;;7174:2;7163:9;7159:18;7146:32;7198:18;7190:6;7187:30;7184:2;;;-1:-1;;7220:12;7184:2;7258:64;7314:7;7305:6;7294:9;7290:22;7258:64;;;6733:605;;;;-1:-1;6733:605;;-1:-1;7248:74;;;6733:605;-1:-1;;;6733:605;7345:259;;7458:2;7446:9;7437:7;7433:23;7429:32;7426:2;;;-1:-1;;7464:12;7426:2;1396:6;1390:13;1408:31;1433:5;1408:31;;8293:297;;42852:6;42847:3;42840:19;45683:6;45678:3;42889:4;42884:3;42880:14;45660:30;-1:-1;42889:4;45730:6;42884:3;45721:16;;45714:27;42889:4;46197:7;;46201:2;8576:6;46181:14;46177:28;42884:3;8545:39;;8538:46;;8393:197;;;;;;20894:271;;8758:5;42567:12;8869:52;8914:6;8909:3;8902:4;8895:5;8891:16;8869:52;;;8933:16;;;;;21028:137;-1:-1;;21028:137;21172:273;;-1:-1;9123:5;9117:12;9157:1;;9146:9;9142:17;9170:1;9165:267;;;;9443:1;9438:427;;;;9135:730;;9165:267;-1:-1;;9369:25;;9357:38;;9239:1;9224:17;;9243:4;9220:28;9409:16;;;-1:-1;9165:267;;9438:427;9507:1;9496:9;9492:17;42420:3;-1:-1;42410:14;42452:4;;-1:-1;42439:18;-1:-1;9698:130;9712:6;9709:1;9706:13;9698:130;;;9771:14;;9758:11;;;9751:35;9805:15;;;;9727:12;;9698:130;;;-1:-1;;;9842:16;;;-1:-1;9135:730;-1:-1;21430:10;;21307:138;-1:-1;;;;;21307:138;21452:597;;8758:5;42567:12;8869:52;8914:6;8909:3;8902:4;8895:5;8891:16;8869:52;;;42567:12;;;8933:16;;8869:52;42567:12;8933:16;8902:4;8891:16;;8869:52;;;42567:12;;;8933:16;;8869:52;42567:12;8933:16;8902:4;8891:16;;8869:52;;;8933:16;;;;21684:365;-1:-1;;;;;;21684:365;22056:659;-1:-1;;;12632:87;;12617:1;12738:11;;8062:37;;;;22567:12;;;8062:37;22678:12;;;22301:414;22722:222;-1:-1;;;;;43969:54;;;;7831:37;;22849:2;22834:18;;22820:124;22951:572;-1:-1;;;;;43969:54;;;7690:58;;43969:54;;;;23343:2;23328:18;;7831:37;23426:2;23411:18;;8062:37;23509:2;23494:18;;8062:37;;;;23170:3;23155:19;;23141:382;23530:676;;43980:42;;;;;43467:5;43969:54;7697:3;7690:58;8092:5;23950:2;23939:9;23935:18;8062:37;8092:5;24033:2;24022:9;24018:18;8062:37;23777:3;24070:2;24059:9;24055:18;24048:48;24110:86;23777:3;23766:9;23762:19;24182:6;24174;24110:86;;;24102:94;23748:458;-1:-1;;;;;;;23748:458;24213:788;;43980:42;;;;;43467:5;43969:54;7697:3;7690:58;8092:5;24661:2;24650:9;24646:18;8062:37;8092:5;24744:2;24733:9;24729:18;8062:37;8092:5;24827:2;24816:9;24812:18;8062:37;24488:3;24864;24853:9;24849:19;24842:49;24905:86;24488:3;24477:9;24473:19;24977:6;24969;24905:86;;;24897:94;24459:542;-1:-1;;;;;;;;24459:542;25008:796;-1:-1;;;;;43969:54;;;7831:37;;43969:54;;;25448:2;25433:18;;7831:37;25531:2;25516:18;;8062:37;;;;25614:2;25599:18;;8062:37;;;;43969:54;;25705:3;25690:19;;7690:58;43969:54;;;43980:42;25774:19;;7831:37;25283:3;25268:19;;25254:550;25811:333;-1:-1;;;;;43969:54;;;;7831:37;;26130:2;26115:18;;8062:37;25966:2;25951:18;;25937:207;26151:444;-1:-1;;;;;43969:54;;;;7831:37;;26498:2;26483:18;;8062:37;;;;26581:2;26566:18;;8062:37;26334:2;26319:18;;26305:290;26602:210;43551:13;;43544:21;7945:34;;26723:2;26708:18;;26694:118;26819:222;8062:37;;;26946:2;26931:18;;26917:124;27048:780;8062:37;;;-1:-1;;;;;43969:54;;;27480:2;27465:18;;7831:37;43969:54;;;;27563:2;27548:18;;7831:37;27646:2;27631:18;;8062:37;27729:3;27714:19;;8062:37;;;;43980:42;27798:19;;8062:37;27315:3;27300:19;;27286:542;27835:548;8062:37;;;44280:4;44269:16;;;;28203:2;28188:18;;20847:35;28286:2;28271:18;;8062:37;28369:2;28354:18;;8062:37;28042:3;28027:19;;28013:370;28918:836;10511:134;;;29490:2;29475:18;;8062:37;;;;29573:2;29558:18;;8062:37;;;;29656:2;29641:18;;8062:37;-1:-1;;;;;43969:54;29739:3;29724:19;;7831:37;29241:3;29226:19;;29212:542;29761:310;;29908:2;29929:17;29922:47;10802:5;42567:12;42852:6;29908:2;29897:9;29893:18;42840:19;10896:52;10941:6;42880:14;29897:9;42880:14;29908:2;10922:5;10918:16;10896:52;;;46197:7;46181:14;-1:-1;;46177:28;10960:39;;;;42880:14;10960:39;;29879:192;-1:-1;;29879:192;30078:416;30278:2;30292:47;;;11603:2;30263:18;;;42840:19;-1:-1;;;42880:14;;;11619:40;11678:12;;;30249:245;30501:416;30701:2;30715:47;;;11929:2;30686:18;;;42840:19;-1:-1;;;42880:14;;;11945:43;12007:12;;;30672:245;30924:416;31124:2;31138:47;;;12258:2;31109:18;;;42840:19;-1:-1;;;42880:14;;;12274:37;12330:12;;;31095:245;31347:416;31547:2;31561:47;;;12988:1;31532:18;;;42840:19;-1:-1;;;42880:14;;;13003:32;13054:12;;;31518:245;31770:416;31970:2;31984:47;;;13305:2;31955:18;;;42840:19;13341:28;42880:14;;;13321:49;13389:12;;;31941:245;32193:416;32393:2;32407:47;;;32378:18;;;42840:19;13676:34;42880:14;;;13656:55;13730:12;;;32364:245;32616:416;32816:2;32830:47;;;13981:2;32801:18;;;42840:19;-1:-1;;;42880:14;;;13997:36;14052:12;;;32787:245;33039:416;33239:2;33253:47;;;14303:2;33224:18;;;42840:19;-1:-1;;;42880:14;;;14319:37;14375:12;;;33210:245;33462:416;33662:2;33676:47;;;14626:2;33647:18;;;42840:19;-1:-1;;;42880:14;;;14642:38;14699:12;;;33633:245;33885:416;34085:2;34099:47;;;14950:2;34070:18;;;42840:19;-1:-1;;;42880:14;;;14966:35;15020:12;;;34056:245;34308:416;34508:2;34522:47;;;15271:1;34493:18;;;42840:19;-1:-1;;;42880:14;;;15286:32;15337:12;;;34479:245;34731:416;34931:2;34945:47;;;15588:2;34916:18;;;42840:19;-1:-1;;;42880:14;;;15604:43;15666:12;;;34902:245;35154:416;35354:2;35368:47;;;15917:2;35339:18;;;42840:19;-1:-1;;;42880:14;;;15933:42;15994:12;;;35325:245;35577:416;35777:2;35791:47;;;16245:2;35762:18;;;42840:19;-1:-1;;;42880:14;;;16261:37;16317:12;;;35748:245;36000:416;36200:2;36214:47;;;16568:2;36185:18;;;42840:19;16604:30;42880:14;;;16584:51;16654:12;;;36171:245;36423:416;36623:2;36637:47;;;16905:2;36608:18;;;42840:19;-1:-1;;;42880:14;;;16921:41;16981:12;;;36594:245;36846:416;37046:2;37060:47;;;17232:1;37031:18;;;42840:19;-1:-1;;;42880:14;;;17247:31;17297:12;;;37017:245;37269:416;37469:2;37483:47;;;17548:1;37454:18;;;42840:19;-1:-1;;;42880:14;;;17563:32;17614:12;;;37440:245;37692:416;37892:2;37906:47;;;17865:2;37877:18;;;42840:19;17901:34;42880:14;;;17881:55;-1:-1;;;17956:12;;;17949:34;18002:12;;;37863:245;38115:416;38315:2;38329:47;;;18253:2;38300:18;;;42840:19;18289:32;42880:14;;;18269:53;18341:12;;;38286:245;38538:416;38738:2;38752:47;;;18592:2;38723:18;;;42840:19;-1:-1;;;42880:14;;;18608:35;18662:12;;;38709:245;38961:416;39161:2;39175:47;;;18913:1;39146:18;;;42840:19;-1:-1;;;42880:14;;;18928:32;18979:12;;;39132:245;39384:327;;39563:3;39552:9;39548:19;39540:27;;19282:16;19276:23;8069:3;8062:37;19444:4;19437:5;19433:16;19427:23;19444:4;19508:3;19504:14;8062:37;19595:4;19588:5;19584:16;19578:23;19595:4;19659:3;19655:14;8062:37;19746:4;19739:5;19735:16;19729:23;19746:4;19810:3;19806:14;8062:37;19898:4;19891:5;19887:16;19881:23;19898:4;19962:3;19958:14;8062:37;20050:4;20043:5;20039:16;20033:23;20050:4;20114:3;20110:14;8062:37;20201:4;20194:5;20190:16;20184:23;46298:1;46291:5;46288:12;46278:2;;46304:9;46278:2;45112:35;20201:4;20274:3;20270:14;10285:59;;39534:177;;;;;39718:222;-1:-1;;;;;43853:42;;;;20384:37;;39845:2;39830:18;;39816:124;40176:333;8062:37;;;40495:2;40480:18;;8062:37;40331:2;40316:18;;40302:207;40516:444;8062:37;;;40863:2;40848:18;;8062:37;;;;40946:2;40931:18;;8062:37;40699:2;40684:18;;40670:290;40967:892;8062:37;;;41427:2;41412:18;;8062:37;;;;41510:2;41495:18;;8062:37;;;;41593:2;41578:18;;8062:37;;;;41676:3;41661:19;;8062:37;41760:3;41745:19;;8062:37;41844:3;41829:19;;8062:37;41262:3;41247:19;;41233:626;41866:218;44186:10;44175:22;;;;20732:36;;41991:2;41976:18;;41962:122;42091:214;44280:4;44269:16;;;;20847:35;;42214:2;42199:18;;42185:120;45756:268;45821:1;45828:101;45842:6;45839:1;45836:13;45828:101;;;45909:11;;;45903:18;45890:11;;;45883:39;45864:2;45857:10;45828:101;;;45944:6;45941:1;45938:13;45935:2;;;-1:-1;;45821:1;45991:16;;45984:27;45805:219;46327:117;-1:-1;;;;;43969:54;;46386:35;;46376:2;;46435:1;;46425:12;46451:111;46532:5;43551:13;43544:21;46510:5;46507:32;46497:2;;46553:1;;46543:12;46817:113;44280:4;46900:5;44269:16;46877:5;46874:33;46864:2;;46921:1;;46911:12
Swarm Source
ipfs://4925c03cf305d35bcf4b0b82617cf8c8cc62059793ed9dc495500ded4ec77d7a
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.