More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 13000644 | 1203 days ago | IN | 0 ETH | 0.416567 | ||||
Remove Liquidity... | 13000635 | 1203 days ago | IN | 0 ETH | 0.518948 | ||||
Rebalance | 12959826 | 1210 days ago | IN | 0 ETH | 0.09267737 | ||||
Rebalance | 12953923 | 1210 days ago | IN | 0 ETH | 0.10557383 | ||||
Add Liquidity Fo... | 12950671 | 1211 days ago | IN | 0 ETH | 0.02640096 | ||||
Rebalance | 12950637 | 1211 days ago | IN | 0 ETH | 0.13704669 | ||||
Add Liquidity Fo... | 12947435 | 1211 days ago | IN | 0 ETH | 0.00846166 | ||||
Add Liquidity Fo... | 12946806 | 1212 days ago | IN | 0 ETH | 0.03427468 | ||||
Add Liquidity Fo... | 12946301 | 1212 days ago | IN | 0 ETH | 0.00689204 | ||||
Add Liquidity Fo... | 12946242 | 1212 days ago | IN | 0 ETH | 0.00814213 | ||||
Add Liquidity Fo... | 12946042 | 1212 days ago | IN | 0 ETH | 0.00793065 | ||||
Add Liquidity Fo... | 12946016 | 1212 days ago | IN | 0 ETH | 0.00793065 | ||||
Add Liquidity Fo... | 12921911 | 1216 days ago | IN | 0 ETH | 0.07566246 | ||||
0x60e06040 | 12920645 | 1216 days ago | IN | 0 ETH | 0.1354662 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CellarPoolShare
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-29 */ //SPDX-License-Identifier: Apache-2.0 // VolumeFi Software, Inc. pragma solidity ^0.7.6; pragma abicoder v2; interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function approve(address spender, uint256 amount) external returns (bool); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); } interface INonfungiblePositionManager { struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } function mint(MintParams calldata params) external payable returns ( uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1 ); function increaseLiquidity(IncreaseLiquidityParams calldata params) external payable returns ( uint128 liquidity, uint256 amount0, uint256 amount1 ); function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1); function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1); function burn(uint256 tokenId) external payable; function positions(uint256 tokenId) external view returns ( uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); } interface ISwapRouter { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); } interface IUniswapV3Factory { function getPool( address tokenA, address tokenB, uint24 fee ) external view returns (address pool); } interface IUniswapV3Pool { function slot0() external view returns ( uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked ); } library SafeMath { function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } } library Address { function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), "approve non-zero to non-zero" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { require( abi.decode(returndata, (bool)), "ERC20 operation did not succeed" ); } } } library FixedPoint96 { uint256 internal constant Q96 = 0x1000000000000000000000000; } library FullMath { function mulDiv( uint256 a, uint256 b, uint256 denominator ) internal pure returns (uint256 result) { uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(a, b, not(0)) prod0 := mul(a, b) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } if (prod1 == 0) { require(denominator > 0); assembly { result := div(prod0, denominator) } return result; } require(denominator > prod1); uint256 remainder; assembly { remainder := mulmod(a, b, denominator) } assembly { prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } uint256 twos = -denominator & denominator; assembly { denominator := div(denominator, twos) } assembly { prod0 := div(prod0, twos) } assembly { twos := add(div(sub(0, twos), twos), 1) } prod0 |= prod1 * twos; uint256 inv = (3 * denominator) ^ 2; inv *= 2 - denominator * inv; // inverse mod 2**8 inv *= 2 - denominator * inv; // inverse mod 2**16 inv *= 2 - denominator * inv; // inverse mod 2**32 inv *= 2 - denominator * inv; // inverse mod 2**64 inv *= 2 - denominator * inv; // inverse mod 2**128 inv *= 2 - denominator * inv; // inverse mod 2**256 result = prod0 * inv; return result; } } library TickMath { int24 internal constant MIN_TICK = -887272; int24 internal constant MAX_TICK = -MIN_TICK; function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) { uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick)); require(absTick <= uint256(MAX_TICK), "T"); uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000; if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128; if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128; if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128; if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128; if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128; if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128; if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128; if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128; if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128; if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128; if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128; if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128; if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128; if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128; if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128; if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128; if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128; if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128; if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128; if (tick > 0) ratio = type(uint256).max / ratio; sqrtPriceX96 = uint160( (ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1) ); } } library LiquidityAmounts { function toUint128(uint256 x) private pure returns (uint128 y) { require((y = uint128(x)) == x); } function getLiquidityForAmount0( uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint256 amount0 ) internal pure returns (uint128 liquidity) { if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); uint256 intermediate = FullMath.mulDiv(sqrtRatioAX96, sqrtRatioBX96, FixedPoint96.Q96); return toUint128( FullMath.mulDiv( amount0, intermediate, sqrtRatioBX96 - sqrtRatioAX96 ) ); } function getLiquidityForAmount1( uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint256 amount1 ) internal pure returns (uint128 liquidity) { if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); return toUint128( FullMath.mulDiv( amount1, FixedPoint96.Q96, sqrtRatioBX96 - sqrtRatioAX96 ) ); } function getLiquidityForAmounts( uint160 sqrtRatioX96, uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint256 amount0, uint256 amount1 ) internal pure returns (uint128 liquidity) { if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); if (sqrtRatioX96 <= sqrtRatioAX96) { liquidity = getLiquidityForAmount0( sqrtRatioAX96, sqrtRatioBX96, amount0 ); } else if (sqrtRatioX96 < sqrtRatioBX96) { uint128 liquidity0 = getLiquidityForAmount0(sqrtRatioX96, sqrtRatioBX96, amount0); uint128 liquidity1 = getLiquidityForAmount1(sqrtRatioAX96, sqrtRatioX96, amount1); liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1; } else { liquidity = getLiquidityForAmount1( sqrtRatioAX96, sqrtRatioBX96, amount1 ); } } } interface ICellarPoolShare is IERC20 { struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } struct MintResult { uint256 tokenId; uint128 liquidity; uint256 amount0; uint256 amount1; } struct CellarAddParams { uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } struct CellarRemoveParams { uint256 tokenAmount; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } struct CellarTickInfo { uint184 tokenId; int24 tickUpper; int24 tickLower; uint24 weight; } struct UintPair { uint256 a; uint256 b; } event AddedLiquidity( address indexed token0, address indexed token1, uint128 liquidity, uint256 amount0, uint256 amount1 ); event RemovedLiquidity( address indexed token0, address indexed token1, uint128 liquidity, uint256 amount0, uint256 amount1 ); function addLiquidityForUniV3(CellarAddParams calldata cellarParams) external; function addLiquidityEthForUniV3(CellarAddParams calldata cellarParams) external payable; function removeLiquidityFromUniV3(CellarRemoveParams calldata cellarParams) external; function removeLiquidityEthFromUniV3( CellarRemoveParams calldata cellarParams ) external; function reinvest() external; function setValidator(address _validator, bool value) external; function transferOwnership(address newOwner) external; function setFee(uint16 newFee) external; function owner() external view returns (address); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); } interface IWETH { function deposit() external payable; function withdraw(uint256) external; } contract CellarPoolShare is ICellarPoolShare { using SafeMath for uint256; using SafeERC20 for IERC20; address public constant NONFUNGIBLEPOSITIONMANAGER = 0xC36442b4a4522E871399CD717aBDD847Ab11FE88; address public constant UNISWAPV3FACTORY = 0x1F98431c8aD98523631AE4a59f267346ea31F984; address public constant SWAPROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564; address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; uint16 public constant FEEDOMINATOR = 10000; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) public validator; uint256 private _totalSupply; address private _owner; string private _name; string private _symbol; address public immutable token0; address public immutable token1; uint24 public immutable feeLevel; CellarTickInfo[] public cellarTickInfo; bool private _isEntered; uint16 public fee = 1000; constructor( string memory name_, string memory symbol_, address _token0, address _token1, uint24 _feeLevel, CellarTickInfo[] memory _cellarTickInfo ) { _name = name_; _symbol = symbol_; require(_token0 < _token1, "Tokens are not sorted"); token0 = _token0; token1 = _token1; feeLevel = _feeLevel; for (uint256 i = 0; i < _cellarTickInfo.length; i++) { require(_cellarTickInfo[i].weight > 0, "Weight cannot be zero"); require(_cellarTickInfo[i].tokenId == 0, "tokenId is not empty"); if (i > 0) { require(_cellarTickInfo[i].tickUpper <= _cellarTickInfo[i - 1].tickLower, "Wrong tick tier"); } cellarTickInfo.push( CellarTickInfo({ tokenId: 0, tickUpper: _cellarTickInfo[i].tickUpper, tickLower: _cellarTickInfo[i].tickLower, weight: _cellarTickInfo[i].weight }) ); } _owner = msg.sender; } modifier onlyValidator() { require(validator[msg.sender], "Not validator"); _; } modifier nonReentrant() { require(!_isEntered, "reentrant call"); _isEntered = true; _; _isEntered = false; } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) external override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][msg.sender]; require(currentAllowance >= amount, "transfer exceeds allowance"); _approve(sender, msg.sender, currentAllowance - amount); return true; } function addLiquidityForUniV3(CellarAddParams calldata cellarParams) external override { IERC20(token0).safeTransferFrom( msg.sender, address(this), cellarParams.amount0Desired ); IERC20(token1).safeTransferFrom( msg.sender, address(this), cellarParams.amount1Desired ); ( uint256 inAmount0, uint256 inAmount1, uint128 liquidityBefore, uint128 liquiditySum ) = _addLiquidity(cellarParams); if (liquidityBefore == 0) { _mint(msg.sender, liquiditySum); } else { _mint( msg.sender, FullMath.mulDiv(liquiditySum, _totalSupply, liquidityBefore) ); } require(inAmount0 >= cellarParams.amount0Min, "Less than Amount0Min"); require(inAmount1 >= cellarParams.amount1Min, "Less than Amount1Min"); if (cellarParams.amount0Desired > inAmount0) { IERC20(token0).safeTransfer( msg.sender, cellarParams.amount0Desired - inAmount0 ); } if (cellarParams.amount1Desired > inAmount1) { IERC20(token1).safeTransfer( msg.sender, cellarParams.amount1Desired - inAmount1 ); } emit AddedLiquidity(token0, token1, liquiditySum, inAmount0, inAmount1); } function addLiquidityEthForUniV3(CellarAddParams calldata cellarParams) external payable override nonReentrant { if (token0 == WETH) { if (msg.value > cellarParams.amount0Desired) { payable(msg.sender).transfer( msg.value - cellarParams.amount0Desired ); } else { require( msg.value == cellarParams.amount0Desired, "Eth not enough" ); } IWETH(WETH).deposit{value: cellarParams.amount0Desired}(); IERC20(token1).safeTransferFrom( msg.sender, address(this), cellarParams.amount1Desired ); } else { require(token1 == WETH, "Not Eth Pair"); if (msg.value > cellarParams.amount1Desired) { payable(msg.sender).transfer( msg.value - cellarParams.amount1Desired ); } else { require( msg.value == cellarParams.amount1Desired, "Eth not enough" ); } IWETH(WETH).deposit{value: cellarParams.amount1Desired}(); IERC20(token0).safeTransferFrom( msg.sender, address(this), cellarParams.amount0Desired ); } ( uint256 inAmount0, uint256 inAmount1, uint128 liquidityBefore, uint128 liquiditySum ) = _addLiquidity(cellarParams); if (liquidityBefore == 0) { _mint(msg.sender, liquiditySum); } else { _mint( msg.sender, FullMath.mulDiv(liquiditySum, _totalSupply, liquidityBefore) ); } require(inAmount0 >= cellarParams.amount0Min, "Less than Amount0Min"); require(inAmount1 >= cellarParams.amount1Min, "Less than Amount1Min"); uint256 retAmount0 = cellarParams.amount0Desired.sub(inAmount0); uint256 retAmount1 = cellarParams.amount1Desired.sub(inAmount1); if (retAmount0 > 0) { if (token0 == WETH) { IWETH(WETH).withdraw(retAmount0); msg.sender.transfer(retAmount0); } else { IERC20(token0).safeTransfer(msg.sender, retAmount0); } } if (retAmount1 > 0) { if (token1 == WETH) { IWETH(WETH).withdraw(retAmount1); msg.sender.transfer(retAmount1); } else { IERC20(token1).safeTransfer(msg.sender, retAmount1); } } emit AddedLiquidity(token0, token1, liquiditySum, inAmount0, inAmount1); } function removeLiquidityEthFromUniV3( CellarRemoveParams calldata cellarParams ) external override nonReentrant { (uint256 outAmount0, uint256 outAmount1, uint128 liquiditySum) = _removeLiquidity(cellarParams); _burn(msg.sender, cellarParams.tokenAmount); require(outAmount0 >= cellarParams.amount0Min, "Less than Amount0Min"); require(outAmount1 >= cellarParams.amount1Min, "Less than Amount1Min"); if (token0 == WETH) { IWETH(WETH).withdraw(outAmount0); msg.sender.transfer(outAmount0); IERC20(token1).safeTransfer(msg.sender, outAmount1); } else { require(token1 == WETH, "Not Eth Pair"); IWETH(WETH).withdraw(outAmount1); msg.sender.transfer(outAmount1); IERC20(token0).safeTransfer(msg.sender, outAmount0); } emit RemovedLiquidity( token0, token1, liquiditySum, outAmount0, outAmount1 ); } function removeLiquidityFromUniV3(CellarRemoveParams calldata cellarParams) external override { (uint256 outAmount0, uint256 outAmount1, uint128 liquiditySum) = _removeLiquidity(cellarParams); _burn(msg.sender, cellarParams.tokenAmount); require(outAmount0 >= cellarParams.amount0Min, "Less than Amount0Min"); require(outAmount1 >= cellarParams.amount1Min, "Less than Amount1Min"); IERC20(token0).safeTransfer(msg.sender, outAmount0); IERC20(token1).safeTransfer(msg.sender, outAmount1); emit RemovedLiquidity( token0, token1, liquiditySum, outAmount0, outAmount1 ); } function reinvest() external override onlyValidator { CellarTickInfo[] memory _cellarTickInfo = cellarTickInfo; uint256 weightSum; uint256 balance0; uint256 balance1; for (uint256 index = 0; index < _cellarTickInfo.length; index++) { require(_cellarTickInfo[index].tokenId != 0, "NFLP doesnot exist"); weightSum += _cellarTickInfo[index].weight; (uint256 amount0, uint256 amount1) = INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).collect( INonfungiblePositionManager.CollectParams({ tokenId: _cellarTickInfo[index].tokenId, recipient: address(this), amount0Max: type(uint128).max, amount1Max: type(uint128).max }) ); balance0 += amount0; balance1 += amount1; } uint256 fee0 = (balance0 * fee) / FEEDOMINATOR; uint256 fee1 = (balance1 * fee) / FEEDOMINATOR; if (fee0 > 0) { IERC20(token0).safeTransfer(_owner, fee0); } if (fee1 > 0) { IERC20(token1).safeTransfer(_owner, fee1); } balance0 = IERC20(token0).balanceOf(address(this)); balance1 = IERC20(token1).balanceOf(address(this)); (uint256 inAmount0, uint256 inAmount1, , ) = _addLiquidity( CellarAddParams({ amount0Desired: balance0, amount1Desired: balance1, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: type(uint256).max }) ); balance0 -= inAmount0; balance1 -= inAmount1; if (balance0 > balance1 && balance0 > 2) { IERC20(token0).safeApprove(SWAPROUTER, balance0 / 2); try ISwapRouter(SWAPROUTER).exactInputSingle( ISwapRouter.ExactInputSingleParams({ tokenIn: token0, tokenOut: token1, fee: feeLevel, recipient: address(this), deadline: type(uint256).max, amountIn: balance0 / 2, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }) ) {} catch {} IERC20(token0).safeApprove(SWAPROUTER, 0); } else if (balance1 > 2) { IERC20(token1).safeApprove(SWAPROUTER, balance1 / 2); try ISwapRouter(SWAPROUTER).exactInputSingle( ISwapRouter.ExactInputSingleParams({ tokenIn: token1, tokenOut: token0, fee: feeLevel, recipient: address(this), deadline: type(uint256).max, amountIn: balance1 / 2, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }) ) {} catch {} IERC20(token1).safeApprove(SWAPROUTER, 0); } balance0 = IERC20(token0).balanceOf(address(this)); balance1 = IERC20(token1).balanceOf(address(this)); _addLiquidity( CellarAddParams({ amount0Desired: balance0, amount1Desired: balance1, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: type(uint256).max }) ); } function rebalance(CellarTickInfo[] memory _cellarTickInfo) external { require(msg.sender == _owner, "Not owner"); CellarRemoveParams memory removeParams = CellarRemoveParams({ tokenAmount: _totalSupply, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: type(uint256).max }); _removeLiquidity(removeParams); CellarTickInfo[] memory _oldCellarTickInfo = cellarTickInfo; for (uint256 i = 0; i < _oldCellarTickInfo.length; i++) { INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).burn( _oldCellarTickInfo[i].tokenId ); } delete cellarTickInfo; for (uint256 i = 0; i < _cellarTickInfo.length; i++) { require(_cellarTickInfo[i].tickUpper > _cellarTickInfo[i].tickLower, "Wrong tick tier"); if (i > 0) { require(_cellarTickInfo[i].tickUpper <= _cellarTickInfo[i - 1].tickLower, "Wrong tick tier"); } require(_cellarTickInfo[i].weight > 0, "Weight cannot be zero"); require(_cellarTickInfo[i].tokenId == 0, "tokenId is not empty"); cellarTickInfo.push(_cellarTickInfo[i]); } uint256 balance0 = IERC20(token0).balanceOf(address(this)); uint256 balance1 = IERC20(token1).balanceOf(address(this)); (uint256 inAmount0, uint256 inAmount1, , ) = _addLiquidity( CellarAddParams({ amount0Desired: balance0, amount1Desired: balance1, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: type(uint256).max }) ); balance0 -= inAmount0; balance1 -= inAmount1; if (balance0 > balance1 && balance0 > 2) { IERC20(token0).safeApprove(SWAPROUTER, balance0 / 2); try ISwapRouter(SWAPROUTER).exactInputSingle( ISwapRouter.ExactInputSingleParams({ tokenIn: token0, tokenOut: token1, fee: feeLevel, recipient: address(this), deadline: type(uint256).max, amountIn: balance0 / 2, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }) ) {} catch {} IERC20(token0).safeApprove(SWAPROUTER, 0); } else if (balance1 > 2) { IERC20(token1).safeApprove(SWAPROUTER, balance1 / 2); try ISwapRouter(SWAPROUTER).exactInputSingle( ISwapRouter.ExactInputSingleParams({ tokenIn: token1, tokenOut: token0, fee: feeLevel, recipient: address(this), deadline: type(uint256).max, amountIn: balance1 / 2, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }) ) {} catch {} IERC20(token1).safeApprove(SWAPROUTER, 0); } balance0 = IERC20(token0).balanceOf(address(this)); balance1 = IERC20(token1).balanceOf(address(this)); _addLiquidity( CellarAddParams({ amount0Desired: balance0, amount1Desired: balance1, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: type(uint256).max }) ); } function setValidator(address _validator, bool value) external override { require(msg.sender == _owner, "Not owner"); validator[_validator] = value; } function transferOwnership(address newOwner) external override { require(msg.sender == _owner, "Not owner"); _owner = newOwner; } function setFee(uint16 newFee) external override { require(msg.sender == _owner, "Not owner"); fee = newFee; } function owner() external view override returns (address) { return _owner; } function name() external view override returns (string memory) { return _name; } function symbol() external view override returns (string memory) { return _symbol; } function decimals() external pure override returns (uint8) { return 18; } function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address account) external view override returns (uint256) { return _balances[account]; } function allowance(address owner_, address spender) external view override returns (uint256) { return _allowances[owner_][spender]; } function _transfer( address sender, address recipient, uint256 amount ) internal { require(sender != address(0), "transfer from zero address"); require(recipient != address(0), "transfer to zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "transfer exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal { require(account != address(0), "mint to zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal { require(account != address(0), "burn from zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "burn exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } function _approve( address owner_, address spender, uint256 amount ) internal { require(owner_ != address(0), "approve from zero address"); require(spender != address(0), "approve to zero address"); _allowances[owner_][spender] = amount; emit Approval(owner_, spender, amount); } function _getWeightInfo(CellarTickInfo[] memory _cellarTickInfo) internal view returns ( uint256 weightSum0, uint256 weightSum1, uint128 liquidityBefore, uint256[] memory weight0, uint256[] memory weight1 ) { weight0 = new uint256[](_cellarTickInfo.length); weight1 = new uint256[](_cellarTickInfo.length); (uint160 sqrtPriceX96, int24 currentTick, , , , , ) = IUniswapV3Pool( IUniswapV3Factory(UNISWAPV3FACTORY).getPool( token0, token1, feeLevel ) ) .slot0(); UintPair memory sqrtPrice0; uint256 weight00; uint256 weight10; sqrtPrice0.a = TickMath.getSqrtRatioAtTick( _cellarTickInfo[0].tickLower ); sqrtPrice0.b = TickMath.getSqrtRatioAtTick( _cellarTickInfo[0].tickUpper ); weight00 = _cellarTickInfo[0].weight; weight10 = _cellarTickInfo[_cellarTickInfo.length - 1].weight; for (uint16 i = 0; i < _cellarTickInfo.length; i++) { if (_cellarTickInfo[i].tokenId > 0) { (, , , , , , , uint128 liquidity, , , , ) = INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER) .positions(_cellarTickInfo[i].tokenId); liquidityBefore += liquidity; } UintPair memory sqrtCurrentTickPriceX96; sqrtCurrentTickPriceX96.a = TickMath.getSqrtRatioAtTick( _cellarTickInfo[i].tickLower ); sqrtCurrentTickPriceX96.b = TickMath.getSqrtRatioAtTick( _cellarTickInfo[i].tickUpper ); if (currentTick <= _cellarTickInfo[i].tickLower) { weight0[i] = (FullMath.mulDiv( FullMath.mulDiv( FullMath.mulDiv( sqrtPrice0.a, sqrtPrice0.b, sqrtPrice0.b - sqrtPrice0.a ), sqrtCurrentTickPriceX96.b - sqrtCurrentTickPriceX96.a, sqrtCurrentTickPriceX96.b ), FixedPoint96.Q96, sqrtCurrentTickPriceX96.a ) * _cellarTickInfo[i].weight) / weight00; weightSum0 += weight0[i]; } else if (currentTick >= _cellarTickInfo[i].tickUpper) { weight1[i] = (FullMath.mulDiv( sqrtCurrentTickPriceX96.b - sqrtCurrentTickPriceX96.a, FixedPoint96.Q96, sqrtPrice0.b - sqrtPrice0.a ) * _cellarTickInfo[i].weight) / weight10; weightSum1 += weight1[i]; } else { weight0[i] = (FullMath.mulDiv( FullMath.mulDiv( FullMath.mulDiv( sqrtPrice0.a, sqrtPrice0.b, sqrtPrice0.b - sqrtPrice0.a ), sqrtCurrentTickPriceX96.b - sqrtPriceX96, sqrtCurrentTickPriceX96.b ), FixedPoint96.Q96, sqrtPriceX96 ) * _cellarTickInfo[i].weight) / weight00; weight1[i] = (FullMath.mulDiv( sqrtPriceX96 - sqrtCurrentTickPriceX96.a, FixedPoint96.Q96, sqrtPrice0.b - sqrtPrice0.a ) * _cellarTickInfo[i].weight) / weight10; weightSum0 += weight0[i]; weightSum1 += weight1[i]; } } } function _modifyWeightInfo( CellarTickInfo[] memory _cellarTickInfo, uint256 amount0Desired, uint256 amount1Desired, uint256 weightSum0, uint256 weightSum1, uint256[] memory weight0, uint256[] memory weight1 ) internal view returns (uint256 newWeightSum0, uint256 newWeightSum1) { if (_cellarTickInfo.length == 1) { return (weightSum0, weightSum1); } UintPair memory liquidity; (uint160 sqrtPriceX96, , , , , , ) = IUniswapV3Pool( IUniswapV3Factory(UNISWAPV3FACTORY).getPool( token0, token1, feeLevel ) ) .slot0(); liquidity.a = LiquidityAmounts.getLiquidityForAmounts( sqrtPriceX96, TickMath.getSqrtRatioAtTick(_cellarTickInfo[0].tickLower), TickMath.getSqrtRatioAtTick(_cellarTickInfo[0].tickUpper), FullMath.mulDiv(amount0Desired, weight0[0], weightSum0), FullMath.mulDiv(amount1Desired, weight1[0], weightSum1) ); uint256 tickLength = _cellarTickInfo.length - 1; liquidity.b = LiquidityAmounts.getLiquidityForAmounts( sqrtPriceX96, TickMath.getSqrtRatioAtTick(_cellarTickInfo[tickLength].tickLower), TickMath.getSqrtRatioAtTick(_cellarTickInfo[tickLength].tickUpper), FullMath.mulDiv(amount0Desired, weight0[tickLength], weightSum0), FullMath.mulDiv(amount1Desired, weight1[tickLength], weightSum1) ); if ( liquidity.a * _cellarTickInfo[tickLength].weight > liquidity.b * _cellarTickInfo[0].weight ) { if (liquidity.b * _cellarTickInfo[0].weight > 0) { newWeightSum0 = FullMath.mulDiv( weightSum0, liquidity.a * _cellarTickInfo[tickLength].weight, liquidity.b * _cellarTickInfo[0].weight ); } else { newWeightSum0 = 0; } newWeightSum1 = weightSum1; } else { newWeightSum0 = weightSum0; if (liquidity.a * _cellarTickInfo[tickLength].weight > 0) { newWeightSum1 = FullMath.mulDiv( weightSum1, liquidity.b * _cellarTickInfo[0].weight, liquidity.a * _cellarTickInfo[tickLength].weight ); } else { newWeightSum1 = 0; } } } function _addLiquidity(CellarAddParams memory cellarParams) internal returns ( uint256 inAmount0, uint256 inAmount1, uint128 liquidityBefore, uint128 liquiditySum ) { CellarTickInfo[] memory _cellarTickInfo = cellarTickInfo; IERC20(token0).safeApprove( NONFUNGIBLEPOSITIONMANAGER, cellarParams.amount0Desired ); IERC20(token1).safeApprove( NONFUNGIBLEPOSITIONMANAGER, cellarParams.amount1Desired ); uint256 weightSum0; uint256 weightSum1; uint256[] memory weight0 = new uint256[](_cellarTickInfo.length); uint256[] memory weight1 = new uint256[](_cellarTickInfo.length); ( weightSum0, weightSum1, liquidityBefore, weight0, weight1 ) = _getWeightInfo(_cellarTickInfo); if (weightSum0 > 0 && weightSum1 > 0) { (weightSum0, weightSum1) = _modifyWeightInfo( _cellarTickInfo, cellarParams.amount0Desired, cellarParams.amount1Desired, weightSum0, weightSum1, weight0, weight1 ); } for (uint16 i = 0; i < _cellarTickInfo.length; i++) { INonfungiblePositionManager.MintParams memory mintParams = INonfungiblePositionManager.MintParams({ token0: token0, token1: token1, fee: feeLevel, tickLower: _cellarTickInfo[i].tickLower, tickUpper: _cellarTickInfo[i].tickUpper, amount0Desired: 0, amount1Desired: 0, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: cellarParams.deadline }); INonfungiblePositionManager.IncreaseLiquidityParams memory increaseLiquidityParams = INonfungiblePositionManager.IncreaseLiquidityParams({ tokenId: _cellarTickInfo[i].tokenId, amount0Desired: 0, amount1Desired: 0, amount0Min: 0, amount1Min: 0, deadline: cellarParams.deadline }); if (weightSum0 > 0) { mintParams.amount0Desired = FullMath.mulDiv( cellarParams.amount0Desired, weight0[i], weightSum0 ); increaseLiquidityParams.amount0Desired = mintParams .amount0Desired; mintParams.amount0Min = FullMath.mulDiv( cellarParams.amount0Min, weight0[i], weightSum0 ); increaseLiquidityParams.amount0Min = mintParams.amount0Min; } if (weightSum1 > 0) { mintParams.amount1Desired = FullMath.mulDiv( cellarParams.amount1Desired, weight1[i], weightSum1 ); increaseLiquidityParams.amount1Desired = mintParams .amount1Desired; mintParams.amount1Min = FullMath.mulDiv( cellarParams.amount1Min, weight1[i], weightSum1 ); increaseLiquidityParams.amount1Min = mintParams.amount1Min; } if ( mintParams.amount0Desired > 0 || mintParams.amount1Desired > 0 ) { MintResult memory mintResult; if (_cellarTickInfo[i].tokenId == 0) { try INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER) .mint(mintParams) returns (uint256 r1, uint128 r2, uint256 r3, uint256 r4) { mintResult.tokenId = r1; mintResult.liquidity = r2; mintResult.amount0 = r3; mintResult.amount1 = r4; } catch {} cellarTickInfo[i].tokenId = uint184(mintResult.tokenId); inAmount0 += mintResult.amount0; inAmount1 += mintResult.amount1; liquiditySum += mintResult.liquidity; } else { try INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER) .increaseLiquidity(increaseLiquidityParams) returns (uint128 r1, uint256 r2, uint256 r3) { mintResult.liquidity = r1; mintResult.amount0 = r2; mintResult.amount1 = r3; } catch {} inAmount0 += mintResult.amount0; inAmount1 += mintResult.amount1; liquiditySum += mintResult.liquidity; } } } IERC20(token0).safeApprove(NONFUNGIBLEPOSITIONMANAGER, 0); IERC20(token1).safeApprove(NONFUNGIBLEPOSITIONMANAGER, 0); } function _removeLiquidity(CellarRemoveParams memory cellarParams) internal returns ( uint256 outAmount0, uint256 outAmount1, uint128 liquiditySum ) { CellarTickInfo[] memory _cellarTickInfo = cellarTickInfo; uint256 fee0; uint256 fee1; for (uint16 i = 0; i < _cellarTickInfo.length; i++) { (, , , , , , , uint128 liquidity, , , , ) = INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER) .positions(_cellarTickInfo[i].tokenId); uint128 outLiquidity = uint128( FullMath.mulDiv( liquidity, cellarParams.tokenAmount, _totalSupply ) ); INonfungiblePositionManager.DecreaseLiquidityParams memory decreaseLiquidityParams = INonfungiblePositionManager.DecreaseLiquidityParams({ tokenId: _cellarTickInfo[i].tokenId, liquidity: outLiquidity, amount0Min: 0, amount1Min: 0, deadline: cellarParams.deadline }); (uint256 amount0, uint256 amount1) = INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER) .decreaseLiquidity(decreaseLiquidityParams); (uint256 collectAmount0, uint256 collectAmount1) = INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).collect( INonfungiblePositionManager.CollectParams({ tokenId: _cellarTickInfo[i].tokenId, recipient: address(this), amount0Max: type(uint128).max, amount1Max: type(uint128).max }) ); fee0 += collectAmount0 - amount0; fee1 += collectAmount1 - amount1; outAmount0 += amount0; outAmount1 += amount1; liquiditySum += outLiquidity; } fee0 = (fee0 * fee) / FEEDOMINATOR; fee1 = (fee1 * fee) / FEEDOMINATOR; if (fee0 > 0) { IERC20(token0).safeTransfer(_owner, fee0); } if (fee1 > 0) { IERC20(token1).safeTransfer(_owner, fee1); } } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint24","name":"_feeLevel","type":"uint24"},{"components":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"internalType":"struct ICellarPoolShare.CellarTickInfo[]","name":"_cellarTickInfo","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"AddedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"RemovedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FEEDOMINATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NONFUNGIBLEPOSITIONMANAGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAPROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAPV3FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ICellarPoolShare.CellarAddParams","name":"cellarParams","type":"tuple"}],"name":"addLiquidityEthForUniV3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ICellarPoolShare.CellarAddParams","name":"cellarParams","type":"tuple"}],"name":"addLiquidityForUniV3","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cellarTickInfo","outputs":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeLevel","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"internalType":"struct ICellarPoolShare.CellarTickInfo[]","name":"_cellarTickInfo","type":"tuple[]"}],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ICellarPoolShare.CellarRemoveParams","name":"cellarParams","type":"tuple"}],"name":"removeLiquidityEthFromUniV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ICellarPoolShare.CellarRemoveParams","name":"cellarParams","type":"tuple"}],"name":"removeLiquidityFromUniV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newFee","type":"uint16"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526008805462ffff0019166203e8001790553480156200002257600080fd5b50604051620064cc380380620064cc83398101604081905262000045916200047d565b85516200005a90600590602089019062000304565b5084516200007090600690602088019062000304565b50826001600160a01b0316846001600160a01b031610620000ae5760405162461bcd60e51b8152600401620000a59062000655565b60405180910390fd5b6001600160601b0319606085811b821660805284901b1660a0526001600160e81b031960e883901b1660c05260005b8151811015620002e4576000828281518110620000f657fe5b60200260200101516060015162ffffff1611620001275760405162461bcd60e51b8152600401620000a590620006c3565b8181815181106200013457fe5b6020026020010151600001516001600160b81b03166000146200016b5760405162461bcd60e51b8152600401620000a5906200068c565b8015620001ce578160018203815181106200018257fe5b60200260200101516040015160020b8282815181106200019e57fe5b60200260200101516020015160020b1315620001ce5760405162461bcd60e51b8152600401620000a5906200062c565b6007604051806080016040528060006001600160b81b03168152602001848481518110620001f857fe5b60200260200101516020015160020b81526020018484815181106200021957fe5b60200260200101516040015160020b81526020018484815181106200023a57fe5b60209081029190910181015160609081015162ffffff90811690935284546001808201875560009687529583902085519101805493860151604087015196909301516001600160b81b03199094166001600160b81b039092169190911762ffffff60b81b1916600160b81b600293840b8616021762ffffff60d01b1916600160d01b9590920b841694909402176001600160e81b0316600160e81b919092160217905501620000dd565b5050600480546001600160a01b03191633179055506200071e9350505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200033c576000855562000387565b82601f106200035757805160ff191683800117855562000387565b8280016001018555821562000387579182015b82811115620003875782518255916020019190600101906200036a565b506200039592915062000399565b5090565b5b808211156200039557600081556001016200039a565b80516001600160a01b0381168114620003c857600080fd5b919050565b8051600281900b8114620003c857600080fd5b600082601f830112620003f1578081fd5b81516001600160401b038111156200040557fe5b60206200041b601f8301601f19168201620006fa565b82815285828487010111156200042f578384fd5b835b838110156200044e57858101830151828201840152820162000431565b838111156200045f57848385840101525b5095945050505050565b805162ffffff81168114620003c857600080fd5b60008060008060008060c0878903121562000496578182fd5b86516001600160401b0380821115620004ad578384fd5b620004bb8a838b01620003e0565b97506020890151915080821115620004d1578384fd5b620004df8a838b01620003e0565b9650620004ef60408a01620003b0565b9550620004ff60608a01620003b0565b94506200050f60808a0162000469565b935060a089015191508082111562000525578283fd5b818901915089601f83011262000539578283fd5b8151818111156200054657fe5b62000556602080830201620006fa565b80828252602082019150602085018d602060808602880101111562000579578687fd5b8695505b8386101562000619576080818f03121562000596578687fd5b604051608081018181108782111715620005ac57fe5b60405281516001600160b81b0381168114620005c6578889fd5b8152620005d660208301620003cd565b6020820152620005e960408301620003cd565b6040820152620005fc6060830162000469565b60608201528352600195909501946020909201916080016200057d565b5080955050505050509295509295509295565b6020808252600f908201526e2bb937b733903a34b1b5903a34b2b960891b604082015260600190565b60208082526015908201527f546f6b656e7320617265206e6f7420736f727465640000000000000000000000604082015260600190565b60208082526014908201527f746f6b656e4964206973206e6f7420656d707479000000000000000000000000604082015260600190565b60208082526015908201527f5765696768742063616e6e6f74206265207a65726f0000000000000000000000604082015260600190565b6040518181016001600160401b03811182821017156200071657fe5b604052919050565b60805160601c60a05160601c60c05160e81c615c1f620008ad60003980610c505280610e435280611c5a52806126b0528061287452806132795280613c5752806142a4525080610a795280610c215280610d915280610de55280610f20528061100c528061126d5280611296528061137152806114b552806114e5528061173252806117695280611aaf5280611b8f5280611bb85280611ec35280611ef1528061200c52806120dc528061243e528061251d5280612681528061281652806129515280612a3d5280612fbb52806130ec528061324a52806136aa5280613c35528061428252508061060f52806109ee5280610b9e5280610bf25280610d2d5280610e145280610f6d528061123952806112c0528061133b5280611471528061150f5280611625528061189652806119a05280611a805280611be25280611de85280611fe3528061203652806123fe528061247e5280612652528061278d5280612845528061299e5280612f7b52806130a1528061321b52806136675280613c1352806142605250615c1f6000f3fe6080604052600436106101d15760003560e01c80637cf134cb116100f7578063ad5c464811610095578063ddca3f4311610064578063ddca3f4314610502578063f2fde38b14610517578063fc2aaa4c14610537578063fdb5a03e1461054c576101d8565b8063ad5c4648146104a3578063cbd7be97146104b8578063d21220a7146104cd578063dd62ed3e146104e2576101d8565b80638eb5ab77116100d15780638eb5ab771461043957806395d89b411461044e578063a2d96f5f14610463578063a9059cbb14610483576101d8565b80637cf134cb146103e25780638da5cb5b146104045780638e00555314610419576101d8565b806323b872dd1161016f5780634623c91d1161013e5780634623c91d1461036d57806357a5a6fa1461038d57806370a08231146103af57806370e032b1146103cf576101d8565b806323b872dd146102eb578063276cd9201461030b578063313ce5671461032b57806333bc230a1461034d576101d8565b8063135d4f24116101ab578063135d4f2414610257578063157238661461027957806318160ddd146102a9578063223b3b7a146102cb576101d8565b806306fdde03146101dd578063095ea7b3146102085780630dfe168114610235576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b506101f2610561565b6040516101ff9190615366565b60405180910390f35b34801561021457600080fd5b50610228610223366004614dc0565b6105f7565b6040516101ff919061535b565b34801561024157600080fd5b5061024a61060d565b6040516101ff91906152c8565b34801561026357600080fd5b50610277610272366004614deb565b610631565b005b34801561028557600080fd5b50610299610294366004615122565b6110e2565b6040516101ff9493929190615a90565b3480156102b557600080fd5b506102be611131565b6040516101ff9190615acf565b3480156102d757600080fd5b506102286102e6366004614ce3565b611137565b3480156102f757600080fd5b50610228610306366004614d53565b61114c565b34801561031757600080fd5b50610277610326366004614fb0565b6111b7565b34801561033757600080fd5b50610340611329565b6040516101ff9190615ad8565b34801561035957600080fd5b50610277610368366004614f1e565b61132e565b34801561037957600080fd5b50610277610388366004614d93565b611579565b34801561039957600080fd5b506103a26115ce565b6040516101ff9190615a6d565b3480156103bb57600080fd5b506102be6103ca366004614ce3565b6115d4565b6102776103dd366004614f1e565b6115f3565b3480156103ee57600080fd5b506103f7611c58565b6040516101ff9190615abf565b34801561041057600080fd5b5061024a611c7c565b34801561042557600080fd5b50610277610434366004615066565b611c8b565b34801561044557600080fd5b5061024a611cd3565b34801561045a57600080fd5b506101f2611ce5565b34801561046f57600080fd5b5061027761047e366004614fb0565b611d46565b34801561048f57600080fd5b5061022861049e366004614dc0565b6120a9565b3480156104af57600080fd5b5061024a6120b6565b3480156104c457600080fd5b5061024a6120c8565b3480156104d957600080fd5b5061024a6120da565b3480156104ee57600080fd5b506102be6104fd366004614d1b565b6120fe565b34801561050e57600080fd5b506103a2612129565b34801561052357600080fd5b50610277610532366004614ce3565b612138565b34801561054357600080fd5b5061024a612184565b34801561055857600080fd5b5061027761219c565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b6000610604338484612b14565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6004546001600160a01b031633146106645760405162461bcd60e51b815260040161065b9061578e565b60405180910390fd5b6040805160a081018252600354815260006020820181905291810191909152306060820152600019608082015261069a81612bc8565b50505060006007805480602002602001604051908101604052809291908181526020016000905b8282101561073557600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff1660608201528252600190920191016106c1565b50505050905060005b81518110156107d657600080516020615bca8339815191526001600160a01b03166342966c6883838151811061077057fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016107989190615a7c565b600060405180830381600087803b1580156107b257600080fd5b505af11580156107c6573d6000803e3d6000fd5b50506001909201915061073e9050565b506107e360076000614c10565b60005b83518110156109d3578381815181106107fb57fe5b60200260200101516040015160020b84828151811061081657fe5b60200260200101516020015160020b136108425760405162461bcd60e51b815260040161065b90615407565b801561089f5783600182038151811061085757fe5b60200260200101516040015160020b84828151811061087257fe5b60200260200101516020015160020b131561089f5760405162461bcd60e51b815260040161065b90615407565b60008482815181106108ad57fe5b60200260200101516060015162ffffff16116108db5760405162461bcd60e51b815260040161065b90615816565b8381815181106108e757fe5b6020026020010151600001516001600160b81b031660001461091b5760405162461bcd60e51b815260040161065b906157e8565b600784828151811061092957fe5b60209081029190910181015182546001818101855560009485529383902082519101805493830151604084015160609094015162ffffff908116600160e81b026001600160e81b03600296870b8316600160d01b0262ffffff60d01b199490970b909216600160b81b0262ffffff60b81b196001600160b81b039096166001600160b81b0319909816979097179490941695909517169290921792909216919091179055016107e6565b506040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610a239030906004016152c8565b60206040518083038186803b158015610a3b57600080fd5b505afa158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a73919061513a565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ac391906152c8565b60206040518083038186803b158015610adb57600080fd5b505afa158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b13919061513a565b9050600080610b5a6040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b505091509150818403935080830392508284118015610b795750600284115b15610d6857610bc7600080516020615baa8339815191526002865b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190046136ec565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff168152602001306001600160a01b03168152602001600019815260200160028881610c9a57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b168152610ccb91906004016158f1565b602060405180830381600087803b158015610ce557600080fd5b505af1925050508015610d15575060408051601f3d908101601f19168201909252610d129181019061513a565b60015b610d1e57610d20565b505b610d636001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615baa83398151915260006136ec565b610f56565b6002831115610f5657610dba600080516020615baa8339815191526002855b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190046136ec565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff168152602001306001600160a01b03168152602001600019815260200160028781610e8d57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b168152610ebe91906004016158f1565b602060405180830381600087803b158015610ed857600080fd5b505af1925050508015610f08575060408051601f3d908101601f19168201909252610f059181019061513a565b60015b610f1157610f13565b505b610f566001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615baa83398151915260006136ec565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610fa29030906004016152c8565b60206040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff2919061513a565b6040516370a0823160e01b81529094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906110419030906004016152c8565b60206040518083038186803b15801561105957600080fd5b505afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611091919061513a565b92506110d56040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b5050505050505050505050565b600781815481106110f257600080fd5b6000918252602090912001546001600160b81b0381169150600160b81b8104600290810b91600160d01b810490910b90600160e81b900462ffffff1684565b60035490565b60026020526000908152604090205460ff1681565b60006111598484846137eb565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561119d5760405162461bcd60e51b815260040161065b90615546565b6111aa8533858403612b14565b60019150505b9392505050565b600080806111d26111cd36869003860186614fc1565b612bc8565b919450925090506111e43385356138d9565b83602001358310156112085760405162461bcd60e51b815260040161065b90615460565b836040013582101561122c5760405162461bcd60e51b815260040161065b9061561f565b6112606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338561399c565b6112946001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338461399c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167ff56fda5b6bb8f75f807e6a868835d0a42a72be51a6f15fd874acdd3cbe3087df83868660405161131b93929190615a4c565b60405180910390a350505050565b601290565b6113646001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084356139bb565b61139d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333060208501356139bb565b60008080806113b96113b436879003870187614f35565b612fee565b9350935093509350816001600160801b0316600014156113eb576113e633826001600160801b03166139e2565b611413565b6114133361140e836001600160801b0316600354866001600160801b0316613a75565b6139e2565b84604001358410156114375760405162461bcd60e51b815260040161065b90615460565b846060013583101561145b5760405162461bcd60e51b815260040161065b9061561f565b843584101561149c5761149c6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633873587900361399c565b82856020013511156114e3576114e36001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633602088013586900361399c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167ff1cc7b6dd2da0338fc327ee7647aeb5e744f007a5bbf0628a0033c6b5ffaf0be83878760405161156a93929190615a4c565b60405180910390a35050505050565b6004546001600160a01b031633146115a35760405162461bcd60e51b815260040161065b9061578e565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b61271081565b6001600160a01b0381166000908152602081905260409020545b919050565b60085460ff16156116165760405162461bcd60e51b815260040161065b9061557d565b6008805460ff191660011790557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615b8a83398151915214156117675780353411156116a05760405133908235340380156108fc02916000818181858888f1935050505015801561169a573d6000803e3d6000fd5b506116c0565b348135146116c05760405162461bcd60e51b815260040161065b906155a5565b600080516020615b8a8339815191526001600160a01b031663d0e30db082600001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b506117629350506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691503390503060208501356139bb565b6118c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615b8a833981519152146117bd5760405162461bcd60e51b815260040161065b90615845565b80602001353411156118015760405133906020830135340380156108fc02916000818181858888f193505050501580156117fb573d6000803e3d6000fd5b50611824565b806020013534146118245760405162461bcd60e51b815260040161065b906155a5565b600080516020615b8a8339815191526001600160a01b031663d0e30db082602001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561187157600080fd5b505af1158015611885573d6000803e3d6000fd5b506118c39350506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691503390503084356139bb565b60008080806118da6113b436879003870187614f35565b9350935093509350816001600160801b03166000141561190c5761190733826001600160801b03166139e2565b61192f565b61192f3361140e836001600160801b0316600354866001600160801b0316613a75565b84604001358410156119535760405162461bcd60e51b815260040161065b90615460565b84606001358310156119775760405162461bcd60e51b815260040161065b9061561f565b6000611984863586613b24565b90506000611996602088013586613b24565b90508115611aa7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615b8a8339815191521415611a7357604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611a0e908590600401615acf565b600060405180830381600087803b158015611a2857600080fd5b505af1158015611a3c573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f19350505050158015611a6d573d6000803e3d6000fd5b50611aa7565b611aa76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338461399c565b8015611bb6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615b8a8339815191521415611b8257604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611b1d908490600401615acf565b600060405180830381600087803b158015611b3757600080fd5b505af1158015611b4b573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015611b7c573d6000803e3d6000fd5b50611bb6565b611bb66001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361399c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167ff1cc7b6dd2da0338fc327ee7647aeb5e744f007a5bbf0628a0033c6b5ffaf0be858989604051611c3d93929190615a4c565b60405180910390a350506008805460ff191690555050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6004546001600160a01b031690565b6004546001600160a01b03163314611cb55760405162461bcd60e51b815260040161065b9061578e565b6008805461ffff9092166101000262ffff0019909216919091179055565b600080516020615bca83398151915281565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ed5780601f106105c2576101008083540402835291602001916105ed565b60085460ff1615611d695760405162461bcd60e51b815260040161065b9061557d565b6008805460ff1916600117905560008080611d8c6111cd36869003860186614fc1565b91945092509050611d9e3385356138d9565b8360200135831015611dc25760405162461bcd60e51b815260040161065b90615460565b8360400135821015611de65760405162461bcd60e51b815260040161065b9061561f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615b8a8339815191521415611eef57604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611e56908690600401615acf565b600060405180830381600087803b158015611e7057600080fd5b505af1158015611e84573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015611eb5573d6000803e3d6000fd5b50611eea6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338461399c565b61200a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615b8a83398151915214611f455760405162461bcd60e51b815260040161065b90615845565b604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611f76908590600401615acf565b600060405180830381600087803b158015611f9057600080fd5b505af1158015611fa4573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f19350505050158015611fd5573d6000803e3d6000fd5b5061200a6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338561399c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167ff56fda5b6bb8f75f807e6a868835d0a42a72be51a6f15fd874acdd3cbe3087df83868660405161209193929190615a4c565b60405180910390a350506008805460ff191690555050565b60006106043384846137eb565b600080516020615b8a83398151915281565b600080516020615baa83398151915281565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854610100900461ffff1681565b6004546001600160a01b031633146121625760405162461bcd60e51b815260040161065b9061578e565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b731f98431c8ad98523631ae4a59f267346ea31f98481565b3360009081526002602052604090205460ff166121cb5760405162461bcd60e51b815260040161065b9061548e565b60006007805480602002602001604051908101604052809291908181526020016000905b8282101561226357600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff1660608201528252600190920191016121ef565b505050509050600080600080600090505b84518110156123cb5784818151811061228957fe5b6020026020010151600001516001600160b81b0316600014156122be5760405162461bcd60e51b815260040161065b906154b5565b8481815181106122ca57fe5b60200260200101516060015162ffffff1684019350600080600080516020615bca8339815191526001600160a01b031663fc6f786560405180608001604052808a878151811061231657fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b168152612368919060040161586b565b6040805180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b9919061518d565b95019493909301925050600101612274565b5060085461271061010090910461ffff168381028290049190830204811561242757600454612427906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168461399c565b801561246757600454612467906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361399c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906124b39030906004016152c8565b60206040518083038186803b1580156124cb57600080fd5b505afa1580156124df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612503919061513a565b6040516370a0823160e01b81529094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906125529030906004016152c8565b60206040518083038186803b15801561256a57600080fd5b505afa15801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a2919061513a565b92506000806125e96040518060c001604052808881526020018781526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b5050915091508186039550808503945084861180156126085750600286115b156127c857612627600080516020615baa833981519152600288610b94565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff168152602001306001600160a01b03168152602001600019815260200160028a816126fa57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b16815261272b91906004016158f1565b602060405180830381600087803b15801561274557600080fd5b505af1925050508015612775575060408051601f3d908101601f191682019092526127729181019061513a565b60015b61277e57612780565b505b6127c36001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615baa83398151915260006136ec565b612987565b6002851115612987576127eb600080516020615baa833981519152600287610d87565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff168152602001306001600160a01b031681526020016000198152602001600289816128be57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b1681526128ef91906004016158f1565b602060405180830381600087803b15801561290957600080fd5b505af1925050508015612939575060408051601f3d908101601f191682019092526129369181019061513a565b60015b61294257612944565b505b6129876001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615baa83398151915260006136ec565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906129d39030906004016152c8565b60206040518083038186803b1580156129eb57600080fd5b505afa1580156129ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a23919061513a565b6040516370a0823160e01b81529096506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612a729030906004016152c8565b60206040518083038186803b158015612a8a57600080fd5b505afa158015612a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac2919061513a565b9450612b066040518060c001604052808881526020018781526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b505050505050505050505050565b6001600160a01b038316612b3a5760405162461bcd60e51b815260040161065b90615399565b6001600160a01b038216612b605760405162461bcd60e51b815260040161065b90615684565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612bbb908590615acf565b60405180910390a3505050565b6000806000806007805480602002602001604051908101604052809291908181526020016000905b82821015612c6457600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101612bf0565b50505050905060008060005b83518161ffff161015612f47576000600080516020615bca8339815191526001600160a01b03166399fbab88868461ffff1681518110612cac57fe5b6020026020010151600001516040518263ffffffff1660e01b8152600401612cd49190615a7c565b6101806040518083038186803b158015612ced57600080fd5b505afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2591906151b0565b505050509750505050505050506000612d4e826001600160801b03168b60000151600354613a75565b905060006040518060a00160405280888661ffff1681518110612d6d57fe5b6020026020010151600001516001600160b81b03168152602001836001600160801b0316815260200160008152602001600081526020018c608001518152509050600080600080516020615bca8339815191526001600160a01b0316630c49ccbe846040518263ffffffff1660e01b8152600401612deb91906158ae565b6040805180830381600087803b158015612e0457600080fd5b505af1158015612e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3c919061518d565b91509150600080600080516020615bca8339815191526001600160a01b031663fc6f786560405180608001604052808e8c61ffff1681518110612e7b57fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b168152612ecd919060040161586b565b6040805180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1e919061518d565b9e85019e9d84019d9c9096019b9390950398909801975090039490940193505050600101612c70565b5060085461271061010090910461ffff169283028190049291909102048115612fa457600454612fa4906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168461399c565b8015612fe457600454612fe4906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361399c565b5050509193909250565b60008060008060006007805480602002602001604051908101604052809291908181526020016000905b8282101561308c57600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101613018565b505088519293506130d9926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250600080516020615bca83398151915291506136ec565b6020860151613122906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690600080516020615bca833981519152906136ec565b6000806000835167ffffffffffffffff8111801561313f57600080fd5b50604051908082528060200260200182016040528015613169578160200160208202803683370190505b5090506000845167ffffffffffffffff8111801561318657600080fd5b506040519080825280602002602001820160405280156131b0578160200160208202803683370190505b5090506131bc85613b4c565b919a50929650909450909250905083158015906131d95750600083115b156131fb576131f5858b600001518c602001518787878761420f565b90945092505b60005b85518161ffff1610156136595760006040518061016001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff168152602001888461ffff16815181106132b257fe5b60200260200101516040015160020b8152602001888461ffff16815181106132d657fe5b60200260200101516020015160020b815260200160008152602001600081526020016000815260200160008152602001306001600160a01b031681526020018d60a00151815250905060006040518060c00160405280898561ffff168151811061333c57fe5b6020026020010151600001516001600160b81b03168152602001600081526020016000815260200160008152602001600081526020018e60a00151815250905060008711156133e0576133ab8d60000151868561ffff168151811061339d57fe5b602002602001015189613a75565b60a08301819052602082015260408d015185516133d39190879061ffff871690811061339d57fe5b60e0830181905260608201525b85156134425761340c8d60200151858561ffff16815181106133fe57fe5b602002602001015188613a75565b60c08301819052604082015260608d015184516134349190869061ffff87169081106133fe57fe5b610100830181905260808201525b60008260a001511180613459575060008260c00151115b1561364f57613466614c31565b888461ffff168151811061347657fe5b6020026020010151600001516001600160b81b03166000141561359257604051634418b22b60e11b8152600080516020615bca833981519152906388316456906134c490869060040161599e565b608060405180830381600087803b1580156134de57600080fd5b505af192505050801561350e575060408051601f3d908101601f1916820190925261350b91810190615152565b60015b61351757613535565b9284526001600160801b039091166020840152604083015260608201525b80516007805461ffff871690811061354957fe5b60009182526020918290200180546001600160b81b0319166001600160b81b03939093169290921790915560408201516060830151918301519e019d9c019b999099019861364d565b60405163219f5d1760e01b8152600080516020615bca8339815191529063219f5d17906135c390859060040161595a565b606060405180830381600087803b1580156135dd57600080fd5b505af192505050801561360d575060408051601f3d908101601f1916820190925261360a91810190615032565b60015b61361657613631565b6001600160801b039092166020840152604083015260608201525b80604001518d019c5080606001518c019b5080602001518a0199505b505b50506001016131fe565b5061369d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615bca83398151915260006136ec565b6136e06001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615bca83398151915260006136ec565b50505050509193509193565b8015806137745750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061372290309086906004016152dc565b60206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613772919061513a565b155b6137905760405162461bcd60e51b815260040161065b90615720565b6137e68363095ea7b360e01b84846040516024016137af929190615342565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526145d8565b505050565b6001600160a01b0383166138115760405162461bcd60e51b815260040161065b906153d0565b6001600160a01b0382166138375760405162461bcd60e51b815260040161065b906155cd565b6138428383836137e6565b6001600160a01b0383166000908152602081905260409020548181101561387b5760405162461bcd60e51b815260040161065b9061564d565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061131b908690615acf565b6001600160a01b0382166138ff5760405162461bcd60e51b815260040161065b90615430565b61390b826000836137e6565b6001600160a01b038216600090815260208190526040902054818110156139445760405162461bcd60e51b815260040161065b906156bb565b6001600160a01b0383166000818152602081905260408082208585039055600380548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612bbb908690615acf565b6137e68363a9059cbb60e01b84846040516024016137af929190615342565b6139dc846323b872dd60e01b8585856040516024016137af9392919061531e565b50505050565b6001600160a01b038216613a085760405162461bcd60e51b815260040161065b90615518565b613a14600083836137e6565b60038054820190556001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a69908590615acf565b60405180910390a35050565b6000808060001985870986860292508281109083900303905080613aab5760008411613aa057600080fd5b5082900490506111b0565b808411613ab757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600082821115613b465760405162461bcd60e51b815260040161065b906154e1565b50900390565b6000806000606080855167ffffffffffffffff81118015613b6c57600080fd5b50604051908082528060200260200182016040528015613b96578160200160208202803683370190505b509150855167ffffffffffffffff81118015613bb157600080fd5b50604051908082528060200260200182016040528015613bdb578160200160208202803683370190505b50604051630b4c774160e11b81529091506000908190731f98431c8ad98523631ae4a59f267346ea31f98490631698ee8290613c7f907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906004016152f6565b60206040518083038186803b158015613c9757600080fd5b505afa158015613cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ccf9190614cff565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015613d0757600080fd5b505afa158015613d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d3f9190615082565b505050505091509150613d50614c62565b600080613d748b600081518110613d6357fe5b602002602001015160400151614667565b6001600160a01b031683528a51613da1908c90600090613d9057fe5b602002602001015160200151614667565b6001600160a01b031660208401528a518b90600090613dbc57fe5b60200260200101516060015162ffffff1691508a60018c510381518110613ddf57fe5b60200260200101516060015162ffffff16905060005b8b518161ffff1610156142005760008c8261ffff1681518110613e1457fe5b6020026020010151600001516001600160b81b03161115613eeb576000600080516020615bca8339815191526001600160a01b03166399fbab888e8461ffff1681518110613e5e57fe5b6020026020010151600001516040518263ffffffff1660e01b8152600401613e869190615a7c565b6101806040518083038186803b158015613e9f57600080fd5b505afa158015613eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed791906151b0565b50505050975050505050505050808a019950505b613ef3614c62565b613f068d8361ffff1681518110613d6357fe5b6001600160a01b031681528c51613f27908e9061ffff8516908110613d9057fe5b6001600160a01b031660208201528c518d9061ffff8416908110613f4757fe5b60200260200101516040015160020b8660020b1361400757838d8361ffff1681518110613f7057fe5b60200260200101516060015162ffffff16613fc1613fb4613fa489600001518a602001518b600001518c6020015103613a75565b8551602087015190810390613a75565b8451600160601b90613a75565b0281613fc957fe5b04898361ffff1681518110613fda57fe5b602002602001018181525050888261ffff1681518110613ff657fe5b60200260200101518c019b506141f7565b8c8261ffff168151811061401757fe5b60200260200101516020015160020b8660020b126140ba57828d8361ffff168151811061404057fe5b60200260200101516060015162ffffff166140748360000151846020015103600160601b89600001518a6020015103613a75565b028161407c57fe5b04888361ffff168151811061408d57fe5b602002602001018181525050878261ffff16815181106140a957fe5b60200260200101518b019a506141f7565b838d8361ffff16815181106140cb57fe5b60200260200101516060015162ffffff1661412a6141166140ff89600001518a602001518b600001518c6020015103613a75565b60208601516001600160a01b038d16810390613a75565b600160601b8b6001600160a01b0316613a75565b028161413257fe5b04898361ffff168151811061414357fe5b602002602001018181525050828d8361ffff168151811061416057fe5b60200260200101516060015162ffffff1661419983600001518a6001600160a01b031603600160601b89600001518a6020015103613a75565b02816141a157fe5b04888361ffff16815181106141b257fe5b602002602001018181525050888261ffff16815181106141ce57fe5b60200260200101518c019b50878261ffff16815181106141ea57fe5b60200260200101518b019a505b50600101613df5565b50505050505091939590929450565b6000808851600114156142265750849050836145cc565b61422e614c62565b604051630b4c774160e11b8152600090731f98431c8ad98523631ae4a59f267346ea31f98490631698ee82906142cc907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906004016152f6565b60206040518083038186803b1580156142e457600080fd5b505afa1580156142f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431c9190614cff565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561435457600080fd5b505afa158015614368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061438c9190615082565b50505050505090506143ed816143a88d600081518110613d6357fe5b6143b88e600081518110613d9057fe5b6143d78e8b6000815181106143c957fe5b60200260200101518e613a75565b6143e88e8b6000815181106143c957fe5b614980565b6001600160801b031682528a51600019810190614453908390614416908f9085908110613d6357fe5b6144258f8581518110613d9057fe5b6144438f8c878151811061443557fe5b60200260200101518f613a75565b6143e88f8c888151811061443557fe5b6001600160801b031660208401528b518c9060009061446e57fe5b60200260200101516060015162ffffff168360200151028c828151811061449157fe5b60200260200101516060015162ffffff16846000015102111561453e5760008c6000815181106144bd57fe5b60200260200101516060015162ffffff1684602001510211156145315761452a898d83815181106144ea57fe5b60200260200101516060015162ffffff168560000151028e60008151811061450e57fe5b60200260200101516060015162ffffff16866020015102613a75565b9450614536565b600094505b8793506145c8565b88945060008c828151811061454f57fe5b60200260200101516060015162ffffff1684600001510211156145c3576145bc888d60008151811061457d57fe5b60200260200101516060015162ffffff168560200151028e84815181106145a057fe5b60200260200101516060015162ffffff16866000015102613a75565b93506145c8565b600093505b5050505b97509795505050505050565b600061462d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a449092919063ffffffff16565b8051909150156137e6578080602001905181019061464b9190614f02565b6137e65760405162461bcd60e51b815260040161065b906156e9565b60008060008360020b1261467e578260020b614686565b8260020b6000035b9050620d89e88111156146ab5760405162461bcd60e51b815260040161065b90615604565b6000600182166146bf57600160801b6146d1565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615614705576ffff97272373d413259a46990580e213a0260801c5b6004821615614724576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615614743576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615614762576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615614781576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156147a0576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156147bf576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156147df576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156147ff576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561481f576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561483f576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161561485f576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561487f576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561489f576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156148bf576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156148e0576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614900576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561491f576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561493c576b048a170391f7dc42444e8fa20260801c5b60008460020b131561495757806000198161495357fe5b0490505b64010000000081061561496b57600161496e565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b031611156149a0579293925b846001600160a01b0316866001600160a01b0316116149cb576149c4858585614a5b565b9050614a3b565b836001600160a01b0316866001600160a01b03161015614a2d5760006149f2878686614a5b565b90506000614a01878986614abe565b9050806001600160801b0316826001600160801b031610614a225780614a24565b815b92505050614a3b565b614a38858584614abe565b90505b95945050505050565b6060614a538484600085614afb565b949350505050565b6000826001600160a01b0316846001600160a01b03161115614a7b579192915b6000614a9e856001600160a01b0316856001600160a01b0316600160601b613a75565b9050614a3b614ab984838888036001600160a01b0316613a75565b614bbb565b6000826001600160a01b0316846001600160a01b03161115614ade579192915b614a53614ab983600160601b8787036001600160a01b0316613a75565b606082471015614b1d5760405162461bcd60e51b815260040161065b90615757565b614b2685614bd1565b614b425760405162461bcd60e51b815260040161065b906157b1565b600080866001600160a01b03168587604051614b5e91906152ac565b60006040518083038185875af1925050503d8060008114614b9b576040519150601f19603f3d011682016040523d82523d6000602084013e614ba0565b606091505b5091509150614bb0828286614bd7565b979650505050505050565b806001600160801b03811681146115ee57600080fd5b3b151590565b60608315614be65750816111b0565b825115614bf65782518084602001fd5b8160405162461bcd60e51b815260040161065b9190615366565b5080546000825590600052602060002090810190614c2e9190614c7c565b50565b60405180608001604052806000815260200160006001600160801b0316815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b5b80821115614c915760008155600101614c7d565b5090565b80516115ee81615b36565b80356115ee81615b59565b80516115ee81615b59565b80516001600160801b03811681146115ee57600080fd5b80356115ee81615b78565b80516115ee81615b78565b600060208284031215614cf4578081fd5b81356111b081615b36565b600060208284031215614d10578081fd5b81516111b081615b36565b60008060408385031215614d2d578081fd5b8235614d3881615b36565b91506020830135614d4881615b36565b809150509250929050565b600080600060608486031215614d67578081fd5b8335614d7281615b36565b92506020840135614d8281615b36565b929592945050506040919091013590565b60008060408385031215614da5578182fd5b8235614db081615b36565b91506020830135614d4881615b4b565b60008060408385031215614dd2578182fd5b8235614ddd81615b36565b946020939093013593505050565b60006020808385031215614dfd578182fd5b823567ffffffffffffffff80821115614e14578384fd5b818501915085601f830112614e27578384fd5b813581811115614e3357fe5b614e408485830201615ae6565b818152848101908486016080808502870188018b1015614e5e578889fd5b8896505b84871015614ef35780828c031215614e78578889fd5b604080518281018181108982111715614e8d57fe5b825283356001600160b81b0381168114614ea5578b8cfd5b8152838a0135614eb481615b59565b818b0152614ec3848301614ca0565b8282015260609150614ed6828501614ccd565b918101919091528452600196909601959287019290810190614e62565b50909998505050505050505050565b600060208284031215614f13578081fd5b81516111b081615b4b565b600060c08284031215614f2f578081fd5b50919050565b600060c08284031215614f46578081fd5b60405160c0810181811067ffffffffffffffff82111715614f6357fe5b8060405250823581526020830135602082015260408301356040820152606083013560608201526080830135614f9881615b36565b608082015260a0928301359281019290925250919050565b600060a08284031215614f2f578081fd5b600060a08284031215614fd2578081fd5b60405160a0810181811067ffffffffffffffff82111715614fef57fe5b8060405250823581526020830135602082015260408301356040820152606083013561501a81615b36565b60608201526080928301359281019290925250919050565b600080600060608486031215615046578081fd5b61504f84614cb6565b925060208401519150604084015190509250925092565b600060208284031215615077578081fd5b81356111b081615b68565b600080600080600080600060e0888a03121561509c578485fd5b87516150a781615b36565b60208901519097506150b881615b59565b60408901519096506150c981615b68565b60608901519095506150da81615b68565b60808901519094506150eb81615b68565b60a089015190935060ff81168114615101578283fd5b60c089015190925061511281615b4b565b8091505092959891949750929550565b600060208284031215615133578081fd5b5035919050565b60006020828403121561514b578081fd5b5051919050565b60008060008060808587031215615167578182fd5b8451935061517760208601614cb6565b6040860151606090960151949790965092505050565b6000806040838503121561519f578182fd5b505080516020909101519092909150565b6000806000806000806000806000806000806101808d8f0312156151d2578586fd5b8c516bffffffffffffffffffffffff811681146151ed578687fd5b9b506151fb60208e01614c95565b9a5061520960408e01614c95565b995061521760608e01614c95565b985061522560808e01614cd8565b975061523360a08e01614cab565b965061524160c08e01614cab565b955061524f60e08e01614cb6565b94506101008d015193506101208d0151925061526e6101408e01614cb6565b915061527d6101608e01614cb6565b90509295989b509295989b509295989b565b6001600160a01b03169052565b60020b9052565b62ffffff169052565b600082516152be818460208701615b0a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082528251806020840152615385816040850160208701615b0a565b601f01601f19169190910160400192915050565b60208082526019908201527f617070726f76652066726f6d207a65726f206164647265737300000000000000604082015260600190565b6020808252601a908201527f7472616e736665722066726f6d207a65726f2061646472657373000000000000604082015260600190565b6020808252600f908201526e2bb937b733903a34b1b5903a34b2b960891b604082015260600190565b6020808252601690820152756275726e2066726f6d207a65726f206164647265737360501b604082015260600190565b6020808252601490820152732632b9b9903a3430b71020b6b7bab73a1826b4b760611b604082015260600190565b6020808252600d908201526c2737ba103b30b634b230ba37b960991b604082015260600190565b6020808252601290820152711391931408191bd95cdb9bdd08195e1a5cdd60721b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601490820152736d696e7420746f207a65726f206164647265737360601b604082015260600190565b6020808252601a908201527f7472616e73666572206578636565647320616c6c6f77616e6365000000000000604082015260600190565b6020808252600e908201526d1c99595b9d1c985b9d0818d85b1b60921b604082015260600190565b6020808252600e908201526d08ae8d040dcdee840cadcdeeaced60931b604082015260600190565b60208082526018908201527f7472616e7366657220746f207a65726f20616464726573730000000000000000604082015260600190565b6020808252600190820152601560fa1b604082015260600190565b6020808252601490820152732632b9b9903a3430b71020b6b7bab73a18a6b4b760611b604082015260600190565b60208082526018908201527f7472616e7366657220657863656564732062616c616e63650000000000000000604082015260600190565b60208082526017908201527f617070726f766520746f207a65726f2061646472657373000000000000000000604082015260600190565b6020808252601490820152736275726e20657863656564732062616c616e636560601b604082015260600190565b6020808252601f908201527f4552433230206f7065726174696f6e20646964206e6f74207375636365656400604082015260600190565b6020808252601c908201527f617070726f7665206e6f6e2d7a65726f20746f206e6f6e2d7a65726f00000000604082015260600190565b6020808252601d908201527f696e73756666696369656e742062616c616e636520666f722063616c6c000000604082015260600190565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b602080825260149082015273746f6b656e4964206973206e6f7420656d70747960601b604082015260600190565b6020808252601590820152745765696768742063616e6e6f74206265207a65726f60581b604082015260600190565b6020808252600c908201526b2737ba1022ba34102830b4b960a11b604082015260600190565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b600060a082019050825182526001600160801b03602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b6000610160820190506159b282845161528f565b60208301516159c4602084018261528f565b5060408301516159d760408401826152a3565b5060608301516159ea606084018261529c565b5060808301516159fd608084018261529c565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615a3b8285018261528f565b505061014092830151919092015290565b6001600160801b039390931683526020830191909152604082015260600190565b61ffff91909116815260200190565b6001600160b81b0391909116815260200190565b6001600160b81b03949094168452600292830b6020850152910b604083015262ffffff16606082015260800190565b62ffffff91909116815260200190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615b0257fe5b604052919050565b60005b83811015615b25578181015183820152602001615b0d565b838111156139dc5750506000910152565b6001600160a01b0381168114614c2e57600080fd5b8015158114614c2e57600080fd5b8060020b8114614c2e57600080fd5b61ffff81168114614c2e57600080fd5b62ffffff81168114614c2e57600080fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88a2646970667358221220ad84bd06f54db961ddb6ca46322547761e9824cb8eccf6e929a77810e682958864736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001f43656c6c617220506f6f6c2053686172652054657374204554482055534454000000000000000000000000000000000000000000000000000000000000000004435053540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9a0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf87400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf7c0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf65800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf5a4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf43c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf34cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf1e4000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf0f4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcef5000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcee60fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecbc0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode
0x6080604052600436106101d15760003560e01c80637cf134cb116100f7578063ad5c464811610095578063ddca3f4311610064578063ddca3f4314610502578063f2fde38b14610517578063fc2aaa4c14610537578063fdb5a03e1461054c576101d8565b8063ad5c4648146104a3578063cbd7be97146104b8578063d21220a7146104cd578063dd62ed3e146104e2576101d8565b80638eb5ab77116100d15780638eb5ab771461043957806395d89b411461044e578063a2d96f5f14610463578063a9059cbb14610483576101d8565b80637cf134cb146103e25780638da5cb5b146104045780638e00555314610419576101d8565b806323b872dd1161016f5780634623c91d1161013e5780634623c91d1461036d57806357a5a6fa1461038d57806370a08231146103af57806370e032b1146103cf576101d8565b806323b872dd146102eb578063276cd9201461030b578063313ce5671461032b57806333bc230a1461034d576101d8565b8063135d4f24116101ab578063135d4f2414610257578063157238661461027957806318160ddd146102a9578063223b3b7a146102cb576101d8565b806306fdde03146101dd578063095ea7b3146102085780630dfe168114610235576101d8565b366101d857005b600080fd5b3480156101e957600080fd5b506101f2610561565b6040516101ff9190615366565b60405180910390f35b34801561021457600080fd5b50610228610223366004614dc0565b6105f7565b6040516101ff919061535b565b34801561024157600080fd5b5061024a61060d565b6040516101ff91906152c8565b34801561026357600080fd5b50610277610272366004614deb565b610631565b005b34801561028557600080fd5b50610299610294366004615122565b6110e2565b6040516101ff9493929190615a90565b3480156102b557600080fd5b506102be611131565b6040516101ff9190615acf565b3480156102d757600080fd5b506102286102e6366004614ce3565b611137565b3480156102f757600080fd5b50610228610306366004614d53565b61114c565b34801561031757600080fd5b50610277610326366004614fb0565b6111b7565b34801561033757600080fd5b50610340611329565b6040516101ff9190615ad8565b34801561035957600080fd5b50610277610368366004614f1e565b61132e565b34801561037957600080fd5b50610277610388366004614d93565b611579565b34801561039957600080fd5b506103a26115ce565b6040516101ff9190615a6d565b3480156103bb57600080fd5b506102be6103ca366004614ce3565b6115d4565b6102776103dd366004614f1e565b6115f3565b3480156103ee57600080fd5b506103f7611c58565b6040516101ff9190615abf565b34801561041057600080fd5b5061024a611c7c565b34801561042557600080fd5b50610277610434366004615066565b611c8b565b34801561044557600080fd5b5061024a611cd3565b34801561045a57600080fd5b506101f2611ce5565b34801561046f57600080fd5b5061027761047e366004614fb0565b611d46565b34801561048f57600080fd5b5061022861049e366004614dc0565b6120a9565b3480156104af57600080fd5b5061024a6120b6565b3480156104c457600080fd5b5061024a6120c8565b3480156104d957600080fd5b5061024a6120da565b3480156104ee57600080fd5b506102be6104fd366004614d1b565b6120fe565b34801561050e57600080fd5b506103a2612129565b34801561052357600080fd5b50610277610532366004614ce3565b612138565b34801561054357600080fd5b5061024a612184565b34801561055857600080fd5b5061027761219c565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b6000610604338484612b14565b50600192915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b031633146106645760405162461bcd60e51b815260040161065b9061578e565b60405180910390fd5b6040805160a081018252600354815260006020820181905291810191909152306060820152600019608082015261069a81612bc8565b50505060006007805480602002602001604051908101604052809291908181526020016000905b8282101561073557600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff1660608201528252600190920191016106c1565b50505050905060005b81518110156107d657600080516020615bca8339815191526001600160a01b03166342966c6883838151811061077057fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016107989190615a7c565b600060405180830381600087803b1580156107b257600080fd5b505af11580156107c6573d6000803e3d6000fd5b50506001909201915061073e9050565b506107e360076000614c10565b60005b83518110156109d3578381815181106107fb57fe5b60200260200101516040015160020b84828151811061081657fe5b60200260200101516020015160020b136108425760405162461bcd60e51b815260040161065b90615407565b801561089f5783600182038151811061085757fe5b60200260200101516040015160020b84828151811061087257fe5b60200260200101516020015160020b131561089f5760405162461bcd60e51b815260040161065b90615407565b60008482815181106108ad57fe5b60200260200101516060015162ffffff16116108db5760405162461bcd60e51b815260040161065b90615816565b8381815181106108e757fe5b6020026020010151600001516001600160b81b031660001461091b5760405162461bcd60e51b815260040161065b906157e8565b600784828151811061092957fe5b60209081029190910181015182546001818101855560009485529383902082519101805493830151604084015160609094015162ffffff908116600160e81b026001600160e81b03600296870b8316600160d01b0262ffffff60d01b199490970b909216600160b81b0262ffffff60b81b196001600160b81b039096166001600160b81b0319909816979097179490941695909517169290921792909216919091179055016107e6565b506040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190610a239030906004016152c8565b60206040518083038186803b158015610a3b57600080fd5b505afa158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a73919061513a565b905060007f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ac391906152c8565b60206040518083038186803b158015610adb57600080fd5b505afa158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b13919061513a565b9050600080610b5a6040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b505091509150818403935080830392508284118015610b795750600284115b15610d6857610bc7600080516020615baa8339815191526002865b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216929190046136ec565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f0000000000000000000000000000000000000000000000000000000000000bb862ffffff168152602001306001600160a01b03168152602001600019815260200160028881610c9a57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b168152610ccb91906004016158f1565b602060405180830381600087803b158015610ce557600080fd5b505af1925050508015610d15575060408051601f3d908101601f19168201909252610d129181019061513a565b60015b610d1e57610d20565b505b610d636001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216600080516020615baa83398151915260006136ec565b610f56565b6002831115610f5657610dba600080516020615baa8339815191526002855b6001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716929190046136ec565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f0000000000000000000000000000000000000000000000000000000000000bb862ffffff168152602001306001600160a01b03168152602001600019815260200160028781610e8d57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b168152610ebe91906004016158f1565b602060405180830381600087803b158015610ed857600080fd5b505af1925050508015610f08575060408051601f3d908101601f19168201909252610f059181019061513a565b60015b610f1157610f13565b505b610f566001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716600080516020615baa83398151915260006136ec565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190610fa29030906004016152c8565b60206040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff2919061513a565b6040516370a0823160e01b81529094506001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716906370a08231906110419030906004016152c8565b60206040518083038186803b15801561105957600080fd5b505afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611091919061513a565b92506110d56040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b5050505050505050505050565b600781815481106110f257600080fd5b6000918252602090912001546001600160b81b0381169150600160b81b8104600290810b91600160d01b810490910b90600160e81b900462ffffff1684565b60035490565b60026020526000908152604090205460ff1681565b60006111598484846137eb565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561119d5760405162461bcd60e51b815260040161065b90615546565b6111aa8533858403612b14565b60019150505b9392505050565b600080806111d26111cd36869003860186614fc1565b612bc8565b919450925090506111e43385356138d9565b83602001358310156112085760405162461bcd60e51b815260040161065b90615460565b836040013582101561122c5760405162461bcd60e51b815260040161065b9061561f565b6112606001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216338561399c565b6112946001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716338461399c565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03167ff56fda5b6bb8f75f807e6a868835d0a42a72be51a6f15fd874acdd3cbe3087df83868660405161131b93929190615a4c565b60405180910390a350505050565b601290565b6113646001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333084356139bb565b61139d6001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716333060208501356139bb565b60008080806113b96113b436879003870187614f35565b612fee565b9350935093509350816001600160801b0316600014156113eb576113e633826001600160801b03166139e2565b611413565b6114133361140e836001600160801b0316600354866001600160801b0316613a75565b6139e2565b84604001358410156114375760405162461bcd60e51b815260040161065b90615460565b846060013583101561145b5760405162461bcd60e51b815260040161065b9061561f565b843584101561149c5761149c6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21633873587900361399c565b82856020013511156114e3576114e36001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec71633602088013586900361399c565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03167ff1cc7b6dd2da0338fc327ee7647aeb5e744f007a5bbf0628a0033c6b5ffaf0be83878760405161156a93929190615a4c565b60405180910390a35050505050565b6004546001600160a01b031633146115a35760405162461bcd60e51b815260040161065b9061578e565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b61271081565b6001600160a01b0381166000908152602081905260409020545b919050565b60085460ff16156116165760405162461bcd60e51b815260040161065b9061557d565b6008805460ff191660011790557f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600080516020615b8a83398151915214156117675780353411156116a05760405133908235340380156108fc02916000818181858888f1935050505015801561169a573d6000803e3d6000fd5b506116c0565b348135146116c05760405162461bcd60e51b815260040161065b906155a5565b600080516020615b8a8339815191526001600160a01b031663d0e30db082600001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b506117629350506001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec71691503390503060208501356139bb565b6118c3565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316600080516020615b8a833981519152146117bd5760405162461bcd60e51b815260040161065b90615845565b80602001353411156118015760405133906020830135340380156108fc02916000818181858888f193505050501580156117fb573d6000803e3d6000fd5b50611824565b806020013534146118245760405162461bcd60e51b815260040161065b906155a5565b600080516020615b8a8339815191526001600160a01b031663d0e30db082602001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561187157600080fd5b505af1158015611885573d6000803e3d6000fd5b506118c39350506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21691503390503084356139bb565b60008080806118da6113b436879003870187614f35565b9350935093509350816001600160801b03166000141561190c5761190733826001600160801b03166139e2565b61192f565b61192f3361140e836001600160801b0316600354866001600160801b0316613a75565b84604001358410156119535760405162461bcd60e51b815260040161065b90615460565b84606001358310156119775760405162461bcd60e51b815260040161065b9061561f565b6000611984863586613b24565b90506000611996602088013586613b24565b90508115611aa7577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600080516020615b8a8339815191521415611a7357604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611a0e908590600401615acf565b600060405180830381600087803b158015611a2857600080fd5b505af1158015611a3c573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f19350505050158015611a6d573d6000803e3d6000fd5b50611aa7565b611aa76001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216338461399c565b8015611bb6577f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316600080516020615b8a8339815191521415611b8257604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611b1d908490600401615acf565b600060405180830381600087803b158015611b3757600080fd5b505af1158015611b4b573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015611b7c573d6000803e3d6000fd5b50611bb6565b611bb66001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716338361399c565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03167ff1cc7b6dd2da0338fc327ee7647aeb5e744f007a5bbf0628a0033c6b5ffaf0be858989604051611c3d93929190615a4c565b60405180910390a350506008805460ff191690555050505050565b7f0000000000000000000000000000000000000000000000000000000000000bb881565b6004546001600160a01b031690565b6004546001600160a01b03163314611cb55760405162461bcd60e51b815260040161065b9061578e565b6008805461ffff9092166101000262ffff0019909216919091179055565b600080516020615bca83398151915281565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ed5780601f106105c2576101008083540402835291602001916105ed565b60085460ff1615611d695760405162461bcd60e51b815260040161065b9061557d565b6008805460ff1916600117905560008080611d8c6111cd36869003860186614fc1565b91945092509050611d9e3385356138d9565b8360200135831015611dc25760405162461bcd60e51b815260040161065b90615460565b8360400135821015611de65760405162461bcd60e51b815260040161065b9061561f565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600080516020615b8a8339815191521415611eef57604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611e56908690600401615acf565b600060405180830381600087803b158015611e7057600080fd5b505af1158015611e84573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015611eb5573d6000803e3d6000fd5b50611eea6001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716338461399c565b61200a565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316600080516020615b8a83398151915214611f455760405162461bcd60e51b815260040161065b90615845565b604051632e1a7d4d60e01b8152600080516020615b8a83398151915290632e1a7d4d90611f76908590600401615acf565b600060405180830381600087803b158015611f9057600080fd5b505af1158015611fa4573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f19350505050158015611fd5573d6000803e3d6000fd5b5061200a6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216338561399c565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03167ff56fda5b6bb8f75f807e6a868835d0a42a72be51a6f15fd874acdd3cbe3087df83868660405161209193929190615a4c565b60405180910390a350506008805460ff191690555050565b60006106043384846137eb565b600080516020615b8a83398151915281565b600080516020615baa83398151915281565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854610100900461ffff1681565b6004546001600160a01b031633146121625760405162461bcd60e51b815260040161065b9061578e565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b731f98431c8ad98523631ae4a59f267346ea31f98481565b3360009081526002602052604090205460ff166121cb5760405162461bcd60e51b815260040161065b9061548e565b60006007805480602002602001604051908101604052809291908181526020016000905b8282101561226357600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff1660608201528252600190920191016121ef565b505050509050600080600080600090505b84518110156123cb5784818151811061228957fe5b6020026020010151600001516001600160b81b0316600014156122be5760405162461bcd60e51b815260040161065b906154b5565b8481815181106122ca57fe5b60200260200101516060015162ffffff1684019350600080600080516020615bca8339815191526001600160a01b031663fc6f786560405180608001604052808a878151811061231657fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b168152612368919060040161586b565b6040805180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b9919061518d565b95019493909301925050600101612274565b5060085461271061010090910461ffff168381028290049190830204811561242757600454612427906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811691168461399c565b801561246757600454612467906001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7811691168361399c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a08231906124b39030906004016152c8565b60206040518083038186803b1580156124cb57600080fd5b505afa1580156124df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612503919061513a565b6040516370a0823160e01b81529094506001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716906370a08231906125529030906004016152c8565b60206040518083038186803b15801561256a57600080fd5b505afa15801561257e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a2919061513a565b92506000806125e96040518060c001604052808881526020018781526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b5050915091508186039550808503945084861180156126085750600286115b156127c857612627600080516020615baa833981519152600288610b94565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f0000000000000000000000000000000000000000000000000000000000000bb862ffffff168152602001306001600160a01b03168152602001600019815260200160028a816126fa57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b16815261272b91906004016158f1565b602060405180830381600087803b15801561274557600080fd5b505af1925050508015612775575060408051601f3d908101601f191682019092526127729181019061513a565b60015b61277e57612780565b505b6127c36001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216600080516020615baa83398151915260006136ec565b612987565b6002851115612987576127eb600080516020615baa833981519152600287610d87565b600080516020615baa8339815191526001600160a01b031663414bf3896040518061010001604052807f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f0000000000000000000000000000000000000000000000000000000000000bb862ffffff168152602001306001600160a01b031681526020016000198152602001600289816128be57fe5b048152600060208201819052604091820152516001600160e01b031960e084901b1681526128ef91906004016158f1565b602060405180830381600087803b15801561290957600080fd5b505af1925050508015612939575060408051601f3d908101601f191682019092526129369181019061513a565b60015b61294257612944565b505b6129876001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716600080516020615baa83398151915260006136ec565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a08231906129d39030906004016152c8565b60206040518083038186803b1580156129eb57600080fd5b505afa1580156129ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a23919061513a565b6040516370a0823160e01b81529096506001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716906370a0823190612a729030906004016152c8565b60206040518083038186803b158015612a8a57600080fd5b505afa158015612a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac2919061513a565b9450612b066040518060c001604052808881526020018781526020016000815260200160008152602001306001600160a01b03168152602001600019815250612fee565b505050505050505050505050565b6001600160a01b038316612b3a5760405162461bcd60e51b815260040161065b90615399565b6001600160a01b038216612b605760405162461bcd60e51b815260040161065b90615684565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612bbb908590615acf565b60405180910390a3505050565b6000806000806007805480602002602001604051908101604052809291908181526020016000905b82821015612c6457600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101612bf0565b50505050905060008060005b83518161ffff161015612f47576000600080516020615bca8339815191526001600160a01b03166399fbab88868461ffff1681518110612cac57fe5b6020026020010151600001516040518263ffffffff1660e01b8152600401612cd49190615a7c565b6101806040518083038186803b158015612ced57600080fd5b505afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2591906151b0565b505050509750505050505050506000612d4e826001600160801b03168b60000151600354613a75565b905060006040518060a00160405280888661ffff1681518110612d6d57fe5b6020026020010151600001516001600160b81b03168152602001836001600160801b0316815260200160008152602001600081526020018c608001518152509050600080600080516020615bca8339815191526001600160a01b0316630c49ccbe846040518263ffffffff1660e01b8152600401612deb91906158ae565b6040805180830381600087803b158015612e0457600080fd5b505af1158015612e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3c919061518d565b91509150600080600080516020615bca8339815191526001600160a01b031663fc6f786560405180608001604052808e8c61ffff1681518110612e7b57fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b168152612ecd919060040161586b565b6040805180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1e919061518d565b9e85019e9d84019d9c9096019b9390950398909801975090039490940193505050600101612c70565b5060085461271061010090910461ffff169283028190049291909102048115612fa457600454612fa4906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811691168461399c565b8015612fe457600454612fe4906001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7811691168361399c565b5050509193909250565b60008060008060006007805480602002602001604051908101604052809291908181526020016000905b8282101561308c57600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101613018565b505088519293506130d9926001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169250600080516020615bca83398151915291506136ec565b6020860151613122906001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec71690600080516020615bca833981519152906136ec565b6000806000835167ffffffffffffffff8111801561313f57600080fd5b50604051908082528060200260200182016040528015613169578160200160208202803683370190505b5090506000845167ffffffffffffffff8111801561318657600080fd5b506040519080825280602002602001820160405280156131b0578160200160208202803683370190505b5090506131bc85613b4c565b919a50929650909450909250905083158015906131d95750600083115b156131fb576131f5858b600001518c602001518787878761420f565b90945092505b60005b85518161ffff1610156136595760006040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f0000000000000000000000000000000000000000000000000000000000000bb862ffffff168152602001888461ffff16815181106132b257fe5b60200260200101516040015160020b8152602001888461ffff16815181106132d657fe5b60200260200101516020015160020b815260200160008152602001600081526020016000815260200160008152602001306001600160a01b031681526020018d60a00151815250905060006040518060c00160405280898561ffff168151811061333c57fe5b6020026020010151600001516001600160b81b03168152602001600081526020016000815260200160008152602001600081526020018e60a00151815250905060008711156133e0576133ab8d60000151868561ffff168151811061339d57fe5b602002602001015189613a75565b60a08301819052602082015260408d015185516133d39190879061ffff871690811061339d57fe5b60e0830181905260608201525b85156134425761340c8d60200151858561ffff16815181106133fe57fe5b602002602001015188613a75565b60c08301819052604082015260608d015184516134349190869061ffff87169081106133fe57fe5b610100830181905260808201525b60008260a001511180613459575060008260c00151115b1561364f57613466614c31565b888461ffff168151811061347657fe5b6020026020010151600001516001600160b81b03166000141561359257604051634418b22b60e11b8152600080516020615bca833981519152906388316456906134c490869060040161599e565b608060405180830381600087803b1580156134de57600080fd5b505af192505050801561350e575060408051601f3d908101601f1916820190925261350b91810190615152565b60015b61351757613535565b9284526001600160801b039091166020840152604083015260608201525b80516007805461ffff871690811061354957fe5b60009182526020918290200180546001600160b81b0319166001600160b81b03939093169290921790915560408201516060830151918301519e019d9c019b999099019861364d565b60405163219f5d1760e01b8152600080516020615bca8339815191529063219f5d17906135c390859060040161595a565b606060405180830381600087803b1580156135dd57600080fd5b505af192505050801561360d575060408051601f3d908101601f1916820190925261360a91810190615032565b60015b61361657613631565b6001600160801b039092166020840152604083015260608201525b80604001518d019c5080606001518c019b5080602001518a0199505b505b50506001016131fe565b5061369d6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216600080516020615bca83398151915260006136ec565b6136e06001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716600080516020615bca83398151915260006136ec565b50505050509193509193565b8015806137745750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061372290309086906004016152dc565b60206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613772919061513a565b155b6137905760405162461bcd60e51b815260040161065b90615720565b6137e68363095ea7b360e01b84846040516024016137af929190615342565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526145d8565b505050565b6001600160a01b0383166138115760405162461bcd60e51b815260040161065b906153d0565b6001600160a01b0382166138375760405162461bcd60e51b815260040161065b906155cd565b6138428383836137e6565b6001600160a01b0383166000908152602081905260409020548181101561387b5760405162461bcd60e51b815260040161065b9061564d565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061131b908690615acf565b6001600160a01b0382166138ff5760405162461bcd60e51b815260040161065b90615430565b61390b826000836137e6565b6001600160a01b038216600090815260208190526040902054818110156139445760405162461bcd60e51b815260040161065b906156bb565b6001600160a01b0383166000818152602081905260408082208585039055600380548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612bbb908690615acf565b6137e68363a9059cbb60e01b84846040516024016137af929190615342565b6139dc846323b872dd60e01b8585856040516024016137af9392919061531e565b50505050565b6001600160a01b038216613a085760405162461bcd60e51b815260040161065b90615518565b613a14600083836137e6565b60038054820190556001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a69908590615acf565b60405180910390a35050565b6000808060001985870986860292508281109083900303905080613aab5760008411613aa057600080fd5b5082900490506111b0565b808411613ab757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600082821115613b465760405162461bcd60e51b815260040161065b906154e1565b50900390565b6000806000606080855167ffffffffffffffff81118015613b6c57600080fd5b50604051908082528060200260200182016040528015613b96578160200160208202803683370190505b509150855167ffffffffffffffff81118015613bb157600080fd5b50604051908082528060200260200182016040528015613bdb578160200160208202803683370190505b50604051630b4c774160e11b81529091506000908190731f98431c8ad98523631ae4a59f267346ea31f98490631698ee8290613c7f907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2907f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7907f0000000000000000000000000000000000000000000000000000000000000bb8906004016152f6565b60206040518083038186803b158015613c9757600080fd5b505afa158015613cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ccf9190614cff565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015613d0757600080fd5b505afa158015613d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d3f9190615082565b505050505091509150613d50614c62565b600080613d748b600081518110613d6357fe5b602002602001015160400151614667565b6001600160a01b031683528a51613da1908c90600090613d9057fe5b602002602001015160200151614667565b6001600160a01b031660208401528a518b90600090613dbc57fe5b60200260200101516060015162ffffff1691508a60018c510381518110613ddf57fe5b60200260200101516060015162ffffff16905060005b8b518161ffff1610156142005760008c8261ffff1681518110613e1457fe5b6020026020010151600001516001600160b81b03161115613eeb576000600080516020615bca8339815191526001600160a01b03166399fbab888e8461ffff1681518110613e5e57fe5b6020026020010151600001516040518263ffffffff1660e01b8152600401613e869190615a7c565b6101806040518083038186803b158015613e9f57600080fd5b505afa158015613eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed791906151b0565b50505050975050505050505050808a019950505b613ef3614c62565b613f068d8361ffff1681518110613d6357fe5b6001600160a01b031681528c51613f27908e9061ffff8516908110613d9057fe5b6001600160a01b031660208201528c518d9061ffff8416908110613f4757fe5b60200260200101516040015160020b8660020b1361400757838d8361ffff1681518110613f7057fe5b60200260200101516060015162ffffff16613fc1613fb4613fa489600001518a602001518b600001518c6020015103613a75565b8551602087015190810390613a75565b8451600160601b90613a75565b0281613fc957fe5b04898361ffff1681518110613fda57fe5b602002602001018181525050888261ffff1681518110613ff657fe5b60200260200101518c019b506141f7565b8c8261ffff168151811061401757fe5b60200260200101516020015160020b8660020b126140ba57828d8361ffff168151811061404057fe5b60200260200101516060015162ffffff166140748360000151846020015103600160601b89600001518a6020015103613a75565b028161407c57fe5b04888361ffff168151811061408d57fe5b602002602001018181525050878261ffff16815181106140a957fe5b60200260200101518b019a506141f7565b838d8361ffff16815181106140cb57fe5b60200260200101516060015162ffffff1661412a6141166140ff89600001518a602001518b600001518c6020015103613a75565b60208601516001600160a01b038d16810390613a75565b600160601b8b6001600160a01b0316613a75565b028161413257fe5b04898361ffff168151811061414357fe5b602002602001018181525050828d8361ffff168151811061416057fe5b60200260200101516060015162ffffff1661419983600001518a6001600160a01b031603600160601b89600001518a6020015103613a75565b02816141a157fe5b04888361ffff16815181106141b257fe5b602002602001018181525050888261ffff16815181106141ce57fe5b60200260200101518c019b50878261ffff16815181106141ea57fe5b60200260200101518b019a505b50600101613df5565b50505050505091939590929450565b6000808851600114156142265750849050836145cc565b61422e614c62565b604051630b4c774160e11b8152600090731f98431c8ad98523631ae4a59f267346ea31f98490631698ee82906142cc907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2907f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7907f0000000000000000000000000000000000000000000000000000000000000bb8906004016152f6565b60206040518083038186803b1580156142e457600080fd5b505afa1580156142f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431c9190614cff565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561435457600080fd5b505afa158015614368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061438c9190615082565b50505050505090506143ed816143a88d600081518110613d6357fe5b6143b88e600081518110613d9057fe5b6143d78e8b6000815181106143c957fe5b60200260200101518e613a75565b6143e88e8b6000815181106143c957fe5b614980565b6001600160801b031682528a51600019810190614453908390614416908f9085908110613d6357fe5b6144258f8581518110613d9057fe5b6144438f8c878151811061443557fe5b60200260200101518f613a75565b6143e88f8c888151811061443557fe5b6001600160801b031660208401528b518c9060009061446e57fe5b60200260200101516060015162ffffff168360200151028c828151811061449157fe5b60200260200101516060015162ffffff16846000015102111561453e5760008c6000815181106144bd57fe5b60200260200101516060015162ffffff1684602001510211156145315761452a898d83815181106144ea57fe5b60200260200101516060015162ffffff168560000151028e60008151811061450e57fe5b60200260200101516060015162ffffff16866020015102613a75565b9450614536565b600094505b8793506145c8565b88945060008c828151811061454f57fe5b60200260200101516060015162ffffff1684600001510211156145c3576145bc888d60008151811061457d57fe5b60200260200101516060015162ffffff168560200151028e84815181106145a057fe5b60200260200101516060015162ffffff16866000015102613a75565b93506145c8565b600093505b5050505b97509795505050505050565b600061462d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a449092919063ffffffff16565b8051909150156137e6578080602001905181019061464b9190614f02565b6137e65760405162461bcd60e51b815260040161065b906156e9565b60008060008360020b1261467e578260020b614686565b8260020b6000035b9050620d89e88111156146ab5760405162461bcd60e51b815260040161065b90615604565b6000600182166146bf57600160801b6146d1565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615614705576ffff97272373d413259a46990580e213a0260801c5b6004821615614724576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615614743576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615614762576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615614781576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156147a0576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156147bf576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156147df576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156147ff576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561481f576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561483f576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161561485f576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561487f576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561489f576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156148bf576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156148e0576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614900576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561491f576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561493c576b048a170391f7dc42444e8fa20260801c5b60008460020b131561495757806000198161495357fe5b0490505b64010000000081061561496b57600161496e565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b031611156149a0579293925b846001600160a01b0316866001600160a01b0316116149cb576149c4858585614a5b565b9050614a3b565b836001600160a01b0316866001600160a01b03161015614a2d5760006149f2878686614a5b565b90506000614a01878986614abe565b9050806001600160801b0316826001600160801b031610614a225780614a24565b815b92505050614a3b565b614a38858584614abe565b90505b95945050505050565b6060614a538484600085614afb565b949350505050565b6000826001600160a01b0316846001600160a01b03161115614a7b579192915b6000614a9e856001600160a01b0316856001600160a01b0316600160601b613a75565b9050614a3b614ab984838888036001600160a01b0316613a75565b614bbb565b6000826001600160a01b0316846001600160a01b03161115614ade579192915b614a53614ab983600160601b8787036001600160a01b0316613a75565b606082471015614b1d5760405162461bcd60e51b815260040161065b90615757565b614b2685614bd1565b614b425760405162461bcd60e51b815260040161065b906157b1565b600080866001600160a01b03168587604051614b5e91906152ac565b60006040518083038185875af1925050503d8060008114614b9b576040519150601f19603f3d011682016040523d82523d6000602084013e614ba0565b606091505b5091509150614bb0828286614bd7565b979650505050505050565b806001600160801b03811681146115ee57600080fd5b3b151590565b60608315614be65750816111b0565b825115614bf65782518084602001fd5b8160405162461bcd60e51b815260040161065b9190615366565b5080546000825590600052602060002090810190614c2e9190614c7c565b50565b60405180608001604052806000815260200160006001600160801b0316815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b5b80821115614c915760008155600101614c7d565b5090565b80516115ee81615b36565b80356115ee81615b59565b80516115ee81615b59565b80516001600160801b03811681146115ee57600080fd5b80356115ee81615b78565b80516115ee81615b78565b600060208284031215614cf4578081fd5b81356111b081615b36565b600060208284031215614d10578081fd5b81516111b081615b36565b60008060408385031215614d2d578081fd5b8235614d3881615b36565b91506020830135614d4881615b36565b809150509250929050565b600080600060608486031215614d67578081fd5b8335614d7281615b36565b92506020840135614d8281615b36565b929592945050506040919091013590565b60008060408385031215614da5578182fd5b8235614db081615b36565b91506020830135614d4881615b4b565b60008060408385031215614dd2578182fd5b8235614ddd81615b36565b946020939093013593505050565b60006020808385031215614dfd578182fd5b823567ffffffffffffffff80821115614e14578384fd5b818501915085601f830112614e27578384fd5b813581811115614e3357fe5b614e408485830201615ae6565b818152848101908486016080808502870188018b1015614e5e578889fd5b8896505b84871015614ef35780828c031215614e78578889fd5b604080518281018181108982111715614e8d57fe5b825283356001600160b81b0381168114614ea5578b8cfd5b8152838a0135614eb481615b59565b818b0152614ec3848301614ca0565b8282015260609150614ed6828501614ccd565b918101919091528452600196909601959287019290810190614e62565b50909998505050505050505050565b600060208284031215614f13578081fd5b81516111b081615b4b565b600060c08284031215614f2f578081fd5b50919050565b600060c08284031215614f46578081fd5b60405160c0810181811067ffffffffffffffff82111715614f6357fe5b8060405250823581526020830135602082015260408301356040820152606083013560608201526080830135614f9881615b36565b608082015260a0928301359281019290925250919050565b600060a08284031215614f2f578081fd5b600060a08284031215614fd2578081fd5b60405160a0810181811067ffffffffffffffff82111715614fef57fe5b8060405250823581526020830135602082015260408301356040820152606083013561501a81615b36565b60608201526080928301359281019290925250919050565b600080600060608486031215615046578081fd5b61504f84614cb6565b925060208401519150604084015190509250925092565b600060208284031215615077578081fd5b81356111b081615b68565b600080600080600080600060e0888a03121561509c578485fd5b87516150a781615b36565b60208901519097506150b881615b59565b60408901519096506150c981615b68565b60608901519095506150da81615b68565b60808901519094506150eb81615b68565b60a089015190935060ff81168114615101578283fd5b60c089015190925061511281615b4b565b8091505092959891949750929550565b600060208284031215615133578081fd5b5035919050565b60006020828403121561514b578081fd5b5051919050565b60008060008060808587031215615167578182fd5b8451935061517760208601614cb6565b6040860151606090960151949790965092505050565b6000806040838503121561519f578182fd5b505080516020909101519092909150565b6000806000806000806000806000806000806101808d8f0312156151d2578586fd5b8c516bffffffffffffffffffffffff811681146151ed578687fd5b9b506151fb60208e01614c95565b9a5061520960408e01614c95565b995061521760608e01614c95565b985061522560808e01614cd8565b975061523360a08e01614cab565b965061524160c08e01614cab565b955061524f60e08e01614cb6565b94506101008d015193506101208d0151925061526e6101408e01614cb6565b915061527d6101608e01614cb6565b90509295989b509295989b509295989b565b6001600160a01b03169052565b60020b9052565b62ffffff169052565b600082516152be818460208701615b0a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082528251806020840152615385816040850160208701615b0a565b601f01601f19169190910160400192915050565b60208082526019908201527f617070726f76652066726f6d207a65726f206164647265737300000000000000604082015260600190565b6020808252601a908201527f7472616e736665722066726f6d207a65726f2061646472657373000000000000604082015260600190565b6020808252600f908201526e2bb937b733903a34b1b5903a34b2b960891b604082015260600190565b6020808252601690820152756275726e2066726f6d207a65726f206164647265737360501b604082015260600190565b6020808252601490820152732632b9b9903a3430b71020b6b7bab73a1826b4b760611b604082015260600190565b6020808252600d908201526c2737ba103b30b634b230ba37b960991b604082015260600190565b6020808252601290820152711391931408191bd95cdb9bdd08195e1a5cdd60721b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601490820152736d696e7420746f207a65726f206164647265737360601b604082015260600190565b6020808252601a908201527f7472616e73666572206578636565647320616c6c6f77616e6365000000000000604082015260600190565b6020808252600e908201526d1c99595b9d1c985b9d0818d85b1b60921b604082015260600190565b6020808252600e908201526d08ae8d040dcdee840cadcdeeaced60931b604082015260600190565b60208082526018908201527f7472616e7366657220746f207a65726f20616464726573730000000000000000604082015260600190565b6020808252600190820152601560fa1b604082015260600190565b6020808252601490820152732632b9b9903a3430b71020b6b7bab73a18a6b4b760611b604082015260600190565b60208082526018908201527f7472616e7366657220657863656564732062616c616e63650000000000000000604082015260600190565b60208082526017908201527f617070726f766520746f207a65726f2061646472657373000000000000000000604082015260600190565b6020808252601490820152736275726e20657863656564732062616c616e636560601b604082015260600190565b6020808252601f908201527f4552433230206f7065726174696f6e20646964206e6f74207375636365656400604082015260600190565b6020808252601c908201527f617070726f7665206e6f6e2d7a65726f20746f206e6f6e2d7a65726f00000000604082015260600190565b6020808252601d908201527f696e73756666696369656e742062616c616e636520666f722063616c6c000000604082015260600190565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b602080825260149082015273746f6b656e4964206973206e6f7420656d70747960601b604082015260600190565b6020808252601590820152745765696768742063616e6e6f74206265207a65726f60581b604082015260600190565b6020808252600c908201526b2737ba1022ba34102830b4b960a11b604082015260600190565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b600060a082019050825182526001600160801b03602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b6000610160820190506159b282845161528f565b60208301516159c4602084018261528f565b5060408301516159d760408401826152a3565b5060608301516159ea606084018261529c565b5060808301516159fd608084018261529c565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615a3b8285018261528f565b505061014092830151919092015290565b6001600160801b039390931683526020830191909152604082015260600190565b61ffff91909116815260200190565b6001600160b81b0391909116815260200190565b6001600160b81b03949094168452600292830b6020850152910b604083015262ffffff16606082015260800190565b62ffffff91909116815260200190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615b0257fe5b604052919050565b60005b83811015615b25578181015183820152602001615b0d565b838111156139dc5750506000910152565b6001600160a01b0381168114614c2e57600080fd5b8015158114614c2e57600080fd5b8060020b8114614c2e57600080fd5b61ffff81168114614c2e57600080fd5b62ffffff81168114614c2e57600080fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88a2646970667358221220ad84bd06f54db961ddb6ca46322547761e9824cb8eccf6e929a77810e682958864736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001f43656c6c617220506f6f6c2053686172652054657374204554482055534454000000000000000000000000000000000000000000000000000000000000000004435053540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9a0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf87400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf7c0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf65800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf5a4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf43c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf34cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf1e4000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf0f4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcef5000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcee60fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecbc0000000000000000000000000000000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : name_ (string): Cellar Pool Share Test ETH USDT
Arg [1] : symbol_ (string): CPST
Arg [2] : _token0 (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _token1 (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [4] : _feeLevel (uint24): 3000
Arg [5] : _cellarTickInfo (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
35 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [7] : 43656c6c617220506f6f6c205368617265205465737420455448205553445400
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 4350535400000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [12] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9a0
Arg [13] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf874
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [16] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf7c0
Arg [17] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf658
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf5a4
Arg [21] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf43c
Arg [22] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [24] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf34c
Arg [25] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf1e4
Arg [26] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [28] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf0f4
Arg [29] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcef50
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [32] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcee60
Arg [33] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecbc
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode Sourcemap
17561:35255:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35225:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20282:193;;;;;;;;;;-1:-1:-1;20282:193:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18428:31::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30889:3748::-;;;;;;;;;;-1:-1:-1;30889:3748:0;;;;;:::i;:::-;;:::i;:::-;;18543:38;;;;;;;;;;-1:-1:-1;18543:38:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;35528:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18258:41::-;;;;;;;;;;-1:-1:-1;18258:41:0;;;;;:::i;:::-;;:::i;20483:428::-;;;;;;;;;;-1:-1:-1;20483:428:0;;;;;:::i;:::-;;:::i;26452:750::-;;;;;;;;;;-1:-1:-1;26452:750:0;;;;;:::i;:::-;;:::i;35433:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20919:1530::-;;;;;;;;;;-1:-1:-1;20919:1530:0;;;;;:::i;:::-;;:::i;34645:173::-;;;;;;;;;;-1:-1:-1;34645:173:0;;;;;:::i;:::-;;:::i;18076:43::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35638:162::-;;;;;;;;;;-1:-1:-1;35638:162:0;;;;;:::i;:::-;;:::i;22457:2912::-;;;;;;:::i;:::-;;:::i;18504:32::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35127:90::-;;;;;;;;;;;;;:::i;34986:133::-;;;;;;;;;;-1:-1:-1;34986:133:0;;;;;:::i;:::-;;:::i;17681:104::-;;;;;;;;;;;;;:::i;35327:98::-;;;;;;;;;;;;;:::i;25377:1067::-;;;;;;;;;;-1:-1:-1;25377:1067:0;;;;;:::i;:::-;;:::i;20075:199::-;;;;;;;;;;-1:-1:-1;20075:199:0;;;;;:::i;:::-;;:::i;17994:73::-;;;;;;;;;;;;;:::i;17897:88::-;;;;;;;;;;;;;:::i;18466:31::-;;;;;;;;;;;;;:::i;35808:188::-;;;;;;;;;;-1:-1:-1;35808:188:0;;;;;:::i;:::-;;:::i;18618:24::-;;;;;;;;;;;;;:::i;34826:152::-;;;;;;;;;;-1:-1:-1;34826:152:0;;;;;:::i;:::-;;:::i;17794:94::-;;;;;;;;;;;;;:::i;27210:3671::-;;;;;;;;;;;;;:::i;35225:94::-;35306:5;35299:12;;;;;;;;-1:-1:-1;;35299:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35273:13;;35299:12;;35306:5;;35299:12;;35306:5;35299:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35225:94;:::o;20282:193::-;20386:4;20408:37;20417:10;20429:7;20438:6;20408:8;:37::i;:::-;-1:-1:-1;20463:4:0;20282:193;;;;:::o;18428:31::-;;;:::o;30889:3748::-;30993:6;;-1:-1:-1;;;;;30993:6:0;30979:10;:20;30971:42;;;;-1:-1:-1;;;30971:42:0;;;;;;;:::i;:::-;;;;;;;;;31078:232;;;;;;;;31129:12;;31078:232;;31024:38;31078:232;;;;;;;;;;;;;31243:4;31078:232;;;;-1:-1:-1;;31078:232:0;;;;31321:30;31078:232;31321:16;:30::i;:::-;;;;31364:42;31409:14;31364:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31364:59:0;;;;-1:-1:-1;;;31364:59:0;;;;;;;;;;;;;;-1:-1:-1;;;31364:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;31364:59:0;;;;;;;;;;;;;;;;;;;;;;;;;31439:9;31434:206;31458:18;:25;31454:1;:29;31434:206;;;-1:-1:-1;;;;;;;;;;;;;;;;31505:60:0;;31584:18;31603:1;31584:21;;;;;;;;;;;;;;:29;;;31505:123;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31485:3:0;;;;;-1:-1:-1;31434:206:0;;-1:-1:-1;31434:206:0;;-1:-1:-1;31650:21:0;31657:14;;31650:21;:::i;:::-;31687:9;31682:530;31706:15;:22;31702:1;:26;31682:530;;;31789:15;31805:1;31789:18;;;;;;;;;;;;;;:28;;;31758:59;;:15;31774:1;31758:18;;;;;;;;;;;;;;:28;;;:59;;;31750:87;;;;-1:-1:-1;;;31750:87:0;;;;;;;:::i;:::-;31856:5;;31852:138;;31922:15;31942:1;31938;:5;31922:22;;;;;;;;;;;;;;:32;;;31890:64;;:15;31906:1;31890:18;;;;;;;;;;;;;;:28;;;:64;;;;31882:92;;;;-1:-1:-1;;;31882:92:0;;;;;;;:::i;:::-;32040:1;32012:15;32028:1;32012:18;;;;;;;;;;;;;;:25;;;:29;;;32004:63;;;;-1:-1:-1;;;32004:63:0;;;;;;;:::i;:::-;32090:15;32106:1;32090:18;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;32090:31:0;32120:1;32090:31;32082:64;;;;-1:-1:-1;;;32082:64:0;;;;;;;:::i;:::-;32161:14;32181:15;32197:1;32181:18;;;;;;;;;;;;;;;;;;;32161:39;;;;;;;;-1:-1:-1;32161:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32161:39:0;-1:-1:-1;;;;;32161:39:0;;;;;;-1:-1:-1;;;32161:39:0;-1:-1:-1;;;;32161:39:0;;;;;;;-1:-1:-1;;;32161:39:0;-1:-1:-1;;;;;;;;;32161:39:0;;;-1:-1:-1;;;;;;32161:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31730:3;31682:530;;;-1:-1:-1;32243:39:0;;-1:-1:-1;;;32243:39:0;;32224:16;;-1:-1:-1;;;;;32250:6:0;32243:24;;;;:39;;32276:4;;32243:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32224:58;;32293:16;32319:6;-1:-1:-1;;;;;32312:24:0;;32345:4;32312:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32293:58;;32365:17;32384;32422:346;32454:299;;;;;;;;32509:8;32454:299;;;;32556:8;32454:299;;;;32599:1;32454:299;;;;32635:1;32454:299;;;;32678:4;-1:-1:-1;;;;;32454:299:0;;;;;-1:-1:-1;;32454:299:0;;;32422:13;:346::i;:::-;32364:404;;;;;;32791:9;32779:21;;;;32823:9;32811:21;;;;32858:8;32847;:19;:35;;;;;32881:1;32870:8;:12;32847:35;32843:1342;;;32899:52;-1:-1:-1;;;;;;;;;;;32949:1:0;32938:8;:12;-1:-1:-1;;;;;32906:6:0;32899:26;;:52;32938:12;;32899:26;:52::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;32970:40:0;;33029:395;;;;;;;;33096:6;-1:-1:-1;;;;;33029:395:0;;;;;33135:6;-1:-1:-1;;;;;33029:395:0;;;;;33169:8;33029:395;;;;;;33219:4;-1:-1:-1;;;;;33029:395:0;;;;;-1:-1:-1;;33029:395:0;;;;33318:1;33307:8;:12;;;;;;33029:395;;33360:1;33029:395;;;;;;;;;;;32970:469;-1:-1:-1;;;;;;32970:469:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32970:469:0;;;;;;;;-1:-1:-1;;32970:469:0;;;;;;;;;;;;:::i;:::-;;;32966:485;;;;;;;33465:41;-1:-1:-1;;;;;33472:6:0;33465:26;-1:-1:-1;;;;;;;;;;;33504:1:0;33465:26;:41::i;:::-;32843:1342;;;33548:1;33537:8;:12;33533:652;;;33566:52;-1:-1:-1;;;;;;;;;;;33616:1:0;33605:8;:12;-1:-1:-1;;;;;33573:6:0;33566:26;;:52;33605:12;;33566:26;:52::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;33637:40:0;;33696:395;;;;;;;;33763:6;-1:-1:-1;;;;;33696:395:0;;;;;33802:6;-1:-1:-1;;;;;33696:395:0;;;;;33836:8;33696:395;;;;;;33886:4;-1:-1:-1;;;;;33696:395:0;;;;;-1:-1:-1;;33696:395:0;;;;33985:1;33974:8;:12;;;;;;33696:395;;34027:1;33696:395;;;;;;;;;;;33637:469;-1:-1:-1;;;;;;33637:469:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33637:469:0;;;;;;;;-1:-1:-1;;33637:469:0;;;;;;;;;;;;:::i;:::-;;;33633:485;;;;;;;34132:41;-1:-1:-1;;;;;34139:6:0;34132:26;-1:-1:-1;;;;;;;;;;;34171:1:0;34132:26;:41::i;:::-;34208:39;;-1:-1:-1;;;34208:39:0;;-1:-1:-1;;;;;34215:6:0;34208:24;;;;:39;;34241:4;;34208:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34269;;-1:-1:-1;;;34269:39:0;;34197:50;;-1:-1:-1;;;;;;34276:6:0;34269:24;;;;:39;;34302:4;;34269:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34258:50;;34319:310;34347:271;;;;;;;;34398:8;34347:271;;;;34441:8;34347:271;;;;34480:1;34347:271;;;;34512:1;34347:271;;;;34551:4;-1:-1:-1;;;;;34347:271:0;;;;;-1:-1:-1;;34347:271:0;;;34319:13;:310::i;:::-;;;;;30889:3748;;;;;;;:::o;18543:38::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18543:38:0;;;-1:-1:-1;;;;18543:38:0;;;;;;;-1:-1:-1;;;18543:38:0;;;;;;-1:-1:-1;;;18543:38:0;;;;;:::o;35528:102::-;35610:12;;35528:102;:::o;18258:41::-;;;;;;;;;;;;;;;:::o;20483:428::-;20617:4;20634:36;20644:6;20652:9;20663:6;20634:9;:36::i;:::-;-1:-1:-1;;;;;20708:19:0;;20681:24;20708:19;;;:11;:19;;;;;;;;20728:10;20708:31;;;;;;;;20758:26;;;;20750:65;;;;-1:-1:-1;;;20750:65:0;;;;;;;:::i;:::-;20826:55;20835:6;20843:10;20874:6;20855:16;:25;20826:8;:55::i;:::-;20899:4;20892:11;;;20483:428;;;;;;:::o;26452:750::-;26581:18;;;26658:30;;;;;;;;26675:12;26658:30;:::i;:::-;:16;:30::i;:::-;26580:108;;-1:-1:-1;26580:108:0;-1:-1:-1;26580:108:0;-1:-1:-1;26699:43:0;26705:10;26717:24;;26699:5;:43::i;:::-;26777:12;:23;;;26763:10;:37;;26755:70;;;;-1:-1:-1;;;26755:70:0;;;;;;;:::i;:::-;26858:12;:23;;;26844:10;:37;;26836:70;;;;-1:-1:-1;;;26836:70:0;;;;;;;:::i;:::-;26919:51;-1:-1:-1;;;;;26926:6:0;26919:27;26947:10;26959;26919:27;:51::i;:::-;26981;-1:-1:-1;;;;;26988:6:0;26981:27;27009:10;27021;26981:27;:51::i;:::-;27100:6;-1:-1:-1;;;;;27048:146:0;27079:6;-1:-1:-1;;;;;27048:146:0;;27121:12;27148:10;27173;27048:146;;;;;;;;:::i;:::-;;;;;;;;26452:750;;;;:::o;35433:87::-;35510:2;35433:87;:::o;20919:1530::-;21040:137;-1:-1:-1;;;;;21047:6:0;21040:31;21086:10;21119:4;21139:27;;21040:31;:137::i;:::-;21190;-1:-1:-1;;;;;21197:6:0;21190:31;21236:10;21269:4;21289:27;;;;21190:31;:137::i;:::-;21355:17;;;;21491:27;;;;;;;;21505:12;21491:27;:::i;:::-;:13;:27::i;:::-;21340:178;;;;;;;;21535:15;-1:-1:-1;;;;;21535:20:0;21554:1;21535:20;21531:245;;;21572:31;21578:10;21590:12;-1:-1:-1;;;;;21572:31:0;:5;:31::i;:::-;21531:245;;;21636:128;21660:10;21689:60;21705:12;-1:-1:-1;;;;;21689:60:0;21719:12;;21733:15;-1:-1:-1;;;;;21689:60:0;:15;:60::i;:::-;21636:5;:128::i;:::-;21807:12;:23;;;21794:9;:36;;21786:69;;;;-1:-1:-1;;;21786:69:0;;;;;;;:::i;:::-;21887:12;:23;;;21874:9;:36;;21866:69;;;;-1:-1:-1;;;21866:69:0;;;;;;;:::i;:::-;21952:27;;:39;-1:-1:-1;21948:201:0;;;22008:129;-1:-1:-1;;;;;22015:6:0;22008:27;22054:10;22083:27;;:39;;;22008:27;:129::i;:::-;22193:9;22163:12;:27;;;:39;22159:201;;;22219:129;-1:-1:-1;;;;;22226:6:0;22219:27;22265:10;22294:27;;;;:39;;;22219:27;:129::i;:::-;22398:6;-1:-1:-1;;;;;22375:66:0;22390:6;-1:-1:-1;;;;;22375:66:0;;22406:12;22420:9;22431;22375:66;;;;;;;;:::i;:::-;;;;;;;;20919:1530;;;;;:::o;34645:173::-;34750:6;;-1:-1:-1;;;;;34750:6:0;34736:10;:20;34728:42;;;;-1:-1:-1;;;34728:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34781:21:0;;;;;;;;:9;:21;;;;;:29;;-1:-1:-1;;34781:29:0;;;;;;;;;;34645:173::o;18076:43::-;18114:5;18076:43;:::o;35638:162::-;-1:-1:-1;;;;;35774:18:0;;35742:7;35774:18;;;;;;;;;;;35638:162;;;;:::o;22457:2912::-;19961:10;;;;19960:11;19952:38;;;;-1:-1:-1;;;19952:38:0;;;;;;;:::i;:::-;20001:10;:17;;-1:-1:-1;;20001:17:0;20014:4;20001:17;;;22624:6:::1;-1:-1:-1::0;;;;;22624:14:0::1;-1:-1:-1::0;;;;;;;;;;;22624:14:0::1;22620:1328;;;22671:27:::0;::::1;22659:9;:39;22655:358;;;22719:109;::::0;22727:10:::1;::::0;22782:27;::::1;22770:9;:39;22719:109:::0;::::1;;;::::0;22782:27:::1;22719:109:::0;22782:27;22719:109;22770:39;22727:10;22719:109;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;22655:358;;;22899:9;22912:27:::0;::::1;22899:40;22869:128;;;;-1:-1:-1::0;;;22869:128:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;;;;;;23027:19:0::1;;23054:12;:27;;;23027:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;23099:153:0::1;::::0;-1:-1:-1;;;;;;;23106:6:0::1;23099:31;::::0;-1:-1:-1;23149:10:0::1;::::0;-1:-1:-1;23186:4:0::1;23210:27;::::0;::::1;;23099:31;:153::i;:::-;22620:1328;;;23293:6;-1:-1:-1::0;;;;;23293:14:0::1;-1:-1:-1::0;;;;;;;;;;;23293:14:0::1;23285:39;;;;-1:-1:-1::0;;;23285:39:0::1;;;;;;;:::i;:::-;23355:12;:27;;;23343:9;:39;23339:358;;;23403:109;::::0;23411:10:::1;::::0;23466:27:::1;::::0;::::1;;23454:9;:39;23403:109:::0;::::1;;;::::0;::::1;::::0;;;23454:39;23411:10;23403:109;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;23339:358;;;23596:12;:27;;;23583:9;:40;23553:128;;;;-1:-1:-1::0;;;23553:128:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;;;;;;23711:19:0::1;;23738:12;:27;;;23711:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;23783:153:0::1;::::0;-1:-1:-1;;;;;;;23790:6:0::1;23783:31;::::0;-1:-1:-1;23833:10:0::1;::::0;-1:-1:-1;23870:4:0::1;23894:27:::0;::::1;23783:31;:153::i;:::-;23975:17;::::0;;;24111:27:::1;;;::::0;;::::1;::::0;::::1;24125:12:::0;24111:27:::1;:::i;:::-;23960:178;;;;;;;;24155:15;-1:-1:-1::0;;;;;24155:20:0::1;24174:1;24155:20;24151:245;;;24192:31;24198:10;24210:12;-1:-1:-1::0;;;;;24192:31:0::1;:5;:31::i;:::-;24151:245;;;24256:128;24280:10;24309:60;24325:12;-1:-1:-1::0;;;;;24309:60:0::1;24339:12;;24353:15;-1:-1:-1::0;;;;;24309:60:0::1;:15;:60::i;24256:128::-;24429:12;:23;;;24416:9;:36;;24408:69;;;;-1:-1:-1::0;;;24408:69:0::1;;;;;;;:::i;:::-;24509:12;:23;;;24496:9;:36;;24488:69;;;;-1:-1:-1::0;;;24488:69:0::1;;;;;;;:::i;:::-;24570:18;24591:42;:27:::0;::::1;24623:9:::0;24591:31:::1;:42::i;:::-;24570:63:::0;-1:-1:-1;24644:18:0::1;24665:42;:27;::::0;::::1;;24697:9:::0;24665:31:::1;:42::i;:::-;24644:63:::0;-1:-1:-1;24724:14:0;;24720:275:::1;;24759:6;-1:-1:-1::0;;;;;24759:14:0::1;-1:-1:-1::0;;;;;;;;;;;24759:14:0::1;24755:229;;;24794:32;::::0;-1:-1:-1;;;24794:32:0;;-1:-1:-1;;;;;;;;;;;18025:42:0;24794:20:::1;::::0;:32:::1;::::0;24815:10;;24794:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;24845:31:0::1;::::0;:10:::1;::::0;-1:-1:-1;24845:31:0;::::1;;;::::0;-1:-1:-1;24865:10:0;;24845:31:::1;::::0;;;24865:10;24845;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;24755:229;;;24917:51;-1:-1:-1::0;;;;;24924:6:0::1;24917:27;24945:10;24957::::0;24917:27:::1;:51::i;:::-;25009:14:::0;;25005:275:::1;;25044:6;-1:-1:-1::0;;;;;25044:14:0::1;-1:-1:-1::0;;;;;;;;;;;25044:14:0::1;25040:229;;;25079:32;::::0;-1:-1:-1;;;25079:32:0;;-1:-1:-1;;;;;;;;;;;18025:42:0;25079:20:::1;::::0;:32:::1;::::0;25100:10;;25079:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25130:31:0::1;::::0;:10:::1;::::0;-1:-1:-1;25130:31:0;::::1;;;::::0;-1:-1:-1;25150:10:0;;25130:31:::1;::::0;;;25150:10;25130;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;25040:229;;;25202:51;-1:-1:-1::0;;;;;25209:6:0::1;25202:27;25230:10;25242::::0;25202:27:::1;:51::i;:::-;25318:6;-1:-1:-1::0;;;;;25295:66:0::1;25310:6;-1:-1:-1::0;;;;;25295:66:0::1;;25326:12;25340:9;25351;25295:66;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;20041:10:0;:18;;-1:-1:-1;;20041:18:0;;;-1:-1:-1;;;;;22457:2912:0:o;18504:32::-;;;:::o;35127:90::-;35203:6;;-1:-1:-1;;;;;35203:6:0;35127:90;:::o;34986:133::-;35068:6;;-1:-1:-1;;;;;35068:6:0;35054:10;:20;35046:42;;;;-1:-1:-1;;;35046:42:0;;;;;;;:::i;:::-;35099:3;:12;;;;;;;;-1:-1:-1;;35099:12:0;;;;;;;;;34986:133::o;17681:104::-;-1:-1:-1;;;;;;;;;;;17681:104:0;:::o;35327:98::-;35410:7;35403:14;;;;;;;;-1:-1:-1;;35403:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35377:13;;35403:14;;35410:7;;35403:14;;35410:7;35403:14;;;;;;;;;;;;;;;;;;;;;;;;25377:1067;19961:10;;;;19960:11;19952:38;;;;-1:-1:-1;;;19952:38:0;;;;;;;:::i;:::-;20001:10;:17;;-1:-1:-1;;20001:17:0;20014:4;20001:17;;;:10;;;25592:30:::1;;;::::0;;::::1;::::0;::::1;25609:12:::0;25592:30:::1;:::i;:::-;25514:108:::0;;-1:-1:-1;25514:108:0;-1:-1:-1;25514:108:0;-1:-1:-1;25633:43:0::1;25639:10;25651:24:::0;::::1;25633:5;:43::i;:::-;25711:12;:23;;;25697:10;:37;;25689:70;;;;-1:-1:-1::0;;;25689:70:0::1;;;;;;;:::i;:::-;25792:12;:23;;;25778:10;:37;;25770:70;;;;-1:-1:-1::0;;;25770:70:0::1;;;;;;;:::i;:::-;25857:6;-1:-1:-1::0;;;;;25857:14:0::1;-1:-1:-1::0;;;;;;;;;;;25857:14:0::1;25853:422;;;25888:32;::::0;-1:-1:-1;;;25888:32:0;;-1:-1:-1;;;;;;;;;;;18025:42:0;25888:20:::1;::::0;:32:::1;::::0;25909:10;;25888:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25935:31:0::1;::::0;:10:::1;::::0;-1:-1:-1;25935:31:0;::::1;;;::::0;-1:-1:-1;25955:10:0;;25935:31:::1;::::0;;;25955:10;25935;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;25981:51:0::1;-1:-1:-1::0;;;;;25988:6:0::1;25981:27;26009:10;26021::::0;25981:27:::1;:51::i;:::-;25853:422;;;26073:6;-1:-1:-1::0;;;;;26073:14:0::1;-1:-1:-1::0;;;;;;;;;;;26073:14:0::1;26065:39;;;;-1:-1:-1::0;;;26065:39:0::1;;;;;;;:::i;:::-;26119:32;::::0;-1:-1:-1;;;26119:32:0;;-1:-1:-1;;;;;;;;;;;18025:42:0;26119:20:::1;::::0;:32:::1;::::0;26140:10;;26119:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26166:31:0::1;::::0;:10:::1;::::0;-1:-1:-1;26166:31:0;::::1;;;::::0;-1:-1:-1;26186:10:0;;26166:31:::1;::::0;;;26186:10;26166;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;26212:51:0::1;-1:-1:-1::0;;;;;26219:6:0::1;26212:27;26240:10;26252::::0;26212:27:::1;:51::i;:::-;26342:6;-1:-1:-1::0;;;;;26290:146:0::1;26321:6;-1:-1:-1::0;;;;;26290:146:0::1;;26363:12;26390:10;26415;26290:146;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;20041:10:0;:18;;-1:-1:-1;;20041:18:0;;;-1:-1:-1;;25377:1067:0:o;20075:199::-;20182:4;20204:40;20214:10;20226:9;20237:6;20204:9;:40::i;17994:73::-;-1:-1:-1;;;;;;;;;;;17994:73:0;:::o;17897:88::-;-1:-1:-1;;;;;;;;;;;17897:88:0;:::o;18466:31::-;;;:::o;35808:188::-;-1:-1:-1;;;;;35960:19:0;;;35928:7;35960:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;35808:188::o;18618:24::-;;;;;;;;;:::o;34826:152::-;34922:6;;-1:-1:-1;;;;;34922:6:0;34908:10;:20;34900:42;;;;-1:-1:-1;;;34900:42:0;;;;;;;:::i;:::-;34953:6;:17;;-1:-1:-1;;;;;;34953:17:0;-1:-1:-1;;;;;34953:17:0;;;;;;;;;;34826:152::o;17794:94::-;17846:42;17794:94;:::o;27210:3671::-;19860:10;19850:21;;;;:9;:21;;;;;;;;19842:47;;;;-1:-1:-1;;;19842:47:0;;;;;;;:::i;:::-;27273:39:::1;27315:14;27273:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;-1:-1:-1;;;;;27273:56:0;::::1;::::0;;-1:-1:-1;;;27273:56:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;27273:56:0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;27273:56:0;::::1;;;::::0;;;;;;;;;::::1;::::0;::::1;;;;;;;;;;27340:17;27368:16:::0;27395::::1;27427:13:::0;27443:1:::1;27427:17;;27422:752;27454:15;:22;27446:5;:30;27422:752;;;27510:15;27526:5;27510:22;;;;;;;;;;;;;;:30;;;-1:-1:-1::0;;;;;27510:35:0::1;27544:1;27510:35;;27502:66;;;;-1:-1:-1::0;;;27502:66:0::1;;;;;;;:::i;:::-;27596:15;27612:5;27596:22;;;;;;;;;;;;;;:29;;;27583:42;;;;;;27641:15;27658::::0;-1:-1:-1;;;;;;;;;;;;;;;;27694:63:0::1;;27780:295;;;;;;;;27858:15;27874:5;27858:22;;;;;;;;;::::0;;::::1;::::0;;;;;;;:30;-1:-1:-1;;;;;27780:295:0::1;::::0;;27934:4:::1;27780:295:::0;;::::1;::::0;-1:-1:-1;;;;;27780:295:0;;;;;;;;;;;;27694:400;-1:-1:-1;;;;;;27694:400:0::1;::::0;;;;;;::::1;::::0;;::::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28109:19:::0;::::1;::::0;28143;;;::::1;::::0;-1:-1:-1;;27478:7:0::1;;27422:752;;;-1:-1:-1::0;28211:3:0::1;::::0;18114:5:::1;28211:3;::::0;;::::1;28199:31;28211:3;28200:14:::0;;::::1;28199:31:::0;;::::1;::::0;28257:14;;::::1;28256:31;28302:8:::0;;28298:82:::1;;28355:6;::::0;28327:41:::1;::::0;-1:-1:-1;;;;;28334:6:0::1;28327:27:::0;::::1;::::0;28355:6:::1;28363:4:::0;28327:27:::1;:41::i;:::-;28394:8:::0;;28390:82:::1;;28447:6;::::0;28419:41:::1;::::0;-1:-1:-1;;;;;28426:6:0::1;28419:27:::0;::::1;::::0;28447:6:::1;28455:4:::0;28419:27:::1;:41::i;:::-;28493:39;::::0;-1:-1:-1;;;28493:39:0;;-1:-1:-1;;;;;28500:6:0::1;28493:24;::::0;::::1;::::0;:39:::1;::::0;28526:4:::1;::::0;28493:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28554;::::0;-1:-1:-1;;;28554:39:0;;28482:50;;-1:-1:-1;;;;;;28561:6:0::1;28554:24;::::0;::::1;::::0;:39:::1;::::0;28587:4:::1;::::0;28554:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28543:50;;28607:17;28626::::0;28664:346:::1;28696:299;;;;;;;;28751:8;28696:299;;;;28798:8;28696:299;;;;28841:1;28696:299;;;;28877:1;28696:299;;;;28920:4;-1:-1:-1::0;;;;;28696:299:0::1;;;;;-1:-1:-1::0;;28696:299:0::1;;::::0;28664:13:::1;:346::i;:::-;28606:404;;;;;;29033:9;29021:21;;;;29065:9;29053:21;;;;29102:8;29091;:19;:35;;;;;29125:1;29114:8;:12;29091:35;29087:1342;;;29143:52;-1:-1:-1::0;;;;;;;;;;;29193:1:0::1;29182:8:::0;:12:::1;::::0;29143:52:::1;-1:-1:-1::0;;;;;;;;;;;;;;;;29214:40:0::1;;29273:395;;;;;;;;29340:6;-1:-1:-1::0;;;;;29273:395:0::1;;;;;29379:6;-1:-1:-1::0;;;;;29273:395:0::1;;;;;29413:8;29273:395;;;;;;29463:4;-1:-1:-1::0;;;;;29273:395:0::1;;;;;-1:-1:-1::0;;29273:395:0::1;;;;29562:1;29551:8;:12;;;;;;29273:395:::0;;29604:1:::1;29273:395;::::0;::::1;::::0;;;;;;;;29214:469;-1:-1:-1;;;;;;29214:469:0::1;::::0;;;;;;::::1;::::0;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;29214:469:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;29214:469:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;29210:485;;;;;;;29709:41;-1:-1:-1::0;;;;;29716:6:0::1;29709:26;-1:-1:-1::0;;;;;;;;;;;29748:1:0::1;29709:26;:41::i;:::-;29087:1342;;;29792:1;29781:8;:12;29777:652;;;29810:52;-1:-1:-1::0;;;;;;;;;;;29860:1:0::1;29849:8:::0;:12:::1;::::0;29810:52:::1;-1:-1:-1::0;;;;;;;;;;;;;;;;29881:40:0::1;;29940:395;;;;;;;;30007:6;-1:-1:-1::0;;;;;29940:395:0::1;;;;;30046:6;-1:-1:-1::0;;;;;29940:395:0::1;;;;;30080:8;29940:395;;;;;;30130:4;-1:-1:-1::0;;;;;29940:395:0::1;;;;;-1:-1:-1::0;;29940:395:0::1;;;;30229:1;30218:8;:12;;;;;;29940:395:::0;;30271:1:::1;29940:395;::::0;::::1;::::0;;;;;;;;29881:469;-1:-1:-1;;;;;;29881:469:0::1;::::0;;;;;;::::1;::::0;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;29881:469:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;29881:469:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;29877:485;;;;;;;30376:41;-1:-1:-1::0;;;;;30383:6:0::1;30376:26;-1:-1:-1::0;;;;;;;;;;;30415:1:0::1;30376:26;:41::i;:::-;30452:39;::::0;-1:-1:-1;;;30452:39:0;;-1:-1:-1;;;;;30459:6:0::1;30452:24;::::0;::::1;::::0;:39:::1;::::0;30485:4:::1;::::0;30452:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30513;::::0;-1:-1:-1;;;30513:39:0;;30441:50;;-1:-1:-1;;;;;;30520:6:0::1;30513:24;::::0;::::1;::::0;:39:::1;::::0;30546:4:::1;::::0;30513:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30502:50;;30563:310;30591:271;;;;;;;;30642:8;30591:271;;;;30685:8;30591:271;;;;30724:1;30591:271;;;;30756:1;30591:271;;;;30795:4;-1:-1:-1::0;;;;;30591:271:0::1;;;;;-1:-1:-1::0;;30591:271:0::1;;::::0;30563:13:::1;:310::i;:::-;;;;;19900:1;;;;;;;;27210:3671::o:0;37402:354::-;-1:-1:-1;;;;;37531:20:0;;37523:58;;;;-1:-1:-1;;;37523:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37600:21:0;;37592:57;;;;-1:-1:-1;;;37592:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37662:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;;:37;;;37715:33;;;;;37693:6;;37715:33;:::i;:::-;;;;;;;;37402:354;;;:::o;50159:2484::-;50275:18;50308;50341:20;50389:39;50431:14;50389:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50389:56:0;;;;-1:-1:-1;;;50389:56:0;;;;;;;;;;;;;;-1:-1:-1;;;50389:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;50389:56:0;;;;;;;;;;;;;;;;;;;;;;;;;50456:12;50479;50507:8;50502:1860;50525:15;:22;50521:1;:26;;;50502:1860;;;50584:17;-1:-1:-1;;;;;;;;;;;;;;;;50630:87:0;;50718:15;50734:1;50718:18;;;;;;;;;;;;;;;;:26;;;50630:115;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50569:176;;;;;;;;;;;;;50760:20;50830:164;50872:9;-1:-1:-1;;;;;50830:164:0;50908:12;:24;;;50959:12;;50830:15;:164::i;:::-;50760:253;;51034:103;51171:302;;;;;;;;51255:15;51271:1;51255:18;;;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;51171:302:0;;;;;51315:12;-1:-1:-1;;;;;51171:302:0;;;;;51362:1;51171:302;;;;51398:1;51171:302;;;;51432:12;:21;;;51171:302;;;51034:439;;51489:15;51506;-1:-1:-1;;;;;;;;;;;;;;;;51542:95:0;;51638:23;51542:120;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51488:174;;;;51678:22;51702;-1:-1:-1;;;;;;;;;;;;;;;;51745:63:0;;51831:291;;;;;;;;51909:15;51925:1;51909:18;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;51831:291:0;;;51981:4;51831:291;;;;-1:-1:-1;;;;;51831:291:0;;;;;;;;;;;;51745:396;-1:-1:-1;;;;;;51745:396:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52250:21;;;;52286;;;;52322:28;;;;;52164:24;;;;52156:32;;;;;-1:-1:-1;52211:24:0;;52203:32;;;;;-1:-1:-1;;;50549:3:0;;50502:1860;;;-1:-1:-1;52387:3:0;;18114:5;52387:3;;;;52379:27;52387:3;52380:10;;;52379:27;;;;52425:10;;;;52424:27;52466:8;;52462:82;;52519:6;;52491:41;;-1:-1:-1;;;;;52498:6:0;52491:27;;;52519:6;52527:4;52491:27;:41::i;:::-;52558:8;;52554:82;;52611:6;;52583:41;;-1:-1:-1;;;;;52590:6:0;52583:27;;;52611:6;52619:4;52583:27;:41::i;:::-;50159:2484;;;;;;;;:::o;44726:5425::-;44836:17;44868;44900:23;44938:20;44986:39;45028:14;44986:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44986:56:0;;;;-1:-1:-1;;;44986:56:0;;;;;;;;;;;;;;-1:-1:-1;;;44986:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;44986:56:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45135:27:0;;44986:56;;-1:-1:-1;45053:120:0;;-1:-1:-1;;;;;45060:6:0;45053:26;;-1:-1:-1;;;;;;;;;;;;17743:42:0;-1:-1:-1;45053:26:0;:120::i;:::-;45266:27;;;;45184:120;;-1:-1:-1;;;;;45191:6:0;45184:26;;-1:-1:-1;;;;;;;;;;;17743:42:0;45184:26;:120::i;:::-;45317:18;45346;45375:24;45416:15;:22;45402:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45402:37:0;;45375:64;;45450:24;45491:15;:22;45477:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45477:37:0;;45450:64;;45665:31;45680:15;45665:14;:31::i;:::-;45527:169;;-1:-1:-1;45527:169:0;;-1:-1:-1;45527:169:0;;-1:-1:-1;45527:169:0;;-1:-1:-1;45527:169:0;-1:-1:-1;45711:14:0;;;;;:32;;;45742:1;45729:10;:14;45711:32;45707:360;;;45787:268;45823:15;45857:12;:27;;;45903:12;:27;;;45949:10;45978;46007:7;46033;45787:17;:268::i;:::-;45760:295;;-1:-1:-1;45760:295:0;-1:-1:-1;45707:360:0;46084:8;46079:3929;46102:15;:22;46098:1;:26;;;46079:3929;;;46146:56;46222:546;;;;;;;;46292:6;-1:-1:-1;;;;;46222:546:0;;;;;46329:6;-1:-1:-1;;;;;46222:546:0;;;;;46363:8;46222:546;;;;;;46405:15;46421:1;46405:18;;;;;;;;;;;;;;;;:28;;;46222:546;;;;;;46467:15;46483:1;46467:18;;;;;;;;;;;;;;;;:28;;;46222:546;;;;;;46534:1;46222:546;;;;46574:1;46222:546;;;;46610:1;46222:546;;;;46646:1;46222:546;;;;46689:4;-1:-1:-1;;;;;46222:546:0;;;;;46727:12;:21;;;46222:546;;;46146:622;;46789:103;46926:336;;;;;;;;47010:15;47026:1;47010:18;;;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;46926:336:0;;;;;47075:1;46926:336;;;;47115:1;46926:336;;;;47151:1;46926:336;;;;47187:1;46926:336;;;;47221:12;:21;;;46926:336;;;46789:473;;47294:1;47281:10;:14;47277:606;;;47344:150;47382:12;:27;;;47432:7;47440:1;47432:10;;;;;;;;;;;;;;;;47465;47344:15;:150::i;:::-;47316:25;;;:178;;;47513:38;;;:88;47682:23;;;;47728:10;;47644:146;;47682:23;47728:7;;:10;;;;;;;;;47644:146;47620:21;;;:170;;;47809:34;;;:58;47277:606;47901:14;;47897:606;;47964:150;48002:12;:27;;;48052:7;48060:1;48052:10;;;;;;;;;;;;;;;;48085;47964:15;:150::i;:::-;47936:25;;;:178;;;48133:38;;;:88;48302:23;;;;48348:10;;48264:146;;48302:23;48348:7;;:10;;;;;;;;;48264:146;48240:21;;;:170;;;48429:34;;;:58;47897:606;48567:1;48539:10;:25;;;:29;:62;;;;48600:1;48572:10;:25;;;:29;48539:62;48517:1480;;;48636:28;;:::i;:::-;48687:15;48703:1;48687:18;;;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;48687:31:0;48717:1;48687:31;48683:1299;;;48749:98;;-1:-1:-1;;;48749:98:0;;-1:-1:-1;;;;;;;;;;;17743:42:0;48749:86;;:98;;48836:10;;48749:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48749:98:0;;;;;;;;-1:-1:-1;;48749:98:0;;;;;;;;;;;;:::i;:::-;;;48745:395;;;;;48932:23;;;-1:-1:-1;;;;;48982:25:0;;;:20;;;:25;49034:18;;;:23;49084:18;;;:23;48745:395;49200:18;;49164:14;:17;;;;;;;;;;;;;;;;;;;;;;:55;;-1:-1:-1;;;;;;49164:55:0;-1:-1:-1;;;;;49164:55:0;;;;;;;;;;;49257:18;;;;49311;;;;49368:20;;;;49244:31;;;49298;;;49352:36;;;;;48683:1299;;;49441:124;;-1:-1:-1;;;49441:124:0;;-1:-1:-1;;;;;;;;;;;17743:42:0;49441:99;;:124;;49541:23;;49441:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49441:124:0;;;;;;;;-1:-1:-1;;49441:124:0;;;;;;;;;;;;:::i;:::-;;;49437:359;;;;;-1:-1:-1;;;;;49638:25:0;;;:20;;;:25;49690:18;;;:23;49740:18;;;:23;49437:359;49831:10;:18;;;49818:31;;;;49885:10;:18;;;49872:31;;;;49942:10;:20;;;49926:36;;;;48683:1299;48517:1480;;-1:-1:-1;;46126:3:0;;46079:3929;;;-1:-1:-1;50018:57:0;-1:-1:-1;;;;;50025:6:0;50018:26;-1:-1:-1;;;;;;;;;;;50073:1:0;50018:26;:57::i;:::-;50086;-1:-1:-1;;;;;50093:6:0;50086:26;-1:-1:-1;;;;;;;;;;;50141:1:0;50086:26;:57::i;:::-;44726:5425;;;;;;;;;;:::o;7124:407::-;7268:10;;;7267:62;;-1:-1:-1;7284:39:0;;-1:-1:-1;;;7284:39:0;;-1:-1:-1;;;;;7284:15:0;;;;;:39;;7308:4;;7315:7;;7284:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;7267:62;7245:140;;;;-1:-1:-1;;;7245:140:0;;;;;;;:::i;:::-;7396:127;7430:5;7473:22;;;7497:7;7506:5;7450:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;7450:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7450:62:0;-1:-1:-1;;;;;;7450:62:0;;;;;;;;;;7396:19;:127::i;:::-;7124:407;;;:::o;36004:594::-;-1:-1:-1;;;;;36136:20:0;;36128:59;;;;-1:-1:-1;;;36128:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36206:23:0;;36198:60;;;;-1:-1:-1;;;36198:60:0;;;;;;;:::i;:::-;36271:47;36292:6;36300:9;36311:6;36271:20;:47::i;:::-;-1:-1:-1;;;;;36355:17:0;;36331:21;36355:17;;;;;;;;;;;36391:23;;;;36383:60;;;;-1:-1:-1;;;36383:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36454:17:0;;;:9;:17;;;;;;;;;;;36474:22;;;36454:42;;36507:20;;;;;;;;;;:30;;;;;;36555:35;;;;;;36490:6;;36555:35;:::i;36933:461::-;-1:-1:-1;;;;;37009:21:0;;37001:56;;;;-1:-1:-1;;;37001:56:0;;;;;;;:::i;:::-;37070:49;37091:7;37108:1;37112:6;37070:20;:49::i;:::-;-1:-1:-1;;;;;37157:18:0;;37132:22;37157:18;;;;;;;;;;;37194:24;;;;37186:57;;;;-1:-1:-1;;;37186:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37254:18:0;;:9;:18;;;;;;;;;;;37275:23;;;37254:44;;37309:12;:22;;;;;;;37349:37;37254:9;;:18;37349:37;;;;37292:6;;37349:37;:::i;6575:248::-;6692:123;6726:5;6769:23;;;6794:2;6798:5;6746:58;;;;;;;;;:::i;6831:285::-;6975:133;7009:5;7052:27;;;7081:4;7087:2;7091:5;7029:68;;;;;;;;;;:::i;6975:133::-;6831:285;;;;:::o;36606:319::-;-1:-1:-1;;;;;36682:21:0;;36674:54;;;;-1:-1:-1;;;36674:54:0;;;;;;;:::i;:::-;36741:49;36770:1;36774:7;36783:6;36741:20;:49::i;:::-;36803:12;:22;;;;;;-1:-1:-1;;;;;36836:18:0;;36803:12;36836:18;;;;;;;;;;;:28;;;;;;36880:37;;;;;36819:6;;36880:37;:::i;:::-;;;;;;;;36606:319;;:::o;8098:1718::-;8214:14;;;-1:-1:-1;;8422:1:0;8419;8412:20;8455:9;;;;-1:-1:-1;8507:13:0;;;8491:14;;;;8487:34;;-1:-1:-1;8548:10:0;8544:185;;8597:1;8583:11;:15;8575:24;;;;;;-1:-1:-1;8652:23:0;;;;-1:-1:-1;8704:13:0;;8544:185;8763:5;8749:11;:19;8741:28;;;;;;8782:17;8860:11;8857:1;8854;8847:25;9025:12;9040;;;:26;;9118:22;;;;;9387:1;9368;:15;;9367:21;;9412:17;;;9408:21;;9401:28;9471:17;;;9467:21;;9460:28;9531:17;;;9527:21;;9520:28;9591:17;;;9587:21;;9580:28;9651:17;;;9647:21;;9640:28;9712:17;;;9708:21;;;9701:28;9275:12;;;;9271:23;;;9296:1;9267:31;8937:20;;;8926:32;;;9328:12;;;;8981:21;;;;9196:16;;;;9319:21;;;;9773:11;;;;;-1:-1:-1;;8098:1718:0;;;;;:::o;4200:158::-;4258:7;4291:1;4286;:6;;4278:49;;;;-1:-1:-1;;;4278:49:0;;;;;;;:::i;:::-;-1:-1:-1;4345:5:0;;;4200:158::o;37764:4264::-;37893:18;37926;37959:23;37997:24;38036;38112:15;:22;38098:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38098:37:0;;38088:47;;38170:15;:22;38156:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38156:37:0;-1:-1:-1;38304:151:0;;-1:-1:-1;;;38304:151:0;;38146:47;;-1:-1:-1;38205:20:0;;;;17846:42;;38304:43;;:151;;38370:6;;38399;;38428:8;;38304:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38271:223:0;;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38204:292;;;;;;;;;38507:26;;:::i;:::-;38546:16;38573;38617:81;38659:15;38675:1;38659:18;;;;;;;;;;;;;;:28;;;38617:27;:81::i;:::-;-1:-1:-1;;;;;38602:96:0;;;38766:18;;38724:81;;38766:15;;38602:12;;38766:18;;;;;;;;;;:28;;;38724:27;:81::i;:::-;-1:-1:-1;;;;;38709:96:0;:12;;;:96;38829:18;;:15;;38845:1;;38829:18;;;;;;;;;;:25;;;38818:36;;;;38878:15;38919:1;38894:15;:22;:26;38878:43;;;;;;;;;;;;;;:50;;;38867:61;;;;38944:8;38939:3082;38962:15;:22;38958:1;:26;;;38939:3082;;;39039:1;39010:15;39026:1;39010:18;;;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;39010:30:0;;39006:302;;;39076:17;-1:-1:-1;;;;;;;;;;;;;;;;39126:91:0;;39218:15;39234:1;39218:18;;;;;;;;;;;;;;;;:26;;;39126:119;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39061:184;;;;;;;;;;;;;39283:9;39264:28;;;;39006:302;;39324:39;;:::i;:::-;39406:89;39452:15;39468:1;39452:18;;;;;;;;;39406:89;-1:-1:-1;;;;;39378:117:0;;;39584:18;;39538:89;;39584:15;;:18;;;;;;;;;39538:89;-1:-1:-1;;;;;39510:117:0;:25;;;:117;39663:18;;:15;;:18;;;;;;;;;;;;;;;;:28;;;39648:43;;:11;:43;;;39644:2366;;40408:8;40358:15;40374:1;40358:18;;;;;;;;;;;;;;;;:25;;;39747:636;;:608;39789:448;39835:202;39885:10;:12;;;39932:10;:12;;;39994:10;:12;;;39979:10;:12;;;:27;39835:15;:202::i;:::-;40129:25;;40068;;;;:86;;;;39789:15;:448::i;:::-;40307:25;;-1:-1:-1;;;8039:27:0;39747:15;:608::i;:::-;:636;39746:670;;;;;;39712:7;39720:1;39712:10;;;;;;;;;;;;;;;:704;;;;;40449:7;40457:1;40449:10;;;;;;;;;;;;;;;;40435:24;;;;39644:2366;;;40500:15;40516:1;40500:18;;;;;;;;;;;;;;;;:28;;;40485:43;;:11;:43;;;40481:1529;;40852:8;40802:15;40818:1;40802:18;;;;;;;;;;;;;;;;:25;;;40584:243;;:215;40654:23;:25;;;40626:23;:25;;;:53;-1:-1:-1;;;40764:10:0;:12;;;40749:10;:12;;;:27;40584:15;:215::i;:::-;:243;40583:277;;;;;;40549:7;40557:1;40549:10;;;;;;;;;;;;;;;:311;;;;;40893:7;40901:1;40893:10;;;;;;;;;;;;;;;;40879:24;;;;40481:1529;;;41581:8;41531:15;41547:1;41531:18;;;;;;;;;;;;;;;;:25;;;40979:577;;:549;41021:402;41067:202;41117:10;:12;;;41164:10;:12;;;41226:10;:12;;;41211:10;:12;;;:27;41067:15;:202::i;:::-;41300:25;;;;-1:-1:-1;;;;;41300:40:0;;;;;41021:15;:402::i;:::-;-1:-1:-1;;;41493:12:0;-1:-1:-1;;;;;40979:549:0;:15;:549::i;:::-;:577;40978:611;;;;;;40944:7;40952:1;40944:10;;;;;;;;;;;;;;;:645;;;;;41900:8;41850:15;41866:1;41850:18;;;;;;;;;;;;;;;;:25;;;41645:230;;:202;41702:23;:25;;;41687:12;-1:-1:-1;;;;;41687:40:0;;-1:-1:-1;;;41812:10:0;:12;;;41797:10;:12;;;:27;41645:15;:202::i;:::-;:230;41644:264;;;;;;41610:7;41618:1;41610:10;;;;;;;;;;;;;;;:298;;;;;41941:7;41949:1;41941:10;;;;;;;;;;;;;;;;41927:24;;;;41984:7;41992:1;41984:10;;;;;;;;;;;;;;;;41970:24;;;;40481:1529;-1:-1:-1;38986:3:0;;38939:3082;;;;37764:4264;;;;;;;;;;;;:::o;42036:2682::-;42337:21;42360;42398:15;:22;42424:1;42398:27;42394:91;;;-1:-1:-1;42450:10:0;;-1:-1:-1;42462:10:0;42442:31;;42394:91;42497:25;;:::i;:::-;42616:151;;-1:-1:-1;;;42616:151:0;;42534:20;;17846:42;;42616:43;;:151;;42682:6;;42711;;42740:8;;42616:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42583:223:0;;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42533:275;;;;;;;;42833:361;42887:12;42914:57;42942:15;42958:1;42942:18;;;;;;;42914:57;42986;43014:15;43030:1;43014:18;;;;;;;42986:57;43058:55;43074:14;43090:7;43098:1;43090:10;;;;;;;;;;;;;;43102;43058:15;:55::i;:::-;43128;43144:14;43160:7;43168:1;43160:10;;;;;;;43128:55;42833:39;:361::i;:::-;-1:-1:-1;;;;;42819:375:0;;;43226:22;;-1:-1:-1;;43226:26:0;;;43277:397;;43331:12;;43358:66;;43226:15;;:26;;43386:27;;;;;43358:66;43439;43467:15;43483:10;43467:27;;;;;;;43439:66;43520:64;43536:14;43552:7;43560:10;43552:19;;;;;;;;;;;;;;43573:10;43520:15;:64::i;:::-;43599;43615:14;43631:7;43639:10;43631:19;;;;;;;43277:397;-1:-1:-1;;;;;43263:411:0;:11;;;:411;43783:18;;:15;;43799:1;;43783:18;;;;;;;;;;:25;;;43769:39;;:9;:11;;;:39;43719:15;43735:10;43719:27;;;;;;;;;;;;;;:34;;;43705:48;;:9;:11;;;:48;:103;43687:1024;;;43881:1;43853:15;43869:1;43853:18;;;;;;;;;;;;;;:25;;;43839:39;;:9;:11;;;:39;:43;43835:371;;;43919:200;43957:10;44004:15;44020:10;44004:27;;;;;;;;;;;;;;:34;;;43990:48;;:9;:11;;;:48;44075:15;44091:1;44075:18;;;;;;;;;;;;;;:25;;;44061:39;;:9;:11;;;:39;43919:15;:200::i;:::-;43903:216;;43835:371;;;44189:1;44173:17;;43835:371;44236:10;44220:26;;43687:1024;;;44295:10;44279:26;;44375:1;44338:15;44354:10;44338:27;;;;;;;;;;;;;;:34;;;44324:48;;:9;:11;;;:48;:52;44320:380;;;44413:200;44451:10;44498:15;44514:1;44498:18;;;;;;;;;;;;;;:25;;;44484:39;;:9;:11;;;:39;44560:15;44576:10;44560:27;;;;;;;;;;;;;;:34;;;44546:48;;:9;:11;;;:48;44413:15;:200::i;:::-;44397:216;;44320:380;;;44683:1;44667:17;;44320:380;42036:2682;;;;;;;;;;;;;;:::o;7539:433::-;7620:23;7659:118;7705:4;7659:118;;;;;;;;;;;;;;;;;7667:5;-1:-1:-1;;;;;7659:27:0;;;:118;;;;;:::i;:::-;7792:17;;7620:157;;-1:-1:-1;7792:21:0;7788:177;;7867:10;7856:30;;;;;;;;;;;;:::i;:::-;7830:123;;;;-1:-1:-1;;;7830:123:0;;;;;;;:::i;9949:2672::-;10039:20;10077:15;10115:1;10108:4;:8;;;:57;;10159:4;10152:12;;10108:57;;;10135:4;10128:12;;10127:13;;10108:57;10077:88;-1:-1:-1;9931:9:0;10184:28;;;10176:42;;;;-1:-1:-1;;;10176:42:0;;;;;;;:::i;:::-;10231:13;10270:3;10260:13;;:127;;-1:-1:-1;;;10260:127:0;;;10298:34;10260:127;10231:156;;;-1:-1:-1;10412:3:0;10402:13;;:18;10398:96;;10452:34;10444:42;10491:3;10443:51;10398:96;10519:3;10509:13;;:18;10505:96;;10559:34;10551:42;10598:3;10550:51;10505:96;10626:3;10616:13;;:18;10612:96;;10666:34;10658:42;10705:3;10657:51;10612:96;10733:4;10723:14;;:19;10719:97;;10774:34;10766:42;10813:3;10765:51;10719:97;10841:4;10831:14;;:19;10827:97;;10882:34;10874:42;10921:3;10873:51;10827:97;10949:4;10939:14;;:19;10935:97;;10990:34;10982:42;11029:3;10981:51;10935:97;11057:4;11047:14;;:19;11043:97;;11098:34;11090:42;11137:3;11089:51;11043:97;11165:5;11155:15;;:20;11151:98;;11207:34;11199:42;11246:3;11198:51;11151:98;11274:5;11264:15;;:20;11260:98;;11316:34;11308:42;11355:3;11307:51;11260:98;11383:5;11373:15;;:20;11369:98;;11425:34;11417:42;11464:3;11416:51;11369:98;11492:5;11482:15;;:20;11478:98;;11534:34;11526:42;11573:3;11525:51;11478:98;11601:6;11591:16;;:21;11587:99;;11644:34;11636:42;11683:3;11635:51;11587:99;11711:6;11701:16;;:21;11697:99;;11754:34;11746:42;11793:3;11745:51;11697:99;11821:6;11811:16;;:21;11807:99;;11864:34;11856:42;11903:3;11855:51;11807:99;11931:6;11921:16;;:21;11917:99;;11974:34;11966:42;12013:3;11965:51;11917:99;12041:7;12031:17;;:22;12027:99;;12085:33;12077:41;12123:3;12076:50;12027:99;12151:7;12141:17;;:22;12137:98;;12195:32;12187:40;12232:3;12186:49;12137:98;12260:7;12250:17;;:22;12246:96;;12304:30;12296:38;12339:3;12295:47;12246:96;12367:7;12357:17;;:22;12353:91;;12411:25;12403:33;12441:3;12402:42;12353:91;12468:1;12461:4;:8;;;12457:47;;;12499:5;-1:-1:-1;;12479:25:0;;;;;;12471:33;;12457:47;12580:7;12571:5;:17;:22;:30;;12600:1;12571:30;;;12596:1;12571:30;12554:48;;12564:2;12555:5;:11;;12554:48;12517:96;;9949:2672;;;;;:::o;13962:1099::-;14171:17;14221:13;-1:-1:-1;;;;;14205:29:0;:13;-1:-1:-1;;;;;14205:29:0;;14201:111;;;14283:13;;14298;14201:111;14345:13;-1:-1:-1;;;;;14329:29:0;:12;-1:-1:-1;;;;;14329:29:0;;14325:729;;14387:127;14428:13;14460;14492:7;14387:22;:127::i;:::-;14375:139;;14325:729;;;14551:13;-1:-1:-1;;;;;14536:28:0;:12;-1:-1:-1;;;;;14536:28:0;;14532:522;;;14581:18;14619:60;14642:12;14656:13;14671:7;14619:22;:60::i;:::-;14581:98;;14694:18;14732:60;14755:13;14770:12;14784:7;14732:22;:60::i;:::-;14694:98;;14834:10;-1:-1:-1;;;;;14821:23:0;:10;-1:-1:-1;;;;;14821:23:0;;:49;;14860:10;14821:49;;;14847:10;14821:49;14809:61;;14532:522;;;;;14915:127;14956:13;14988;15020:7;14915:22;:127::i;:::-;14903:139;;14532:522;13962:1099;;;;;;;:::o;4594:229::-;4731:12;4763:52;4785:6;4793:4;4799:1;4802:12;4763:21;:52::i;:::-;4756:59;4594:229;-1:-1:-1;;;;4594:229:0:o;12780:636::-;12932:17;12982:13;-1:-1:-1;;;;;12966:29:0;:13;-1:-1:-1;;;;;12966:29:0;;12962:111;;;13044:13;;13059;12962:111;13084:20;13120:63;13136:13;-1:-1:-1;;;;;13120:63:0;13151:13;-1:-1:-1;;;;;13120:63:0;-1:-1:-1;;;13120:15:0;:63::i;:::-;13084:99;;13214:194;13242:151;13280:7;13310:12;13361:13;13345;:29;-1:-1:-1;;;;;13242:151:0;:15;:151::i;:::-;13214:9;:194::i;13424:530::-;13576:17;13626:13;-1:-1:-1;;;;;13610:29:0;:13;-1:-1:-1;;;;;13610:29:0;;13606:111;;;13688:13;;13703;13606:111;13748:198;13776:155;13814:7;-1:-1:-1;;;13899:13:0;13883;:29;-1:-1:-1;;;;;13776:155:0;:15;:155::i;5195:552::-;5365:12;5437:5;5412:21;:30;;5390:109;;;;-1:-1:-1;;;5390:109:0;;;;;;;:::i;:::-;5518:18;5529:6;5518:10;:18::i;:::-;5510:60;;;;-1:-1:-1;;;5510:60:0;;;;;;;:::i;:::-;5584:12;5598:23;5638:6;-1:-1:-1;;;;;5638:11:0;5657:5;5664:4;5638:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5583:86;;;;5687:52;5705:7;5714:10;5726:12;5687:17;:52::i;:::-;5680:59;5195:552;-1:-1:-1;;;;;;;5195:552:0:o;12660:112::-;12762:1;-1:-1:-1;;;;;12742:21:0;;;;12734:30;;;;;5755:196;5887:20;5935:8;;;5755:196::o;5959:550::-;6109:12;6138:7;6134:368;;;-1:-1:-1;6169:10:0;6162:17;;6134:368;6216:17;;:21;6212:279;;6319:10;6313:17;6380:15;6367:10;6363:2;6359:19;6352:44;6267:148;6462:12;6455:20;;-1:-1:-1;;;6455:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;14:142:1:-;95:13;;117:33;95:13;117:33;:::i;161:134::-;229:20;;258:31;229:20;258:31;:::i;300:138::-;379:13;;401:31;379:13;401:31;:::i;443:194::-;524:13;;-1:-1:-1;;;;;566:46:1;;556:57;;546:2;;627:1;624;617:12;642:136;711:20;;740:32;711:20;740:32;:::i;783:140::-;863:13;;885:32;863:13;885:32;:::i;928:259::-;;1040:2;1028:9;1019:7;1015:23;1011:32;1008:2;;;1061:6;1053;1046:22;1008:2;1105:9;1092:23;1124:33;1151:5;1124:33;:::i;1192:263::-;;1315:2;1303:9;1294:7;1290:23;1286:32;1283:2;;;1336:6;1328;1321:22;1283:2;1373:9;1367:16;1392:33;1419:5;1392:33;:::i;1460:402::-;;;1589:2;1577:9;1568:7;1564:23;1560:32;1557:2;;;1610:6;1602;1595:22;1557:2;1654:9;1641:23;1673:33;1700:5;1673:33;:::i;:::-;1725:5;-1:-1:-1;1782:2:1;1767:18;;1754:32;1795:35;1754:32;1795:35;:::i;:::-;1849:7;1839:17;;;1547:315;;;;;:::o;1867:470::-;;;;2013:2;2001:9;1992:7;1988:23;1984:32;1981:2;;;2034:6;2026;2019:22;1981:2;2078:9;2065:23;2097:33;2124:5;2097:33;:::i;:::-;2149:5;-1:-1:-1;2206:2:1;2191:18;;2178:32;2219:35;2178:32;2219:35;:::i;:::-;1971:366;;2273:7;;-1:-1:-1;;;2327:2:1;2312:18;;;;2299:32;;1971:366::o;2342:396::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2533:9;2520:23;2552:33;2579:5;2552:33;:::i;:::-;2604:5;-1:-1:-1;2661:2:1;2646:18;;2633:32;2674;2633;2674;:::i;2743:327::-;;;2872:2;2860:9;2851:7;2847:23;2843:32;2840:2;;;2893:6;2885;2878:22;2840:2;2937:9;2924:23;2956:33;2983:5;2956:33;:::i;:::-;3008:5;3060:2;3045:18;;;;3032:32;;-1:-1:-1;;;2830:240:1:o;3075:1793::-;;3222:2;3265;3253:9;3244:7;3240:23;3236:32;3233:2;;;3286:6;3278;3271:22;3233:2;3331:9;3318:23;3360:18;3401:2;3393:6;3390:14;3387:2;;;3422:6;3414;3407:22;3387:2;3465:6;3454:9;3450:22;3440:32;;3510:7;3503:4;3499:2;3495:13;3491:27;3481:2;;3537:6;3529;3522:22;3481:2;3578;3565:16;3600:2;3596;3593:10;3590:2;;;3606:9;3590:2;3637:36;3669:2;3664;3660;3656:11;3652:20;3637:36;:::i;:::-;3707:15;;;3738:12;;;;3770:11;;;3800:4;3831:11;;;3823:20;;3819:29;;3816:42;-1:-1:-1;3813:2:1;;;3876:6;3868;3861:22;3813:2;3903:6;3894:15;;3918:920;3932:2;3929:1;3926:9;3918:920;;;4003:2;3997:3;3988:7;3984:17;3980:26;3977:2;;;4024:6;4016;4009:22;3977:2;4056;4091;4085:9;4137:2;4129:6;4125:15;4194:6;4182:10;4179:22;4174:2;4162:10;4159:18;4156:46;4153:2;;;4205:9;4153:2;4229:22;;4277:17;;-1:-1:-1;;;;;4327:31:1;;4317:42;;4307:2;;4378:6;4370;4363:22;4307:2;4400:21;;4462:12;;;4449:26;4488:33;4449:26;4488:33;:::i;:::-;4541:15;;;4534:32;4603;4622:12;;;4603:32;:::i;:::-;4598:2;4590:6;4586:15;4579:57;4659:2;4649:12;;4698:33;4727:2;4722:3;4718:12;4698:33;:::i;:::-;4681:15;;;4674:58;;;;4745:19;;3950:1;3943:9;;;;;4784:12;;;;4816;;;;3918:920;;;-1:-1:-1;4857:5:1;;3202:1666;-1:-1:-1;;;;;;;;;3202:1666:1:o;4873:257::-;;4993:2;4981:9;4972:7;4968:23;4964:32;4961:2;;;5014:6;5006;4999:22;4961:2;5051:9;5045:16;5070:30;5094:5;5070:30;:::i;5135:212::-;;5282:3;5270:9;5261:7;5257:23;5253:33;5250:2;;;5304:6;5296;5289:22;5250:2;-1:-1:-1;5332:9:1;5240:107;-1:-1:-1;5240:107:1:o;5352:852::-;;5497:3;5485:9;5476:7;5472:23;5468:33;5465:2;;;5519:6;5511;5504:22;5465:2;5557;5551:9;5599:3;5591:6;5587:16;5669:6;5657:10;5654:22;5633:18;5621:10;5618:34;5615:62;5612:2;;;5680:9;5612:2;5711:10;5707:2;5700:22;;5759:9;5746:23;5738:6;5731:39;5831:2;5820:9;5816:18;5803:32;5798:2;5790:6;5786:15;5779:57;5897:2;5886:9;5882:18;5869:32;5864:2;5856:6;5852:15;5845:57;5963:2;5952:9;5948:18;5935:32;5930:2;5922:6;5918:15;5911:57;6018:3;6007:9;6003:19;5990:33;6032;6059:5;6032:33;:::i;:::-;6093:3;6081:16;;6074:31;6167:3;6152:19;;;6139:33;6121:16;;;6114:59;;;;-1:-1:-1;6085:6:1;5455:749;-1:-1:-1;5455:749:1:o;6209:215::-;;6359:3;6347:9;6338:7;6334:23;6330:33;6327:2;;;6381:6;6373;6366:22;6429:787;;6577:3;6565:9;6556:7;6552:23;6548:33;6545:2;;;6599:6;6591;6584:22;6545:2;6637;6631:9;6679:3;6671:6;6667:16;6749:6;6737:10;6734:22;6713:18;6701:10;6698:34;6695:62;6692:2;;;6760:9;6692:2;6791:10;6787:2;6780:22;;6839:9;6826:23;6818:6;6811:39;6911:2;6900:9;6896:18;6883:32;6878:2;6870:6;6866:15;6859:57;6977:2;6966:9;6962:18;6949:32;6944:2;6936:6;6932:15;6925:57;7032:2;7021:9;7017:18;7004:32;7045:33;7072:5;7045:33;:::i;:::-;7106:2;7094:15;;7087:30;7179:3;7164:19;;;7151:33;7133:16;;;7126:59;;;;-1:-1:-1;7098:6:1;6535:681;-1:-1:-1;6535:681:1:o;7221:342::-;;;;7378:2;7366:9;7357:7;7353:23;7349:32;7346:2;;;7399:6;7391;7384:22;7346:2;7427:42;7459:9;7427:42;:::i;:::-;7417:52;;7509:2;7498:9;7494:18;7488:25;7478:35;;7553:2;7542:9;7538:18;7532:25;7522:35;;7336:227;;;;;:::o;7568:257::-;;7679:2;7667:9;7658:7;7654:23;7650:32;7647:2;;;7700:6;7692;7685:22;7647:2;7744:9;7731:23;7763:32;7789:5;7763:32;:::i;7830:1099::-;;;;;;;;8045:3;8033:9;8024:7;8020:23;8016:33;8013:2;;;8067:6;8059;8052:22;8013:2;8104:9;8098:16;8123:33;8150:5;8123:33;:::i;:::-;8225:2;8210:18;;8204:25;8175:5;;-1:-1:-1;8238:33:1;8204:25;8238:33;:::i;:::-;8342:2;8327:18;;8321:25;8290:7;;-1:-1:-1;8355:34:1;8321:25;8355:34;:::i;:::-;8460:2;8445:18;;8439:25;8408:7;;-1:-1:-1;8473:34:1;8439:25;8473:34;:::i;:::-;8578:3;8563:19;;8557:26;8526:7;;-1:-1:-1;8592:34:1;8557:26;8592:34;:::i;:::-;8697:3;8682:19;;8676:26;8645:7;;-1:-1:-1;8746:4:1;8733:18;;8721:31;;8711:2;;8771:6;8763;8756:22;8711:2;8851:3;8836:19;;8830:26;8799:7;;-1:-1:-1;8865:32:1;8830:26;8865:32;:::i;:::-;8916:7;8906:17;;;8003:926;;;;;;;;;;:::o;8934:190::-;;9046:2;9034:9;9025:7;9021:23;9017:32;9014:2;;;9067:6;9059;9052:22;9014:2;-1:-1:-1;9095:23:1;;9004:120;-1:-1:-1;9004:120:1:o;9129:194::-;;9252:2;9240:9;9231:7;9227:23;9223:32;9220:2;;;9273:6;9265;9258:22;9220:2;-1:-1:-1;9301:16:1;;9210:113;-1:-1:-1;9210:113:1:o;9328:404::-;;;;;9502:3;9490:9;9481:7;9477:23;9473:33;9470:2;;;9524:6;9516;9509:22;9470:2;9558:9;9552:16;9542:26;;9587:51;9634:2;9623:9;9619:18;9587:51;:::i;:::-;9678:2;9663:18;;9657:25;9722:2;9707:18;;;9701:25;9460:272;;9577:61;;-1:-1:-1;9460:272:1;-1:-1:-1;;;9460:272:1:o;9737:255::-;;;9877:2;9865:9;9856:7;9852:23;9848:32;9845:2;;;9898:6;9890;9883:22;9845:2;-1:-1:-1;;9926:16:1;;9982:2;9967:18;;;9961:25;9926:16;;9961:25;;-1:-1:-1;9835:157:1:o;9997:1224::-;;;;;;;;;;;;;10303:3;10291:9;10282:7;10278:23;10274:33;10271:2;;;10325:6;10317;10310:22;10271:2;10362:9;10356:16;10412:26;10405:5;10401:38;10394:5;10391:49;10381:2;;10459:6;10451;10444:22;10381:2;10487:5;-1:-1:-1;10511:51:1;10558:2;10543:18;;10511:51;:::i;:::-;10501:61;;10581:51;10628:2;10617:9;10613:18;10581:51;:::i;:::-;10571:61;;10651:51;10698:2;10687:9;10683:18;10651:51;:::i;:::-;10641:61;;10721:51;10767:3;10756:9;10752:19;10721:51;:::i;:::-;10711:61;;10791:50;10836:3;10825:9;10821:19;10791:50;:::i;:::-;10781:60;;10860:50;10905:3;10894:9;10890:19;10860:50;:::i;:::-;10850:60;;10929:52;10976:3;10965:9;10961:19;10929:52;:::i;:::-;10919:62;;11021:3;11010:9;11006:19;11000:26;10990:36;;11066:3;11055:9;11051:19;11045:26;11035:36;;11091:52;11138:3;11127:9;11123:19;11091:52;:::i;:::-;11080:63;;11163:52;11210:3;11199:9;11195:19;11163:52;:::i;:::-;11152:63;;10261:960;;;;;;;;;;;;;;:::o;11226:106::-;-1:-1:-1;;;;;11294:31:1;11282:44;;11272:60::o;11337:93::-;11414:1;11403:20;11391:33;;11381:49::o;11435:94::-;11513:8;11502:20;11490:33;;11480:49::o;11534:274::-;;11701:6;11695:13;11717:53;11763:6;11758:3;11751:4;11743:6;11739:17;11717:53;:::i;:::-;11786:16;;;;;11671:137;-1:-1:-1;;11671:137:1:o;11813:203::-;-1:-1:-1;;;;;11977:32:1;;;;11959:51;;11947:2;11932:18;;11914:102::o;12237:304::-;-1:-1:-1;;;;;12467:15:1;;;12449:34;;12519:15;;12514:2;12499:18;;12492:43;12399:2;12384:18;;12366:175::o;12546:388::-;-1:-1:-1;;;;;12802:15:1;;;12784:34;;12854:15;;;;12849:2;12834:18;;12827:43;12918:8;12906:21;;;12901:2;12886:18;;12879:49;12734:2;12719:18;;12701:233::o;12939:375::-;-1:-1:-1;;;;;13197:15:1;;;13179:34;;13249:15;;;;13244:2;13229:18;;13222:43;13296:2;13281:18;;13274:34;;;;13129:2;13114:18;;13096:218::o;13319:274::-;-1:-1:-1;;;;;13511:32:1;;;;13493:51;;13575:2;13560:18;;13553:34;13481:2;13466:18;;13448:145::o;13598:187::-;13763:14;;13756:22;13738:41;;13726:2;13711:18;;13693:92::o;13790:383::-;;13939:2;13928:9;13921:21;13971:6;13965:13;14014:6;14009:2;13998:9;13994:18;13987:34;14030:66;14089:6;14084:2;14073:9;14069:18;14064:2;14056:6;14052:15;14030:66;:::i;:::-;14157:2;14136:15;-1:-1:-1;;14132:29:1;14117:45;;;;14164:2;14113:54;;13911:262;-1:-1:-1;;13911:262:1:o;14178:349::-;14380:2;14362:21;;;14419:2;14399:18;;;14392:30;14458:27;14453:2;14438:18;;14431:55;14518:2;14503:18;;14352:175::o;14532:350::-;14734:2;14716:21;;;14773:2;14753:18;;;14746:30;14812:28;14807:2;14792:18;;14785:56;14873:2;14858:18;;14706:176::o;14887:339::-;15089:2;15071:21;;;15128:2;15108:18;;;15101:30;-1:-1:-1;;;15162:2:1;15147:18;;15140:45;15217:2;15202:18;;15061:165::o;15231:346::-;15433:2;15415:21;;;15472:2;15452:18;;;15445:30;-1:-1:-1;;;15506:2:1;15491:18;;15484:52;15568:2;15553:18;;15405:172::o;15582:344::-;15784:2;15766:21;;;15823:2;15803:18;;;15796:30;-1:-1:-1;;;15857:2:1;15842:18;;15835:50;15917:2;15902:18;;15756:170::o;15931:337::-;16133:2;16115:21;;;16172:2;16152:18;;;16145:30;-1:-1:-1;;;16206:2:1;16191:18;;16184:43;16259:2;16244:18;;16105:163::o;16273:342::-;16475:2;16457:21;;;16514:2;16494:18;;;16487:30;-1:-1:-1;;;16548:2:1;16533:18;;16526:48;16606:2;16591:18;;16447:168::o;16620:354::-;16822:2;16804:21;;;16861:2;16841:18;;;16834:30;16900:32;16895:2;16880:18;;16873:60;16965:2;16950:18;;16794:180::o;16979:344::-;17181:2;17163:21;;;17220:2;17200:18;;;17193:30;-1:-1:-1;;;17254:2:1;17239:18;;17232:50;17314:2;17299:18;;17153:170::o;17328:350::-;17530:2;17512:21;;;17569:2;17549:18;;;17542:30;17608:28;17603:2;17588:18;;17581:56;17669:2;17654:18;;17502:176::o;17683:338::-;17885:2;17867:21;;;17924:2;17904:18;;;17897:30;-1:-1:-1;;;17958:2:1;17943:18;;17936:44;18012:2;17997:18;;17857:164::o;18026:338::-;18228:2;18210:21;;;18267:2;18247:18;;;18240:30;-1:-1:-1;;;18301:2:1;18286:18;;18279:44;18355:2;18340:18;;18200:164::o;18369:348::-;18571:2;18553:21;;;18610:2;18590:18;;;18583:30;18649:26;18644:2;18629:18;;18622:54;18708:2;18693:18;;18543:174::o;18722:324::-;18924:2;18906:21;;;18963:1;18943:18;;;18936:29;-1:-1:-1;;;18996:2:1;18981:18;;18974:31;19037:2;19022:18;;18896:150::o;19051:344::-;19253:2;19235:21;;;19292:2;19272:18;;;19265:30;-1:-1:-1;;;19326:2:1;19311:18;;19304:50;19386:2;19371:18;;19225:170::o;19400:348::-;19602:2;19584:21;;;19641:2;19621:18;;;19614:30;19680:26;19675:2;19660:18;;19653:54;19739:2;19724:18;;19574:174::o;19753:347::-;19955:2;19937:21;;;19994:2;19974:18;;;19967:30;20033:25;20028:2;20013:18;;20006:53;20091:2;20076:18;;19927:173::o;20105:344::-;20307:2;20289:21;;;20346:2;20326:18;;;20319:30;-1:-1:-1;;;20380:2:1;20365:18;;20358:50;20440:2;20425:18;;20279:170::o;20454:355::-;20656:2;20638:21;;;20695:2;20675:18;;;20668:30;20734:33;20729:2;20714:18;;20707:61;20800:2;20785:18;;20628:181::o;20814:352::-;21016:2;20998:21;;;21055:2;21035:18;;;21028:30;21094;21089:2;21074:18;;21067:58;21157:2;21142:18;;20988:178::o;21171:353::-;21373:2;21355:21;;;21412:2;21392:18;;;21385:30;21451:31;21446:2;21431:18;;21424:59;21515:2;21500:18;;21345:179::o;21529:332::-;21731:2;21713:21;;;21770:1;21750:18;;;21743:29;-1:-1:-1;;;21803:2:1;21788:18;;21781:39;21852:2;21837:18;;21703:158::o;21866:353::-;22068:2;22050:21;;;22107:2;22087:18;;;22080:30;22146:31;22141:2;22126:18;;22119:59;22210:2;22195:18;;22040:179::o;22224:344::-;22426:2;22408:21;;;22465:2;22445:18;;;22438:30;-1:-1:-1;;;22499:2:1;22484:18;;22477:50;22559:2;22544:18;;22398:170::o;22573:345::-;22775:2;22757:21;;;22814:2;22794:18;;;22787:30;-1:-1:-1;;;22848:2:1;22833:18;;22826:51;22909:2;22894:18;;22747:171::o;22923:336::-;23125:2;23107:21;;;23164:2;23144:18;;;23137:30;-1:-1:-1;;;23198:2:1;23183:18;;23176:42;23250:2;23235:18;;23097:162::o;23264:572::-;23489:13;;23471:32;;23563:4;23551:17;;;23545:24;-1:-1:-1;;;;;23541:50:1;23519:20;;;23512:80;23639:4;23627:17;;;23621:24;-1:-1:-1;;;;;23736:21:1;;;23714:20;;;23707:51;;;;23818:4;23806:17;;;23800:24;23796:33;23774:20;;;23767:63;;;;23458:3;23443:19;;23425:411::o;23841:558::-;;24055:3;24044:9;24040:19;24032:27;;24092:6;24086:13;24075:9;24068:32;-1:-1:-1;;;;;24160:4:1;24152:6;24148:17;24142:24;24138:65;24131:4;24120:9;24116:20;24109:95;24260:4;24252:6;24248:17;24242:24;24235:4;24224:9;24220:20;24213:54;24323:4;24315:6;24311:17;24305:24;24298:4;24287:9;24283:20;24276:54;24386:4;24378:6;24374:17;24368:24;24361:4;24350:9;24346:20;24339:54;24022:377;;;;:::o;24404:793::-;24689:13;;-1:-1:-1;;;;;24685:22:1;;;24667:41;;24768:4;24756:17;;;24750:24;24746:33;;24724:20;;;24717:63;24840:4;24828:17;;;24822:24;24848:8;24818:39;24796:20;;;24789:69;24918:4;24906:17;;;24900:24;24896:33;;24874:20;;;24867:63;24986:4;24974:17;;;24968:24;24946:20;;;24939:54;24647:3;25037:17;;;25031:24;25009:20;;;25002:54;25112:4;25100:17;;;25094:24;25072:20;;;25065:54;25179:4;25167:17;;;25161:24;25157:33;25135:20;;;25128:63;;;;24616:3;24601:19;;24583:614::o;25202:580::-;;25416:3;25405:9;25401:19;25393:27;;25453:6;25447:13;25436:9;25429:32;25517:4;25509:6;25505:17;25499:24;25492:4;25481:9;25477:20;25470:54;25580:4;25572:6;25568:17;25562:24;25555:4;25544:9;25540:20;25533:54;25643:4;25635:6;25631:17;25625:24;25618:4;25607:9;25603:20;25596:54;25706:4;25698:6;25694:17;25688:24;25681:4;25670:9;25666:20;25659:54;25769:4;25761:6;25757:17;25751:24;25744:4;25733:9;25729:20;25722:54;25383:399;;;;:::o;25787:1230::-;;25973:3;25962:9;25958:19;25950:27;;25986:46;26022:9;26013:6;26007:13;25986:46;:::i;:::-;26079:4;26071:6;26067:17;26061:24;26094:56;26144:4;26133:9;26129:20;26115:12;26094:56;:::i;:::-;;26199:4;26191:6;26187:17;26181:24;26214:57;26265:4;26254:9;26250:20;26234:14;26214:57;:::i;:::-;;26320:4;26312:6;26308:17;26302:24;26335:56;26385:4;26374:9;26370:20;26354:14;26335:56;:::i;:::-;;26440:4;26432:6;26428:17;26422:24;26455:56;26505:4;26494:9;26490:20;26474:14;26455:56;:::i;:::-;;26567:4;26559:6;26555:17;26549:24;26542:4;26531:9;26527:20;26520:54;26630:4;26622:6;26618:17;26612:24;26605:4;26594:9;26590:20;26583:54;26693:4;26685:6;26681:17;26675:24;26668:4;26657:9;26653:20;26646:54;26719:6;26779:2;26771:6;26767:15;26761:22;26756:2;26745:9;26741:18;26734:50;;26803:6;26858:2;26850:6;26846:15;26840:22;26871:56;26923:2;26912:9;26908:18;26892:14;26871:56;:::i;:::-;-1:-1:-1;;26946:6:1;26994:15;;;26988:22;26968:18;;;;26961:50;25940:1077;:::o;27022:360::-;-1:-1:-1;;;;;27242:47:1;;;;27224:66;;27321:2;27306:18;;27299:34;;;;27364:2;27349:18;;27342:34;27212:2;27197:18;;27179:203::o;27387:188::-;27561:6;27549:19;;;;27531:38;;27519:2;27504:18;;27486:89::o;27580:203::-;-1:-1:-1;;;;;27744:32:1;;;;27726:51;;27714:2;27699:18;;27681:102::o;27788:452::-;-1:-1:-1;;;;;28027:32:1;;;;28009:51;;28107:1;28096:21;;;28091:2;28076:18;;28069:49;28154:21;;28149:2;28134:18;;28127:49;28224:8;28212:21;28207:2;28192:18;;28185:49;27996:3;27981:19;;27963:277::o;28245:190::-;28419:8;28407:21;;;;28389:40;;28377:2;28362:18;;28344:91::o;28440:177::-;28586:25;;;28574:2;28559:18;;28541:76::o;28622:184::-;28794:4;28782:17;;;;28764:36;;28752:2;28737:18;;28719:87::o;28811:242::-;28881:2;28875:9;28911:17;;;28958:18;28943:34;;28979:22;;;28940:62;28937:2;;;29005:9;28937:2;29032;29025:22;28855:198;;-1:-1:-1;28855:198:1:o;29058:258::-;29130:1;29140:113;29154:6;29151:1;29148:13;29140:113;;;29230:11;;;29224:18;29211:11;;;29204:39;29176:2;29169:10;29140:113;;;29271:6;29268:1;29265:13;29262:2;;;-1:-1:-1;;29306:1:1;29288:16;;29281:27;29111:205::o;29321:133::-;-1:-1:-1;;;;;29398:31:1;;29388:42;;29378:2;;29444:1;29441;29434:12;29459:120;29547:5;29540:13;29533:21;29526:5;29523:32;29513:2;;29569:1;29566;29559:12;29584:120;29673:5;29670:1;29659:20;29652:5;29649:31;29639:2;;29694:1;29691;29684:12;29709:119;29796:6;29789:5;29785:18;29778:5;29775:29;29765:2;;29818:1;29815;29808:12;29833:121;29920:8;29913:5;29909:20;29902:5;29899:31;29889:2;;29944:1;29941;29934:12
Swarm Source
ipfs://ad84bd06f54db961ddb6ca46322547761e9824cb8eccf6e929a77810e6829588
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,325.07 | 0.7198 | $2,393.24 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.