Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact ETH F... | 1465768 | 29 hrs ago | IN | 2,000 S | 0.00072513 | ||||
Swap Exact Token... | 1444430 | 33 hrs ago | IN | 0 S | 0.0011749 | ||||
Swap Exact Token... | 1354038 | 2 days ago | IN | 0 S | 0.00069294 | ||||
Swap Exact ETH F... | 1338941 | 2 days ago | IN | 10 S | 0.00072921 | ||||
Swap Exact Token... | 1338707 | 2 days ago | IN | 0 S | 0.00069294 | ||||
Swap Exact ETH F... | 1338661 | 2 days ago | IN | 7 S | 0.00072921 | ||||
Swap Exact ETH F... | 1256925 | 2 days ago | IN | 1,000 S | 0.00116165 | ||||
Swap Exact ETH F... | 1255911 | 2 days ago | IN | 100 S | 0.00097232 | ||||
Swap Exact ETH F... | 1203603 | 3 days ago | IN | 40 S | 0.00048631 | ||||
Swap Exact ETH F... | 907080 | 5 days ago | IN | 97 S | 0.00067761 | ||||
Swap Exact ETH F... | 896504 | 5 days ago | IN | 207 S | 0.00067761 | ||||
Swap Exact ETH F... | 847950 | 5 days ago | IN | 0.1337 S | 0.00031832 |
Latest 15 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1465768 | 29 hrs ago | 2,000 S | ||||
1444430 | 33 hrs ago | 1,616.67520388 S | ||||
1444430 | 33 hrs ago | 1,616.67520388 S | ||||
1354038 | 2 days ago | 7.27358391 S | ||||
1354038 | 2 days ago | 7.27358391 S | ||||
1338941 | 2 days ago | 10 S | ||||
1338707 | 2 days ago | 6.86074267 S | ||||
1338707 | 2 days ago | 6.86074267 S | ||||
1338661 | 2 days ago | 7 S | ||||
1256925 | 2 days ago | 1,000 S | ||||
1255911 | 2 days ago | 100 S | ||||
1203603 | 3 days ago | 40 S | ||||
907080 | 5 days ago | 97 S | ||||
896504 | 5 days ago | 207 S | ||||
847950 | 5 days ago | 0.1337 S |
Loading...
Loading
Contract Name:
Router02
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-20 */ /**0x5e9d25014d01323d6f8c0c6640572e4444d11c94 *v3.0.1 *Submitted for verification at basescan.org on 2023-09-23 */ // SPDX-License-Identifier: Unlicensed // Solidly Extended - Router Staker // ftm.guru's extension of Solidly Extended to Stake Liquidity into Gauge, directly. // Solidly Extended // ftm.guru's extension of Solidly's periphery (Router) // https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol // // BaseV1Router02.sol : Supporting Fee-on-transfer Tokens // https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol /**v1.3.17 *0x2aa07920E4ecb4ea8C801D9DFEce63875623B285 *Submitted for verification at FtmScan.com on 2023-04-03 */ /**v1.1.0 *0x1A05EB736873485655F29a37DEf8a0AA87F5a447 *Submitted for verification at FtmScan.com on 2022-11-18 */ /** * EQUALIZER EXCHANGE * The New Liquidity Hub of Fantom chain! * https://equalizer.exchange (Dapp) * https://discord.gg/MaMhbgHMby (Community) * * * * Version: 1.3.17 * - Add Support for Fee-on-Transfer tokens (Original work Based on "Solidly Extended" by ftm.guru) * - Remove "calculation" of Pair Address and instead use Factory.pairFor * * * Contributors: * - Andre Cronje, Solidly.Exchange * - 543#3017 (Sam), ftm.guru & Equalizer.exchange * * */ /** *Submitted for verification at FtmScan.com on 2022-02-20 */ // ftm.guru's extension of Solidly's periphery (Router) // https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol // BaseV1Router02.sol : Supporting Fee-on-transfer Tokens // https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol pragma solidity 0.8.9; // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: contracts/interfaces/IERC20.sol interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); } // File: contracts/interfaces/IPair.sol interface IPair { function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); function stable() external view returns (bool); } // File: contracts/interfaces/IPairFactory.sol interface IPairFactory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function isPaused() external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function getInitializable() external view returns (address, address, bool); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); } // File: contracts/interfaces/IRouter.sol interface IRouter { function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair); function swapExactTokensForTokensSimple(uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline) external returns (uint[] memory amounts); function getAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) external view returns (uint amount); function getReserves(address tokenA, address tokenB, bool stable) external view returns (uint, uint); function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint, uint, uint); } // File: contracts/interfaces/IWETH.sol interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } // Solidly - Router02 // ftm.guru's extension of Solidly supporting Fee-on-Transfer tokens contract Router02 is IRouter { struct Route { address from; address to; bool stable; } address public immutable factory; IWETH public immutable weth; uint internal constant MINIMUM_LIQUIDITY = 10**3; bytes32 public immutable pairCodeHash; modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'Equalizer Router: EXPIRED'); _; } constructor(address _factory, address _weth) { factory = _factory; pairCodeHash = IPairFactory(_factory).pairCodeHash(); weth = IWETH(_weth); } // @dev only accept ETH via fallback from the WETH contract receive() external payable { assert(msg.sender == address(weth)); } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, 'Equalizer Router: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'Equalizer Router: ZERO_ADDRESS'); } // @dev calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { /* (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint256(keccak256(abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1, stable)), pairCodeHash // init code hash ))))); */ return IPairFactory(factory).getPair(tokenA,tokenB,stable); } // @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) { require(amountA > 0, 'Equalizer Router: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'Equalizer Router: INSUFFICIENT_LIQUIDITY'); amountB = amountA * reserveB / reserveA; } // @dev fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1,) = IPair(pairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // @dev performs comparision of getAmountOut calculations on a pair (not pool) of tokens & returns best pool (stable or not) and amountOut function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) { address pair = pairFor(tokenIn, tokenOut, true); uint amountStable; uint amountVolatile; if (IPairFactory(factory).isPair(pair)) { amountStable = IPair(pair).getAmountOut(amountIn, tokenIn); } pair = pairFor(tokenIn, tokenOut, false); if (IPairFactory(factory).isPair(pair)) { amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } // @dev performs getAmountOut calculation for a specific pair function getAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) public view returns (uint amount) { address pair = pairFor(tokenIn, tokenOut, stable); if (IPairFactory(factory).isPair(pair)) { amount = IPair(pair).getAmountOut(amountIn, tokenIn); } } // @dev performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint amountIn, Route[] memory routes) public view returns (uint[] memory amounts) { require(routes.length >= 1, 'Equalizer Router: INVALID_PATH'); amounts = new uint[](routes.length+1); amounts[0] = amountIn; for (uint i = 0; i < routes.length; i++) { address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable); if (IPairFactory(factory).isPair(pair)) { amounts[i+1] = IPair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) external view returns (bool) { return IPairFactory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); (uint reserveA, uint reserveB) = (0,0); uint _totalSupply = 0; if (_pair != address(0)) { _totalSupply = IERC20(_pair).totalSupply(); (reserveA, reserveB) = getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB); } } } function quoteRemoveLiquidity( address tokenA, address tokenB, bool stable, uint liquidity ) external view returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0,0); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); uint _totalSupply = IERC20(_pair).totalSupply(); amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution } function _addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal returns (uint amountA, uint amountB) { require(amountADesired >= amountAMin, "Equalizer Router: invalid desired amountA"); require(amountBDesired >= amountBMin, "Equalizer Router: invalid desired amountB"); // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'Equalizer Router: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, 'Equalizer Router: INSUFFICIENT_A_AMOUNT'); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = pairFor(tokenA, tokenB, stable); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IPair(pair).mint(to); } function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity( token, address(weth), stable, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = pairFor(token, address(weth), stable); _safeTransferFrom(token, msg.sender, pair, amountToken); weth.deposit{value: amountETH}(); assert(weth.transfer(pair, amountETH)); liquidity = IPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH); } // @dev **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) public ensure(deadline) returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); require(IPair(pair).transferFrom(msg.sender, pair, liquidity), "Equalizer Router: liquidity transfer failed"); // send liquidity to pair (uint amount0, uint amount1) = IPair(pair).burn(to); (address token0,) = sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, 'Equalizer Router: INSUFFICIENT_A_AMOUNT'); require(amountB >= amountBMin, 'Equalizer Router: INSUFFICIENT_B_AMOUNT'); } function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(weth), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, amountToken); weth.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint value = approveMax ? type(uint).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(weth), stable); uint value = approveMax ? type(uint).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline); } // @dev **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, Route[] memory routes, address _to) internal virtual { for (uint i = 0; i < routes.length; i++) { (address token0,) = sortTokens(routes[i].from, routes[i].to); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to; IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external ensure(deadline) returns (uint[] memory amounts) { Route[] memory routes = new Route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, to); } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) returns (uint[] memory amounts) { amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, to); } function swapExactETHForTokens(uint amountOutMin, Route[] calldata routes, address to, uint deadline) external payable ensure(deadline) returns (uint[] memory amounts) { require(routes[0].from == address(weth), 'Equalizer Router: INVALID_PATH'); amounts = getAmountsOut(msg.value, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'); weth.deposit{value: amounts[0]}(); assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0])); _swap(amounts, routes, to); } function swapExactTokensForETH(uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline) external ensure(deadline) returns (uint[] memory amounts) { require(routes[routes.length - 1].to == address(weth), 'Equalizer Router: INVALID_PATH'); amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, address(this)); weth.withdraw(amounts[amounts.length - 1]); _safeTransferETH(to, amounts[amounts.length - 1]); } function UNSAFE_swapExactTokensForTokens( uint[] memory amounts, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) returns (uint[] memory) { _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); return amounts; } /*************************************************************************************************************************** *************************************************************************************************************************** ** Experimental Extension [ftm.guru/solidly/BaseV1Router02] *************************************************************************************************************************** */ // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)**** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(weth), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, IERC20(token).balanceOf(address(this))); weth.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(weth), stable); uint value = approveMax ? type(uint).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens( token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(Route[] calldata routes, address _to) internal virtual { for (uint i; i < routes.length; i++) { //(address input, address output) = (routes[i].from, routes[i].to); (address token0,) = sortTokens(routes[i].from, routes[i].to); IPair pair = IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1,) = pair.getReserves(); (uint reserveInput,) = routes[i].from == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(routes[i].from).balanceOf(address(pair)) - (reserveInput); amountOutput = getAmountOut(amountInput, routes[i].from, routes[i].to, routes[i].stable); } (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) { _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn ); uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( IERC20(routes[routes.length - 1].to).balanceOf(to) - (balanceBefore) >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external payable ensure(deadline) { require(routes[0].from == address(weth), 'Equalizer Router: INVALID_PATH'); uint amountIn = msg.value; weth.deposit{value: amountIn}(); assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( IERC20(routes[routes.length - 1].to).balanceOf(to) - (balanceBefore) >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external ensure(deadline) { require(routes[routes.length - 1].to == address(weth), 'Equalizer Router: INVALID_PATH'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn ); _swapSupportingFeeOnTransferTokens(routes, address(this)); uint amountOut = IERC20(address(weth)).balanceOf(address(this)); require(amountOut >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'); weth.withdraw(amountOut); _safeTransferETH(to, amountOut); } // Internal helper Functions function _safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0, "Equalizer Router: invalid token contract"); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Equalizer Router: safeTransfer failed"); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0, "Equalizer Router: invalid token contract"); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Equalizer Router: safeTransferFrom failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairCodeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router02.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162004e5038038062004e508339810160408190526200003491620000e8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab924891600480820192602092909190829003018186803b1580156200007a57600080fd5b505afa1580156200008f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b5919062000120565b60c0526001600160a01b031660a052506200013a565b80516001600160a01b0381168114620000e357600080fd5b919050565b60008060408385031215620000fc57600080fd5b6200010783620000cb565b91506200011760208401620000cb565b90509250929050565b6000602082840312156200013357600080fd5b5051919050565b60805160a05160c051614c0d6200024360003960006104da0152600081816101cb0152818161029801528181610ab001528181610cef01528181610f5e0152818161163a0152818161174d015281816117db01528181611c8801528181611d0601528181611d7a01528181611f980152818161204b01528181612105015281816127180152818161274e015281816127830152818161281801528181612975015281816129c501528181612b880152612e2f01526000818161054f01528181610dd501528181611046015281816112f601528181611428015281816122890152818161241b01528181612a7001528181612c5e0152818161344601526134f60152614c0d6000f3fe6080604052600436106101bb5760003560e01c806376c72751116100ec578063c45a01551161008a578063e2d9d4dc11610064578063e2d9d4dc146105b1578063e5e31b13146105d1578063f41766d814610601578063fe411f141461062157600080fd5b8063c45a01551461053d578063d7b0e0a514610571578063da2142311461059157600080fd5b806398a0fb3c116100c657806398a0fb3c146104a85780639aab9248146104c8578063a32b1fcd1461050a578063b7e0d4c01461052a57600080fd5b806376c72751146104555780637af728c8146104685780639881fcb41461048857600080fd5b8063544caa56116101595780635e60dab5116101335780635e60dab5146103e257806367ffb66a146104025780636cc1ae13146104155780637301e3c81461043557600080fd5b8063544caa56146103325780635a47ddc3146103725780635e1e6325146103ad57600080fd5b80633fc8cef3116101955780633fc8cef3146102865780634386e63c146102d2578063448725b4146102f25780634c1ee03e1461031257600080fd5b80630dede6c4146101ff57806313dcfc591461023957806318a130861461026657600080fd5b366101fa57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101f8576101f8613e65565b005b600080fd5b34801561020b57600080fd5b5061021f61021a366004613eb1565b610641565b604080519283526020830191909152015b60405180910390f35b34801561024557600080fd5b50610259610254366004613f36565b610870565b6040516102309190613fb1565b34801561027257600080fd5b5061025961028136600461403a565b610a83565b34801561029257600080fd5b506102ba7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610230565b3480156102de57600080fd5b5061021f6102ed3660046140ad565b610dce565b3480156102fe57600080fd5b5061021f61030d36600461410f565b610f53565b34801561031e57600080fd5b506102ba61032d3660046141b9565b61102c565b34801561033e57600080fd5b5061035261034d366004614204565b6110d7565b604080516001600160a01b03938416815292909116602083015201610230565b34801561037e57600080fd5b5061039261038d36600461423d565b6111cf565b60408051938452602084019290925290820152606001610230565b3480156103b957600080fd5b506103cd6103c83660046142cc565b6112be565b60408051928352901515602083015201610230565b3480156103ee57600080fd5b5061021f6103fd3660046141b9565b61154e565b610259610410366004614303565b611615565b34801561042157600080fd5b506101f861043036600461403a565b611983565b34801561044157600080fd5b506102596104503660046143d5565b611b8f565b6101f8610463366004614303565b611c65565b34801561047457600080fd5b506101f861048336600461403a565b611f6d565b34801561049457600080fd5b506102596104a3366004614517565b612173565b3480156104b457600080fd5b506103926104c33660046145bd565b612413565b3480156104d457600080fd5b506104fc7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610230565b34801561051657600080fd5b5061021f610525366004614618565b612631565b6103926105383660046146d4565b6126ec565b34801561054957600080fd5b506102ba7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057d57600080fd5b5061021f61058c3660046146d4565b61294b565b34801561059d57600080fd5b506104fc6105ac36600461472f565b612a40565b3480156105bd57600080fd5b5061021f6105cc36600461410f565b612b7d565b3480156105dd57600080fd5b506105f16105ec366004614782565b612c3c565b6040519015158152602001610230565b34801561060d57600080fd5b5061025961061c36600461403a565b612ce0565b34801561062d57600080fd5b5061021f61063c3660046146d4565b612e05565b600080824281101561066e5760405162461bcd60e51b81526004016106659061479f565b60405180910390fd5b600061067b8c8c8c61102c565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156106cc57600080fd5b505af11580156106e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070491906147d6565b6107645760405162461bcd60e51b815260206004820152602b60248201527f457175616c697a657220526f757465723a206c6971756964697479207472616e60448201526a1cd9995c8819985a5b195960aa1b6064820152608401610665565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156107ab57600080fd5b505af11580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906147f3565b9150915060006107f38f8f6110d7565b509050806001600160a01b03168f6001600160a01b031614610816578183610819565b82825b90975095508a87101561083e5760405162461bcd60e51b815260040161066590614817565b8986101561085e5760405162461bcd60e51b81526004016106659061485e565b50505050509850989650505050505050565b606081428110156108935760405162461bcd60e51b81526004016106659061479f565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816108aa57905050905087816000815181106108ed576108ed6148a5565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508681600081518110610925576109256148a5565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061095d5761095d6148a5565b602090810291909101015190151560409091015261097b8a82612173565b925088836001855161098d91906148d1565b8151811061099d5761099d6148a5565b602002602001015110156109c35760405162461bcd60e51b8152600401610665906148e8565b610a6b816000815181106109d9576109d96148a5565b60200260200101516000015133610a4b846000815181106109fc576109fc6148a5565b60200260200101516000015185600081518110610a1b57610a1b6148a5565b60200260200101516020015186600081518110610a3a57610a3a6148a5565b60200260200101516040015161102c565b86600081518110610a5e57610a5e6148a5565b6020026020010151612ee2565b610a76838287613042565b5050979650505050505050565b60608142811015610aa65760405162461bcd60e51b81526004016106659061479f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610add6001826148d1565b818110610aec57610aec6148a5565b9050606002016020016020810190610b049190614782565b6001600160a01b031614610b2a5760405162461bcd60e51b815260040161066590614934565b610b86888787808060200260200160405190810160405280939291908181526020016000905b82821015610b7c57610b6d6060830286013681900381019061496b565b81526020019060010190610b50565b5050505050612173565b9150868260018451610b9891906148d1565b81518110610ba857610ba86148a5565b60200260200101511015610bce5760405162461bcd60e51b8152600401610665906148e8565b610c9086866000818110610be457610be46148a5565b610bfa9260206060909202019081019150614782565b33610c7d89896000818110610c1157610c116148a5565b610c279260206060909202019081019150614782565b8a8a6000818110610c3a57610c3a6148a5565b9050606002016020016020810190610c529190614782565b8b8b6000818110610c6557610c656148a5565b905060600201604001602081019061032d9190614987565b85600081518110610a5e57610a5e6148a5565b610ced828787808060200260200160405190810160405280939291908181526020016000905b82821015610ce257610cd36060830286013681900381019061496b565b81526020019060010190610cb6565b505050505030613042565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610d2b91906148d1565b81518110610d3b57610d3b6148a5565b60200260200101516040518263ffffffff1660e01b8152600401610d6191815260200190565b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b50505050610dc3848360018551610da691906148d1565b81518110610db657610db66148a5565b6020026020010151613297565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610e23939291906149a4565b60206040518083038186803b158015610e3b57600080fd5b505afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7391906149c8565b90506001600160a01b038116610e90576000809250925050610f4a565b600080610e9e89898961154e565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610edd57600080fd5b505afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906149e5565b905080610f2284896149fe565b610f2c9190614a33565b955080610f3983896149fe565b610f439190614a33565b9450505050505b94509492505050565b6000806000610f838e7f00000000000000000000000000000000000000000000000000000000000000008f61102c565b9050600087610f92578c610f96565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610fd1903390309086908f908e908e908e90600401614a55565b600060405180830381600087803b158015610feb57600080fd5b505af1158015610fff573d6000803e3d6000fd5b505050506110128f8f8f8f8f8f8f61294b565b809450819550505050509b509b9950505050505050505050565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc309061107f908790879087906004016149a4565b60206040518083038186803b15801561109757600080fd5b505afa1580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906149c8565b949350505050565b600080826001600160a01b0316846001600160a01b0316141561114a5760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a204944454e544943414c5f41444452604482015264455353455360d81b6064820152608401610665565b826001600160a01b0316846001600160a01b03161061116a57828461116d565b83835b90925090506001600160a01b0382166111c85760405162461bcd60e51b815260206004820152601e60248201527f457175616c697a657220526f757465723a205a45524f5f4144445245535300006044820152606401610665565b9250929050565b600080600083428110156111f55760405162461bcd60e51b81526004016106659061479f565b6112048d8d8d8d8d8d8d613365565b909450925060006112168e8e8e61102c565b90506112248e338388612ee2565b6112308d338387612ee2565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ab91906149e5565b9250505099509950999650505050505050565b60008060006112cf8585600161102c565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561133a57600080fd5b505afa15801561134e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137291906147d6565b156113fa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f791906149e5565b91505b6114068787600061102c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a491906147d6565b1561152c576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156114f157600080fd5b505afa158015611505573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152991906149e5565b90505b80821161153b5780600061153f565b8160015b94509450505050935093915050565b600080600061155d86866110d7565b50905060008061156e88888861102c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156115a657600080fd5b505afa1580156115ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115de9190614a96565b5091509150826001600160a01b0316886001600160a01b031614611603578082611606565b81815b90999098509650505050505050565b606081428110156116385760405162461bcd60e51b81526004016106659061479f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611675576116756148a5565b61168b9260206060909202019081019150614782565b6001600160a01b0316146116b15760405162461bcd60e51b815260040161066590614934565b611703348787808060200260200160405190810160405280939291908181526020016000905b82821015610b7c576116f46060830286013681900381019061496b565b815260200190600101906116d7565b915086826001845161171591906148d1565b81518110611725576117256148a5565b6020026020010151101561174b5760405162461bcd60e51b8152600401610665906148e8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061178d5761178d6148a5565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156117c057600080fd5b505af11580156117d4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118728888600081811061181e5761181e6148a5565b6118349260206060909202019081019150614782565b89896000818110611847576118476148a5565b905060600201602001602081019061185f9190614782565b8a8a6000818110610c6557610c656148a5565b84600081518110611885576118856148a5565b60200260200101516040518363ffffffff1660e01b81526004016118be9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156118d857600080fd5b505af11580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191091906147d6565b61191c5761191c613e65565b611979828787808060200260200160405190810160405280939291908181526020016000905b8282101561196e5761195f6060830286013681900381019061496b565b81526020019060010190611942565b505050505086613042565b5095945050505050565b80428110156119a45760405162461bcd60e51b81526004016106659061479f565b6119ed858560008181106119ba576119ba6148a5565b6119d09260206060909202019081019150614782565b336119e78888600081811061181e5761181e6148a5565b8a612ee2565b600085856119fc6001826148d1565b818110611a0b57611a0b6148a5565b9050606002016020016020810190611a239190614782565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e91906149e5565b9050611aab86868661364b565b86818787611aba6001826148d1565b818110611ac957611ac96148a5565b9050606002016020016020810190611ae19190614782565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b158015611b2557600080fd5b505afa158015611b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5d91906149e5565b611b6791906148d1565b1015611b855760405162461bcd60e51b8152600401610665906148e8565b5050505050505050565b60608142811015611bb25760405162461bcd60e51b81526004016106659061479f565b611c0886866000818110611bc857611bc86148a5565b611bde9260206060909202019081019150614782565b33611bf589896000818110610c1157610c116148a5565b8a600081518110610a5e57610a5e6148a5565b611c5a878787808060200260200160405190810160405280939291908181526020016000905b8282101561196e57611c4b6060830286013681900381019061496b565b81526020019060010190611c2e565b509495945050505050565b8042811015611c865760405162461bcd60e51b81526004016106659061479f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611cc357611cc36148a5565b611cd99260206060909202019081019150614782565b6001600160a01b031614611cff5760405162461bcd60e51b815260040161066590614934565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d5f57600080fd5b505af1158015611d73573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611dbd8888600081811061181e5761181e6148a5565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611e0557600080fd5b505af1158015611e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3d91906147d6565b611e4957611e49613e65565b60008686611e586001826148d1565b818110611e6757611e676148a5565b9050606002016020016020810190611e7f9190614782565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b158015611ec257600080fd5b505afa158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa91906149e5565b9050611f0787878761364b565b87818888611f166001826148d1565b818110611f2557611f256148a5565b9050606002016020016020810190611f3d9190614782565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401611b0d565b8042811015611f8e5760405162461bcd60e51b81526004016106659061479f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611fc56001826148d1565b818110611fd457611fd46148a5565b9050606002016020016020810190611fec9190614782565b6001600160a01b0316146120125760405162461bcd60e51b815260040161066590614934565b612028858560008181106119ba576119ba6148a5565b61203385853061364b565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561209557600080fd5b505afa1580156120a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cd91906149e5565b9050868110156120ef5760405162461bcd60e51b8152600401610665906148e8565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561215157600080fd5b505af1158015612165573d6000803e3d6000fd5b50505050611b858482613297565b60606001825110156121975760405162461bcd60e51b815260040161066590614934565b81516121a4906001614ac4565b67ffffffffffffffff8111156121bc576121bc61436a565b6040519080825280602002602001820160405280156121e5578160200160208202803683370190505b50905082816000815181106121fc576121fc6148a5565b60200260200101818152505060005b825181101561240c57600061226784838151811061222b5761222b6148a5565b602002602001015160000151858481518110612249576122496148a5565b602002602001015160200151868581518110610a3a57610a3a6148a5565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230591906147d6565b156123f957806001600160a01b031663f140a35a84848151811061232b5761232b6148a5565b6020026020010151868581518110612345576123456148a5565b6020026020010151600001516040518363ffffffff1660e01b81526004016123809291909182526001600160a01b0316602082015260400190565b60206040518083038186803b15801561239857600080fd5b505afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d091906149e5565b836123dc846001614ac4565b815181106123ec576123ec6148a5565b6020026020010181815250505b508061240481614adc565b91505061220b565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401612469939291906149a4565b60206040518083038186803b15801561248157600080fd5b505afa158015612495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b991906149c8565b9050600080806001600160a01b0384161561255257836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561250757600080fd5b505afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f91906149e5565b905061254c8c8c8c61154e565b90935091505b8215801561255e575081155b1561258f578896508795506103e861257e612579888a6149fe565b613a9b565b61258891906148d1565b9450612622565b600061259c8a8585613b87565b90508881116125e4578997509550856125dd846125b9848b6149fe565b6125c39190614a33565b846125ce858b6149fe565b6125d89190614a33565b613c68565b9550612620565b60006125f18a8587613b87565b985089975088905061261c8561260785846149fe565b6126119190614a33565b856125ce868c6149fe565b9650505b505b50505050955095509592505050565b60008060006126418f8f8f61102c565b9050600087612650578c612654565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061268f903390309086908f908e908e908e90600401614a55565b600060405180830381600087803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b50505050506126d28f8f8f8f8f8f8f8f610641565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156127125760405162461bcd60e51b81526004016106659061479f565b6127418b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613365565b909450925060006127738c7f00000000000000000000000000000000000000000000000000000000000000008d61102c565b90506127818c338388612ee2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127dc57600080fd5b505af11580156127f0573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506044019050602060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289891906147d6565b6128a4576128a4613e65565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156128e757600080fd5b505af11580156128fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291f91906149e5565b92508334111561293c5761293c3361293786346148d1565b613297565b50509750975097945050505050565b600080824281101561296f5760405162461bcd60e51b81526004016106659061479f565b61299f8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b610641565b90935091506129af8a8685613c7e565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015612a1157600080fd5b505af1158015612a25573d6000803e3d6000fd5b50505050612a338583613297565b5097509795505050505050565b600080612a4e85858561102c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b158015612ab457600080fd5b505afa158015612ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aec91906147d6565b15612b74576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a9060440160206040518083038186803b158015612b3957600080fd5b505afa158015612b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7191906149e5565b91505b50949350505050565b6000806000612bad8e7f00000000000000000000000000000000000000000000000000000000000000008f61102c565b9050600087612bbc578c612bc0565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612bfb903390309086908f908e908e908e90600401614a55565b600060405180830381600087803b158015612c1557600080fd5b505af1158015612c29573d6000803e3d6000fd5b505050506110128f8f8f8f8f8f8f612e05565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b158015612ca257600080fd5b505afa158015612cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cda91906147d6565b92915050565b60608142811015612d035760405162461bcd60e51b81526004016106659061479f565b612d55888787808060200260200160405190810160405280939291908181526020016000905b82821015610b7c57612d466060830286013681900381019061496b565b81526020019060010190612d29565b9150868260018451612d6791906148d1565b81518110612d7757612d776148a5565b60200260200101511015612d9d5760405162461bcd60e51b8152600401610665906148e8565b612db386866000818110610be457610be46148a5565b610dc3828787808060200260200160405190810160405280939291908181526020016000905b8282101561196e57612df66060830286013681900381019061496b565b81526020019060010190612dd9565b6000808242811015612e295760405162461bcd60e51b81526004016106659061479f565b612e598a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b610641565b6040516370a0823160e01b815230600482015291945092506129af908b9087906001600160a01b038316906370a082319060240160206040518083038186803b158015612ea557600080fd5b505afa158015612eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edd91906149e5565b613c7e565b6000846001600160a01b03163b11612f0c5760405162461bcd60e51b815260040161066590614af7565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612f709190614b6b565b6000604051808303816000865af19150503d8060008114612fad576040519150601f19603f3d011682016040523d82523d6000602084013e612fb2565b606091505b5091509150818015612fdc575080511580612fdc575080806020019051810190612fdc91906147d6565b61303a5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20736166655472616e7366657246726044820152681bdb4819985a5b195960ba1b6064820152608401610665565b505050505050565b60005b8251811015613291576000613094848381518110613065576130656148a5565b602002602001015160000151858481518110613083576130836148a5565b6020026020010151602001516110d7565b5090506000856130a5846001614ac4565b815181106130b5576130b56148a5565b60200260200101519050600080836001600160a01b03168786815181106130de576130de6148a5565b6020026020010151600001516001600160a01b03161461310057826000613104565b6000835b9150915060006001885161311891906148d1565b86106131245786613197565b61319788613133886001614ac4565b81518110613143576131436148a5565b6020026020010151600001518988600161315d9190614ac4565b8151811061316d5761316d6148a5565b6020026020010151602001518a8960016131879190614ac4565b81518110610a3a57610a3a6148a5565b90506131ea8887815181106131ae576131ae6148a5565b6020026020010151600001518988815181106131cc576131cc6148a5565b6020026020010151602001518a8981518110610a3a57610a3a6148a5565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613227576020820181803683370190505b506040518563ffffffff1660e01b81526004016132479493929190614b87565b600060405180830381600087803b15801561326157600080fd5b505af1158015613275573d6000803e3d6000fd5b505050505050505050808061328990614adc565b915050613045565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516132c19190614b6b565b60006040518083038185875af1925050503d80600081146132fe576040519150601f19603f3d011682016040523d82523d6000602084013e613303565b606091505b50509050806133605760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610665565b505050565b600080838610156133ca5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c6964206465736972656044820152686420616d6f756e744160b81b6064820152608401610665565b8285101561342c5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c696420646573697265604482015268321030b6b7bab73a2160b91b6064820152608401610665565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc309061347f908d908d908d906004016149a4565b60206040518083038186803b15801561349757600080fd5b505afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906149c8565b90506001600160a01b038116613584576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce49061352f908d908d908d906004016149a4565b602060405180830381600087803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358191906149c8565b90505b6000806135928c8c8c61154e565b915091508160001480156135a4575080155b156135b45788945087935061363c565b60006135c18a8484613b87565b90508881116135f557868110156135ea5760405162461bcd60e51b81526004016106659061485e565b89955093508361363a565b60006136028a8486613b87565b90508a81111561361457613614613e65565b888110156136345760405162461bcd60e51b815260040161066590614817565b95508894505b505b50505097509795505050505050565b60005b828110156132915760006136ad85858481811061366d5761366d6148a5565b6136839260206060909202019081019150614782565b868685818110613695576136956148a5565b905060600201602001602081019061034d9190614782565b50905060006137198686858181106136c7576136c76148a5565b6136dd9260206060909202019081019150614782565b8787868181106136ef576136ef6148a5565b90506060020160200160208101906137079190614782565b888887818110610c6557610c656148a5565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561375a57600080fd5b505afa15801561376e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137929190614a96565b50915091506000866001600160a01b03168b8b8a8181106137b5576137b56148a5565b6137cb9260206060909202019081019150614782565b6001600160a01b0316146137e05781836137e3565b82825b509050808b8b8a8181106137f9576137f96148a5565b61380f9260206060909202019081019150614782565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240160206040518083038186803b15801561385257600080fd5b505afa158015613866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388a91906149e5565b61389491906148d1565b9450613916858c8c8b8181106138ac576138ac6148a5565b6138c29260206060909202019081019150614782565b8d8d8c8181106138d4576138d46148a5565b90506060020160200160208101906138ec9190614782565b8e8e8d8181106138fe576138fe6148a5565b90506060020160400160208101906105ac9190614987565b9350505050600080856001600160a01b03168a8a8981811061393a5761393a6148a5565b6139509260206060909202019081019150614782565b6001600160a01b0316146139665782600061396a565b6000835b9092509050600061397c60018b6148d1565b88106139885788613a0d565b613a0d8b8b6139988b6001614ac4565b8181106139a7576139a76148a5565b6139bd9260206060909202019081019150614782565b8c8c6139ca8c6001614ac4565b8181106139d9576139d96148a5565b90506060020160200160208101906139f19190614782565b8d8d6139fe8d6001614ac4565b818110610c6557610c656148a5565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613a4f9086908690869060248101614b87565b600060405180830381600087803b158015613a6957600080fd5b505af1158015613a7d573d6000803e3d6000fd5b50505050505050505050508080613a9390614adc565b91505061364e565b600081613aaa57506000919050565b60006001613ab784613dd1565b901c6001901b90506001818481613ad057613ad0614a1d565b048201901c90506001818481613ae857613ae8614a1d565b048201901c90506001818481613b0057613b00614a1d565b048201901c90506001818481613b1857613b18614a1d565b048201901c90506001818481613b3057613b30614a1d565b048201901c90506001818481613b4857613b48614a1d565b048201901c90506001818481613b6057613b60614a1d565b048201901c9050613b8081828581613b7a57613b7a614a1d565b04613c68565b9392505050565b6000808411613be65760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f416044820152641353d5539560da1b6064820152608401610665565b600083118015613bf65750600082115b613c535760405162461bcd60e51b815260206004820152602860248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4c604482015267495155494449545960c01b6064820152608401610665565b82613c5e83866149fe565b6110cf9190614a33565b6000818310613c775781613b80565b5090919050565b6000836001600160a01b03163b11613ca85760405162461bcd60e51b815260040161066590614af7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613d049190614b6b565b6000604051808303816000865af19150503d8060008114613d41576040519150601f19603f3d011682016040523d82523d6000602084013e613d46565b606091505b5091509150818015613d70575080511580613d70575080806020019051810190613d7091906147d6565b613dca5760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20736166655472616e736665722066604482015264185a5b195960da1b6064820152608401610665565b5050505050565b600080608083901c15613de657608092831c92015b604083901c15613df857604092831c92015b602083901c15613e0a57602092831c92015b601083901c15613e1c57601092831c92015b600883901c15613e2e57600892831c92015b600483901c15613e4057600492831c92015b600283901c15613e5257600292831c92015b600183901c15612cda5760010192915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114613e9057600080fd5b50565b8035613e9e81613e7b565b919050565b8015158114613e9057600080fd5b600080600080600080600080610100898b031215613ece57600080fd5b8835613ed981613e7b565b97506020890135613ee981613e7b565b96506040890135613ef981613ea3565b9550606089013594506080890135935060a0890135925060c0890135613f1e81613e7b565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613f5157600080fd5b87359650602088013595506040880135613f6a81613e7b565b94506060880135613f7a81613e7b565b93506080880135613f8a81613ea3565b925060a0880135613f9a81613e7b565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613fe957835183529284019291840191600101613fcd565b50909695505050505050565b60008083601f84011261400757600080fd5b50813567ffffffffffffffff81111561401f57600080fd5b6020830191508360206060830285010111156111c857600080fd5b60008060008060008060a0878903121561405357600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561407857600080fd5b61408489828a01613ff5565b909550935050606087013561409881613e7b565b80925050608087013590509295509295509295565b600080600080608085870312156140c357600080fd5b84356140ce81613e7b565b935060208501356140de81613e7b565b925060408501356140ee81613ea3565b9396929550929360600135925050565b803560ff81168114613e9e57600080fd5b60008060008060008060008060008060006101608c8e03121561413157600080fd5b8b3561413c81613e7b565b9a5060208c013561414c81613ea3565b995060408c0135985060608c0135975060808c0135965060a08c013561417181613e7b565b955060c08c0135945060e08c013561418881613ea3565b93506141976101008d016140fe565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000606084860312156141ce57600080fd5b83356141d981613e7b565b925060208401356141e981613e7b565b915060408401356141f981613ea3565b809150509250925092565b6000806040838503121561421757600080fd5b823561422281613e7b565b9150602083013561423281613e7b565b809150509250929050565b60008060008060008060008060006101208a8c03121561425c57600080fd5b893561426781613e7b565b985060208a013561427781613e7b565b975060408a013561428781613ea3565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356142b381613e7b565b809250506101008a013590509295985092959850929598565b6000806000606084860312156142e157600080fd5b8335925060208401356142f381613e7b565b915060408401356141f981613e7b565b60008060008060006080868803121561431b57600080fd5b85359450602086013567ffffffffffffffff81111561433957600080fd5b61434588828901613ff5565b909550935050604086013561435981613e7b565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156143a9576143a961436a565b604052919050565b600067ffffffffffffffff8211156143cb576143cb61436a565b5060051b60200190565b6000806000806000608086880312156143ed57600080fd5b853567ffffffffffffffff8082111561440557600080fd5b818801915088601f83011261441957600080fd5b8135602061442e614429836143b1565b614380565b82815260059290921b8401810191818101908c84111561444d57600080fd5b948201945b8386101561446b57853582529482019490820190614452565b9950508901359250508082111561448157600080fd5b5061448e88828901613ff5565b9095509350614359905060408701613e93565b6000606082840312156144b357600080fd5b6040516060810181811067ffffffffffffffff821117156144d6576144d661436a565b60405290508082356144e781613e7b565b815260208301356144f781613e7b565b6020820152604083013561450a81613ea3565b6040919091015292915050565b6000806040838503121561452a57600080fd5b8235915060208084013567ffffffffffffffff81111561454957600080fd5b8401601f8101861361455a57600080fd5b8035614568614429826143b1565b8181526060918202830184019184820191908984111561458757600080fd5b938501935b838510156145ad5761459e8a866144a1565b8352938401939185019161458c565b5080955050505050509250929050565b600080600080600060a086880312156145d557600080fd5b85356145e081613e7b565b945060208601356145f081613e7b565b9350604086013561460081613ea3565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561463b57600080fd5b8c3561464681613e7b565b9b5060208d013561465681613e7b565b9a5060408d013561466681613ea3565b995060608d0135985060808d0135975060a08d0135965060c08d013561468b81613e7b565b955060e08d013594506101008d01356146a381613ea3565b93506146b26101208e016140fe565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a0312156146ef57600080fd5b87356146fa81613e7b565b9650602088013561470a81613ea3565b955060408801359450606088013593506080880135925060a0880135613f9a81613e7b565b6000806000806080858703121561474557600080fd5b84359350602085013561475781613e7b565b9250604085013561476781613e7b565b9150606085013561477781613ea3565b939692955090935050565b60006020828403121561479457600080fd5b8135613b8081613e7b565b60208082526019908201527f457175616c697a657220526f757465723a204558504952454400000000000000604082015260600190565b6000602082840312156147e857600080fd5b8151613b8081613ea3565b6000806040838503121561480657600080fd5b505080516020909101519092909150565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4160408201526617d05353d5539560ca1b606082015260800190565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4260408201526617d05353d5539560ca1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156148e3576148e36148bb565b500390565b6020808252602c908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252601e908201527f457175616c697a657220526f757465723a20494e56414c49445f504154480000604082015260600190565b60006060828403121561497d57600080fd5b613b8083836144a1565b60006020828403121561499957600080fd5b8135613b8081613ea3565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156149da57600080fd5b8151613b8081613e7b565b6000602082840312156149f757600080fd5b5051919050565b6000816000190483118215151615614a1857614a186148bb565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614a5057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b600080600060608486031215614aab57600080fd5b8351925060208401519150604084015190509250925092565b60008219821115614ad757614ad76148bb565b500190565b6000600019821415614af057614af06148bb565b5060010190565b60208082526028908201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e2060408201526718dbdb9d1c9858dd60c21b606082015260800190565b60005b83811015614b5a578181015183820152602001614b42565b838111156132915750506000910152565b60008251614b7d818460208701614b3f565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152614bc08160a0850160208701614b3f565b601f01601f19169190910160a0019594505050505056fea2646970667358221220d92ea2341a11bd9534d7c7e1c73a72bc860f7c6ff1ee6e43c4290815b9c706aa64736f6c63430008090033000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c806376c72751116100ec578063c45a01551161008a578063e2d9d4dc11610064578063e2d9d4dc146105b1578063e5e31b13146105d1578063f41766d814610601578063fe411f141461062157600080fd5b8063c45a01551461053d578063d7b0e0a514610571578063da2142311461059157600080fd5b806398a0fb3c116100c657806398a0fb3c146104a85780639aab9248146104c8578063a32b1fcd1461050a578063b7e0d4c01461052a57600080fd5b806376c72751146104555780637af728c8146104685780639881fcb41461048857600080fd5b8063544caa56116101595780635e60dab5116101335780635e60dab5146103e257806367ffb66a146104025780636cc1ae13146104155780637301e3c81461043557600080fd5b8063544caa56146103325780635a47ddc3146103725780635e1e6325146103ad57600080fd5b80633fc8cef3116101955780633fc8cef3146102865780634386e63c146102d2578063448725b4146102f25780634c1ee03e1461031257600080fd5b80630dede6c4146101ff57806313dcfc591461023957806318a130861461026657600080fd5b366101fa57336001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816146101f8576101f8613e65565b005b600080fd5b34801561020b57600080fd5b5061021f61021a366004613eb1565b610641565b604080519283526020830191909152015b60405180910390f35b34801561024557600080fd5b50610259610254366004613f36565b610870565b6040516102309190613fb1565b34801561027257600080fd5b5061025961028136600461403a565b610a83565b34801561029257600080fd5b506102ba7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516001600160a01b039091168152602001610230565b3480156102de57600080fd5b5061021f6102ed3660046140ad565b610dce565b3480156102fe57600080fd5b5061021f61030d36600461410f565b610f53565b34801561031e57600080fd5b506102ba61032d3660046141b9565b61102c565b34801561033e57600080fd5b5061035261034d366004614204565b6110d7565b604080516001600160a01b03938416815292909116602083015201610230565b34801561037e57600080fd5b5061039261038d36600461423d565b6111cf565b60408051938452602084019290925290820152606001610230565b3480156103b957600080fd5b506103cd6103c83660046142cc565b6112be565b60408051928352901515602083015201610230565b3480156103ee57600080fd5b5061021f6103fd3660046141b9565b61154e565b610259610410366004614303565b611615565b34801561042157600080fd5b506101f861043036600461403a565b611983565b34801561044157600080fd5b506102596104503660046143d5565b611b8f565b6101f8610463366004614303565b611c65565b34801561047457600080fd5b506101f861048336600461403a565b611f6d565b34801561049457600080fd5b506102596104a3366004614517565b612173565b3480156104b457600080fd5b506103926104c33660046145bd565b612413565b3480156104d457600080fd5b506104fc7f051c604b41e4f5c09d8eda985fa5e49ab9b1574a1aed994119102593d18fc95481565b604051908152602001610230565b34801561051657600080fd5b5061021f610525366004614618565b612631565b6103926105383660046146d4565b6126ec565b34801561054957600080fd5b506102ba7f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc81565b34801561057d57600080fd5b5061021f61058c3660046146d4565b61294b565b34801561059d57600080fd5b506104fc6105ac36600461472f565b612a40565b3480156105bd57600080fd5b5061021f6105cc36600461410f565b612b7d565b3480156105dd57600080fd5b506105f16105ec366004614782565b612c3c565b6040519015158152602001610230565b34801561060d57600080fd5b5061025961061c36600461403a565b612ce0565b34801561062d57600080fd5b5061021f61063c3660046146d4565b612e05565b600080824281101561066e5760405162461bcd60e51b81526004016106659061479f565b60405180910390fd5b600061067b8c8c8c61102c565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b1580156106cc57600080fd5b505af11580156106e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070491906147d6565b6107645760405162461bcd60e51b815260206004820152602b60248201527f457175616c697a657220526f757465723a206c6971756964697479207472616e60448201526a1cd9995c8819985a5b195960aa1b6064820152608401610665565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156107ab57600080fd5b505af11580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906147f3565b9150915060006107f38f8f6110d7565b509050806001600160a01b03168f6001600160a01b031614610816578183610819565b82825b90975095508a87101561083e5760405162461bcd60e51b815260040161066590614817565b8986101561085e5760405162461bcd60e51b81526004016106659061485e565b50505050509850989650505050505050565b606081428110156108935760405162461bcd60e51b81526004016106659061479f565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816108aa57905050905087816000815181106108ed576108ed6148a5565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508681600081518110610925576109256148a5565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061095d5761095d6148a5565b602090810291909101015190151560409091015261097b8a82612173565b925088836001855161098d91906148d1565b8151811061099d5761099d6148a5565b602002602001015110156109c35760405162461bcd60e51b8152600401610665906148e8565b610a6b816000815181106109d9576109d96148a5565b60200260200101516000015133610a4b846000815181106109fc576109fc6148a5565b60200260200101516000015185600081518110610a1b57610a1b6148a5565b60200260200101516020015186600081518110610a3a57610a3a6148a5565b60200260200101516040015161102c565b86600081518110610a5e57610a5e6148a5565b6020026020010151612ee2565b610a76838287613042565b5050979650505050505050565b60608142811015610aa65760405162461bcd60e51b81526004016106659061479f565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168686610add6001826148d1565b818110610aec57610aec6148a5565b9050606002016020016020810190610b049190614782565b6001600160a01b031614610b2a5760405162461bcd60e51b815260040161066590614934565b610b86888787808060200260200160405190810160405280939291908181526020016000905b82821015610b7c57610b6d6060830286013681900381019061496b565b81526020019060010190610b50565b5050505050612173565b9150868260018451610b9891906148d1565b81518110610ba857610ba86148a5565b60200260200101511015610bce5760405162461bcd60e51b8152600401610665906148e8565b610c9086866000818110610be457610be46148a5565b610bfa9260206060909202019081019150614782565b33610c7d89896000818110610c1157610c116148a5565b610c279260206060909202019081019150614782565b8a8a6000818110610c3a57610c3a6148a5565b9050606002016020016020810190610c529190614782565b8b8b6000818110610c6557610c656148a5565b905060600201604001602081019061032d9190614987565b85600081518110610a5e57610a5e6148a5565b610ced828787808060200260200160405190810160405280939291908181526020016000905b82821015610ce257610cd36060830286013681900381019061496b565b81526020019060010190610cb6565b505050505030613042565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316632e1a7d4d8360018551610d2b91906148d1565b81518110610d3b57610d3b6148a5565b60200260200101516040518263ffffffff1660e01b8152600401610d6191815260200190565b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b50505050610dc3848360018551610da691906148d1565b81518110610db657610db66148a5565b6020026020010151613297565b509695505050505050565b60008060007f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc6001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610e23939291906149a4565b60206040518083038186803b158015610e3b57600080fd5b505afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7391906149c8565b90506001600160a01b038116610e90576000809250925050610f4a565b600080610e9e89898961154e565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610edd57600080fd5b505afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906149e5565b905080610f2284896149fe565b610f2c9190614a33565b955080610f3983896149fe565b610f439190614a33565b9450505050505b94509492505050565b6000806000610f838e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388f61102c565b9050600087610f92578c610f96565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610fd1903390309086908f908e908e908e90600401614a55565b600060405180830381600087803b158015610feb57600080fd5b505af1158015610fff573d6000803e3d6000fd5b505050506110128f8f8f8f8f8f8f61294b565b809450819550505050509b509b9950505050505050505050565b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc1690636801cc309061107f908790879087906004016149a4565b60206040518083038186803b15801561109757600080fd5b505afa1580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906149c8565b949350505050565b600080826001600160a01b0316846001600160a01b0316141561114a5760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a204944454e544943414c5f41444452604482015264455353455360d81b6064820152608401610665565b826001600160a01b0316846001600160a01b03161061116a57828461116d565b83835b90925090506001600160a01b0382166111c85760405162461bcd60e51b815260206004820152601e60248201527f457175616c697a657220526f757465723a205a45524f5f4144445245535300006044820152606401610665565b9250929050565b600080600083428110156111f55760405162461bcd60e51b81526004016106659061479f565b6112048d8d8d8d8d8d8d613365565b909450925060006112168e8e8e61102c565b90506112248e338388612ee2565b6112308d338387612ee2565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ab91906149e5565b9250505099509950999650505050505050565b60008060006112cf8585600161102c565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc9091169063e5e31b139060240160206040518083038186803b15801561133a57600080fd5b505afa15801561134e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137291906147d6565b156113fa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f791906149e5565b91505b6114068787600061102c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc9091169063e5e31b139060240160206040518083038186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a491906147d6565b1561152c576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156114f157600080fd5b505afa158015611505573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152991906149e5565b90505b80821161153b5780600061153f565b8160015b94509450505050935093915050565b600080600061155d86866110d7565b50905060008061156e88888861102c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156115a657600080fd5b505afa1580156115ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115de9190614a96565b5091509150826001600160a01b0316886001600160a01b031614611603578082611606565b81815b90999098509650505050505050565b606081428110156116385760405162461bcd60e51b81526004016106659061479f565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686866000818110611675576116756148a5565b61168b9260206060909202019081019150614782565b6001600160a01b0316146116b15760405162461bcd60e51b815260040161066590614934565b611703348787808060200260200160405190810160405280939291908181526020016000905b82821015610b7c576116f46060830286013681900381019061496b565b815260200190600101906116d7565b915086826001845161171591906148d1565b81518110611725576117256148a5565b6020026020010151101561174b5760405162461bcd60e51b8152600401610665906148e8565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db08360008151811061178d5761178d6148a5565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156117c057600080fd5b505af11580156117d4573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb6118728888600081811061181e5761181e6148a5565b6118349260206060909202019081019150614782565b89896000818110611847576118476148a5565b905060600201602001602081019061185f9190614782565b8a8a6000818110610c6557610c656148a5565b84600081518110611885576118856148a5565b60200260200101516040518363ffffffff1660e01b81526004016118be9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156118d857600080fd5b505af11580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191091906147d6565b61191c5761191c613e65565b611979828787808060200260200160405190810160405280939291908181526020016000905b8282101561196e5761195f6060830286013681900381019061496b565b81526020019060010190611942565b505050505086613042565b5095945050505050565b80428110156119a45760405162461bcd60e51b81526004016106659061479f565b6119ed858560008181106119ba576119ba6148a5565b6119d09260206060909202019081019150614782565b336119e78888600081811061181e5761181e6148a5565b8a612ee2565b600085856119fc6001826148d1565b818110611a0b57611a0b6148a5565b9050606002016020016020810190611a239190614782565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e91906149e5565b9050611aab86868661364b565b86818787611aba6001826148d1565b818110611ac957611ac96148a5565b9050606002016020016020810190611ae19190614782565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b158015611b2557600080fd5b505afa158015611b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5d91906149e5565b611b6791906148d1565b1015611b855760405162461bcd60e51b8152600401610665906148e8565b5050505050505050565b60608142811015611bb25760405162461bcd60e51b81526004016106659061479f565b611c0886866000818110611bc857611bc86148a5565b611bde9260206060909202019081019150614782565b33611bf589896000818110610c1157610c116148a5565b8a600081518110610a5e57610a5e6148a5565b611c5a878787808060200260200160405190810160405280939291908181526020016000905b8282101561196e57611c4b6060830286013681900381019061496b565b81526020019060010190611c2e565b509495945050505050565b8042811015611c865760405162461bcd60e51b81526004016106659061479f565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031685856000818110611cc357611cc36148a5565b611cd99260206060909202019081019150614782565b6001600160a01b031614611cff5760405162461bcd60e51b815260040161066590614934565b60003490507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d5f57600080fd5b505af1158015611d73573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb611dbd8888600081811061181e5761181e6148a5565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611e0557600080fd5b505af1158015611e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3d91906147d6565b611e4957611e49613e65565b60008686611e586001826148d1565b818110611e6757611e676148a5565b9050606002016020016020810190611e7f9190614782565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b158015611ec257600080fd5b505afa158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa91906149e5565b9050611f0787878761364b565b87818888611f166001826148d1565b818110611f2557611f256148a5565b9050606002016020016020810190611f3d9190614782565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401611b0d565b8042811015611f8e5760405162461bcd60e51b81526004016106659061479f565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168585611fc56001826148d1565b818110611fd457611fd46148a5565b9050606002016020016020810190611fec9190614782565b6001600160a01b0316146120125760405162461bcd60e51b815260040161066590614934565b612028858560008181106119ba576119ba6148a5565b61203385853061364b565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316906370a082319060240160206040518083038186803b15801561209557600080fd5b505afa1580156120a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cd91906149e5565b9050868110156120ef5760405162461bcd60e51b8152600401610665906148e8565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561215157600080fd5b505af1158015612165573d6000803e3d6000fd5b50505050611b858482613297565b60606001825110156121975760405162461bcd60e51b815260040161066590614934565b81516121a4906001614ac4565b67ffffffffffffffff8111156121bc576121bc61436a565b6040519080825280602002602001820160405280156121e5578160200160208202803683370190505b50905082816000815181106121fc576121fc6148a5565b60200260200101818152505060005b825181101561240c57600061226784838151811061222b5761222b6148a5565b602002602001015160000151858481518110612249576122496148a5565b602002602001015160200151868581518110610a3a57610a3a6148a5565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc9091169063e5e31b139060240160206040518083038186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230591906147d6565b156123f957806001600160a01b031663f140a35a84848151811061232b5761232b6148a5565b6020026020010151868581518110612345576123456148a5565b6020026020010151600001516040518363ffffffff1660e01b81526004016123809291909182526001600160a01b0316602082015260400190565b60206040518083038186803b15801561239857600080fd5b505afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d091906149e5565b836123dc846001614ac4565b815181106123ec576123ec6148a5565b6020026020010181815250505b508061240481614adc565b91505061220b565b5092915050565b6000806000807f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc6001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401612469939291906149a4565b60206040518083038186803b15801561248157600080fd5b505afa158015612495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b991906149c8565b9050600080806001600160a01b0384161561255257836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561250757600080fd5b505afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f91906149e5565b905061254c8c8c8c61154e565b90935091505b8215801561255e575081155b1561258f578896508795506103e861257e612579888a6149fe565b613a9b565b61258891906148d1565b9450612622565b600061259c8a8585613b87565b90508881116125e4578997509550856125dd846125b9848b6149fe565b6125c39190614a33565b846125ce858b6149fe565b6125d89190614a33565b613c68565b9550612620565b60006125f18a8587613b87565b985089975088905061261c8561260785846149fe565b6126119190614a33565b856125ce868c6149fe565b9650505b505b50505050955095509592505050565b60008060006126418f8f8f61102c565b9050600087612650578c612654565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061268f903390309086908f908e908e908e90600401614a55565b600060405180830381600087803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b50505050506126d28f8f8f8f8f8f8f8f610641565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156127125760405162461bcd60e51b81526004016106659061479f565b6127418b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388c8c348d8d613365565b909450925060006127738c7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388d61102c565b90506127818c338388612ee2565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127dc57600080fd5b505af11580156127f0573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816935063a9059cbb92506044019050602060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289891906147d6565b6128a4576128a4613e65565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156128e757600080fd5b505af11580156128fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291f91906149e5565b92508334111561293c5761293c3361293786346148d1565b613297565b50509750975097945050505050565b600080824281101561296f5760405162461bcd60e51b81526004016106659061479f565b61299f8a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b8b8b8b308b610641565b90935091506129af8a8685613c7e565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015612a1157600080fd5b505af1158015612a25573d6000803e3d6000fd5b50505050612a338583613297565b5097509795505050505050565b600080612a4e85858561102c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc9091169063e5e31b139060240160206040518083038186803b158015612ab457600080fd5b505afa158015612ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aec91906147d6565b15612b74576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a9060440160206040518083038186803b158015612b3957600080fd5b505afa158015612b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7191906149e5565b91505b50949350505050565b6000806000612bad8e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388f61102c565b9050600087612bbc578c612bc0565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612bfb903390309086908f908e908e908e90600401614a55565b600060405180830381600087803b158015612c1557600080fd5b505af1158015612c29573d6000803e3d6000fd5b505050506110128f8f8f8f8f8f8f612e05565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc9091169063e5e31b139060240160206040518083038186803b158015612ca257600080fd5b505afa158015612cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cda91906147d6565b92915050565b60608142811015612d035760405162461bcd60e51b81526004016106659061479f565b612d55888787808060200260200160405190810160405280939291908181526020016000905b82821015610b7c57612d466060830286013681900381019061496b565b81526020019060010190612d29565b9150868260018451612d6791906148d1565b81518110612d7757612d776148a5565b60200260200101511015612d9d5760405162461bcd60e51b8152600401610665906148e8565b612db386866000818110610be457610be46148a5565b610dc3828787808060200260200160405190810160405280939291908181526020016000905b8282101561196e57612df66060830286013681900381019061496b565b81526020019060010190612dd9565b6000808242811015612e295760405162461bcd60e51b81526004016106659061479f565b612e598a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b8b8b8b308b610641565b6040516370a0823160e01b815230600482015291945092506129af908b9087906001600160a01b038316906370a082319060240160206040518083038186803b158015612ea557600080fd5b505afa158015612eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edd91906149e5565b613c7e565b6000846001600160a01b03163b11612f0c5760405162461bcd60e51b815260040161066590614af7565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612f709190614b6b565b6000604051808303816000865af19150503d8060008114612fad576040519150601f19603f3d011682016040523d82523d6000602084013e612fb2565b606091505b5091509150818015612fdc575080511580612fdc575080806020019051810190612fdc91906147d6565b61303a5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20736166655472616e7366657246726044820152681bdb4819985a5b195960ba1b6064820152608401610665565b505050505050565b60005b8251811015613291576000613094848381518110613065576130656148a5565b602002602001015160000151858481518110613083576130836148a5565b6020026020010151602001516110d7565b5090506000856130a5846001614ac4565b815181106130b5576130b56148a5565b60200260200101519050600080836001600160a01b03168786815181106130de576130de6148a5565b6020026020010151600001516001600160a01b03161461310057826000613104565b6000835b9150915060006001885161311891906148d1565b86106131245786613197565b61319788613133886001614ac4565b81518110613143576131436148a5565b6020026020010151600001518988600161315d9190614ac4565b8151811061316d5761316d6148a5565b6020026020010151602001518a8960016131879190614ac4565b81518110610a3a57610a3a6148a5565b90506131ea8887815181106131ae576131ae6148a5565b6020026020010151600001518988815181106131cc576131cc6148a5565b6020026020010151602001518a8981518110610a3a57610a3a6148a5565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613227576020820181803683370190505b506040518563ffffffff1660e01b81526004016132479493929190614b87565b600060405180830381600087803b15801561326157600080fd5b505af1158015613275573d6000803e3d6000fd5b505050505050505050808061328990614adc565b915050613045565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516132c19190614b6b565b60006040518083038185875af1925050503d80600081146132fe576040519150601f19603f3d011682016040523d82523d6000602084013e613303565b606091505b50509050806133605760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610665565b505050565b600080838610156133ca5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c6964206465736972656044820152686420616d6f756e744160b81b6064820152608401610665565b8285101561342c5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c696420646573697265604482015268321030b6b7bab73a2160b91b6064820152608401610665565b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc1690636801cc309061347f908d908d908d906004016149a4565b60206040518083038186803b15801561349757600080fd5b505afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906149c8565b90506001600160a01b038116613584576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc16906382dfdce49061352f908d908d908d906004016149a4565b602060405180830381600087803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358191906149c8565b90505b6000806135928c8c8c61154e565b915091508160001480156135a4575080155b156135b45788945087935061363c565b60006135c18a8484613b87565b90508881116135f557868110156135ea5760405162461bcd60e51b81526004016106659061485e565b89955093508361363a565b60006136028a8486613b87565b90508a81111561361457613614613e65565b888110156136345760405162461bcd60e51b815260040161066590614817565b95508894505b505b50505097509795505050505050565b60005b828110156132915760006136ad85858481811061366d5761366d6148a5565b6136839260206060909202019081019150614782565b868685818110613695576136956148a5565b905060600201602001602081019061034d9190614782565b50905060006137198686858181106136c7576136c76148a5565b6136dd9260206060909202019081019150614782565b8787868181106136ef576136ef6148a5565b90506060020160200160208101906137079190614782565b888887818110610c6557610c656148a5565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561375a57600080fd5b505afa15801561376e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137929190614a96565b50915091506000866001600160a01b03168b8b8a8181106137b5576137b56148a5565b6137cb9260206060909202019081019150614782565b6001600160a01b0316146137e05781836137e3565b82825b509050808b8b8a8181106137f9576137f96148a5565b61380f9260206060909202019081019150614782565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240160206040518083038186803b15801561385257600080fd5b505afa158015613866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388a91906149e5565b61389491906148d1565b9450613916858c8c8b8181106138ac576138ac6148a5565b6138c29260206060909202019081019150614782565b8d8d8c8181106138d4576138d46148a5565b90506060020160200160208101906138ec9190614782565b8e8e8d8181106138fe576138fe6148a5565b90506060020160400160208101906105ac9190614987565b9350505050600080856001600160a01b03168a8a8981811061393a5761393a6148a5565b6139509260206060909202019081019150614782565b6001600160a01b0316146139665782600061396a565b6000835b9092509050600061397c60018b6148d1565b88106139885788613a0d565b613a0d8b8b6139988b6001614ac4565b8181106139a7576139a76148a5565b6139bd9260206060909202019081019150614782565b8c8c6139ca8c6001614ac4565b8181106139d9576139d96148a5565b90506060020160200160208101906139f19190614782565b8d8d6139fe8d6001614ac4565b818110610c6557610c656148a5565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613a4f9086908690869060248101614b87565b600060405180830381600087803b158015613a6957600080fd5b505af1158015613a7d573d6000803e3d6000fd5b50505050505050505050508080613a9390614adc565b91505061364e565b600081613aaa57506000919050565b60006001613ab784613dd1565b901c6001901b90506001818481613ad057613ad0614a1d565b048201901c90506001818481613ae857613ae8614a1d565b048201901c90506001818481613b0057613b00614a1d565b048201901c90506001818481613b1857613b18614a1d565b048201901c90506001818481613b3057613b30614a1d565b048201901c90506001818481613b4857613b48614a1d565b048201901c90506001818481613b6057613b60614a1d565b048201901c9050613b8081828581613b7a57613b7a614a1d565b04613c68565b9392505050565b6000808411613be65760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f416044820152641353d5539560da1b6064820152608401610665565b600083118015613bf65750600082115b613c535760405162461bcd60e51b815260206004820152602860248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4c604482015267495155494449545960c01b6064820152608401610665565b82613c5e83866149fe565b6110cf9190614a33565b6000818310613c775781613b80565b5090919050565b6000836001600160a01b03163b11613ca85760405162461bcd60e51b815260040161066590614af7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613d049190614b6b565b6000604051808303816000865af19150503d8060008114613d41576040519150601f19603f3d011682016040523d82523d6000602084013e613d46565b606091505b5091509150818015613d70575080511580613d70575080806020019051810190613d7091906147d6565b613dca5760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20736166655472616e736665722066604482015264185a5b195960da1b6064820152608401610665565b5050505050565b600080608083901c15613de657608092831c92015b604083901c15613df857604092831c92015b602083901c15613e0a57602092831c92015b601083901c15613e1c57601092831c92015b600883901c15613e2e57600892831c92015b600483901c15613e4057600492831c92015b600283901c15613e5257600292831c92015b600183901c15612cda5760010192915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114613e9057600080fd5b50565b8035613e9e81613e7b565b919050565b8015158114613e9057600080fd5b600080600080600080600080610100898b031215613ece57600080fd5b8835613ed981613e7b565b97506020890135613ee981613e7b565b96506040890135613ef981613ea3565b9550606089013594506080890135935060a0890135925060c0890135613f1e81613e7b565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613f5157600080fd5b87359650602088013595506040880135613f6a81613e7b565b94506060880135613f7a81613e7b565b93506080880135613f8a81613ea3565b925060a0880135613f9a81613e7b565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613fe957835183529284019291840191600101613fcd565b50909695505050505050565b60008083601f84011261400757600080fd5b50813567ffffffffffffffff81111561401f57600080fd5b6020830191508360206060830285010111156111c857600080fd5b60008060008060008060a0878903121561405357600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561407857600080fd5b61408489828a01613ff5565b909550935050606087013561409881613e7b565b80925050608087013590509295509295509295565b600080600080608085870312156140c357600080fd5b84356140ce81613e7b565b935060208501356140de81613e7b565b925060408501356140ee81613ea3565b9396929550929360600135925050565b803560ff81168114613e9e57600080fd5b60008060008060008060008060008060006101608c8e03121561413157600080fd5b8b3561413c81613e7b565b9a5060208c013561414c81613ea3565b995060408c0135985060608c0135975060808c0135965060a08c013561417181613e7b565b955060c08c0135945060e08c013561418881613ea3565b93506141976101008d016140fe565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000606084860312156141ce57600080fd5b83356141d981613e7b565b925060208401356141e981613e7b565b915060408401356141f981613ea3565b809150509250925092565b6000806040838503121561421757600080fd5b823561422281613e7b565b9150602083013561423281613e7b565b809150509250929050565b60008060008060008060008060006101208a8c03121561425c57600080fd5b893561426781613e7b565b985060208a013561427781613e7b565b975060408a013561428781613ea3565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356142b381613e7b565b809250506101008a013590509295985092959850929598565b6000806000606084860312156142e157600080fd5b8335925060208401356142f381613e7b565b915060408401356141f981613e7b565b60008060008060006080868803121561431b57600080fd5b85359450602086013567ffffffffffffffff81111561433957600080fd5b61434588828901613ff5565b909550935050604086013561435981613e7b565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156143a9576143a961436a565b604052919050565b600067ffffffffffffffff8211156143cb576143cb61436a565b5060051b60200190565b6000806000806000608086880312156143ed57600080fd5b853567ffffffffffffffff8082111561440557600080fd5b818801915088601f83011261441957600080fd5b8135602061442e614429836143b1565b614380565b82815260059290921b8401810191818101908c84111561444d57600080fd5b948201945b8386101561446b57853582529482019490820190614452565b9950508901359250508082111561448157600080fd5b5061448e88828901613ff5565b9095509350614359905060408701613e93565b6000606082840312156144b357600080fd5b6040516060810181811067ffffffffffffffff821117156144d6576144d661436a565b60405290508082356144e781613e7b565b815260208301356144f781613e7b565b6020820152604083013561450a81613ea3565b6040919091015292915050565b6000806040838503121561452a57600080fd5b8235915060208084013567ffffffffffffffff81111561454957600080fd5b8401601f8101861361455a57600080fd5b8035614568614429826143b1565b8181526060918202830184019184820191908984111561458757600080fd5b938501935b838510156145ad5761459e8a866144a1565b8352938401939185019161458c565b5080955050505050509250929050565b600080600080600060a086880312156145d557600080fd5b85356145e081613e7b565b945060208601356145f081613e7b565b9350604086013561460081613ea3565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561463b57600080fd5b8c3561464681613e7b565b9b5060208d013561465681613e7b565b9a5060408d013561466681613ea3565b995060608d0135985060808d0135975060a08d0135965060c08d013561468b81613e7b565b955060e08d013594506101008d01356146a381613ea3565b93506146b26101208e016140fe565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a0312156146ef57600080fd5b87356146fa81613e7b565b9650602088013561470a81613ea3565b955060408801359450606088013593506080880135925060a0880135613f9a81613e7b565b6000806000806080858703121561474557600080fd5b84359350602085013561475781613e7b565b9250604085013561476781613e7b565b9150606085013561477781613ea3565b939692955090935050565b60006020828403121561479457600080fd5b8135613b8081613e7b565b60208082526019908201527f457175616c697a657220526f757465723a204558504952454400000000000000604082015260600190565b6000602082840312156147e857600080fd5b8151613b8081613ea3565b6000806040838503121561480657600080fd5b505080516020909101519092909150565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4160408201526617d05353d5539560ca1b606082015260800190565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4260408201526617d05353d5539560ca1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156148e3576148e36148bb565b500390565b6020808252602c908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252601e908201527f457175616c697a657220526f757465723a20494e56414c49445f504154480000604082015260600190565b60006060828403121561497d57600080fd5b613b8083836144a1565b60006020828403121561499957600080fd5b8135613b8081613ea3565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156149da57600080fd5b8151613b8081613e7b565b6000602082840312156149f757600080fd5b5051919050565b6000816000190483118215151615614a1857614a186148bb565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614a5057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b600080600060608486031215614aab57600080fd5b8351925060208401519150604084015190509250925092565b60008219821115614ad757614ad76148bb565b500190565b6000600019821415614af057614af06148bb565b5060010190565b60208082526028908201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e2060408201526718dbdb9d1c9858dd60c21b606082015260800190565b60005b83811015614b5a578181015183820152602001614b42565b838111156132915750506000910152565b60008251614b7d818460208701614b3f565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152614bc08160a0850160208701614b3f565b601f01601f19169190910160a0019594505050505056fea2646970667358221220d92ea2341a11bd9534d7c7e1c73a72bc860f7c6ff1ee6e43c4290815b9c706aa64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _factory (address): 0xDDD9845Ba0D8f38d3045f804f67A1a8B9A528FcC
Arg [1] : _weth (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ddd9845ba0d8f38d3045f804f67a1a8b9a528fcc
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode Sourcemap
17863:24084:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18598:10;-1:-1:-1;;;;;18620:4:0;18598:27;;18591:35;;;;:::i;:::-;17863:24084;;;;;28036:875;;;;;;;;;;-1:-1:-1;28036:875:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;28036:875:0;;;;;;;;31783:790;;;;;;;;;;-1:-1:-1;31783:790:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33816:775::-;;;;;;;;;;-1:-1:-1;33816:775:0;;;;;:::i;:::-;;:::i;18035:27::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4646:32:1;;;4628:51;;4616:2;4601:18;18035:27:0;4468:217:1;23963:752:0;;;;;;;;;;-1:-1:-1;23963:752:0;;;;;:::i;:::-;;:::i;30309:670::-;;;;;;;;;;-1:-1:-1;30309:670:0;;;;;:::i;:::-;;:::i;19086:508::-;;;;;;;;;;-1:-1:-1;19086:508:0;;;;;:::i;:::-;;:::i;18642:347::-;;;;;;;;;;-1:-1:-1;18642:347:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7958:15:1;;;7940:34;;8010:15;;;;8005:2;7990:18;;7983:43;7875:18;18642:347:0;7728:304:1;26335:696:0;;;;;;;;;;-1:-1:-1;26335:696:0;;;;;:::i;:::-;;:::i;:::-;;;;9254:25:1;;;9310:2;9295:18;;9288:34;;;;9338:18;;;9331:34;9242:2;9227:18;26335:696:0;9052:319:1;20629:662:0;;;;;;;;;;-1:-1:-1;20629:662:0;;;;;:::i;:::-;;:::i;:::-;;;;10005:25:1;;;10073:14;;10066:22;10061:2;10046:18;;10039:50;9978:18;20629:662:0;9837:258:1;20102:375:0;;;;;;;;;;-1:-1:-1;20102:375:0;;;;;:::i;:::-;;:::i;33176:632::-;;;;;;:::i;:::-;;:::i;38426:737::-;;;;;;;;;;-1:-1:-1;38426:737:0;;;;;:::i;:::-;;:::i;34599:404::-;;;;;;;;;;-1:-1:-1;34599:404:0;;;;;:::i;:::-;;:::i;39169:838::-;;;;;;:::i;:::-;;:::i;40013:813::-;;;;;;;;;;-1:-1:-1;40013:813:0;;;;;:::i;:::-;;:::i;21769:569::-;;;;;;;;;;-1:-1:-1;21769:569:0;;;;;:::i;:::-;;:::i;22473:1482::-;;;;;;;;;;-1:-1:-1;22473:1482:0;;;;;:::i;:::-;;:::i;18124:37::-;;;;;;;;;;;;;;;;;;15469:25:1;;;15457:2;15442:18;18124:37:0;15323:177:1;29600:701:0;;;;;;;;;;-1:-1:-1;29600:701:0;;;;;:::i;:::-;;:::i;27039:949::-;;;;;;:::i;:::-;;:::i;17996:32::-;;;;;;;;;;;;;;;28919:673;;;;;;;;;;-1:-1:-1;28919:673:0;;;;;:::i;:::-;;:::i;21366:316::-;;;;;;;;;;-1:-1:-1;21366:316:0;;;;;:::i;:::-;;:::i;36293:752::-;;;;;;;;;;-1:-1:-1;36293:752:0;;;;;:::i;:::-;;:::i;22346:119::-;;;;;;;;;;-1:-1:-1;22346:119:0;;;;;:::i;:::-;;:::i;:::-;;;18800:14:1;;18793:22;18775:41;;18763:2;18748:18;22346:119:0;18635:187:1;32581:587:0;;;;;;;;;;-1:-1:-1;32581:587:0;;;;;:::i;:::-;;:::i;35558:729::-;;;;;;;;;;-1:-1:-1;35558:729:0;;;;;:::i;:::-;;:::i;28036:875::-;28295:12;28309;28276:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;;;;;;;;;28334:12:::1;28349:31;28357:6;28365;28373;28349:7;:31::i;:::-;28399:53;::::0;-1:-1:-1;;;28399:53:0;;28424:10:::1;28399:53;::::0;::::1;19421:34:1::0;-1:-1:-1;;;;;28399:24:0;::::1;19471:18:1::0;;;19464:43;;;19523:18;;;19516:34;;;28334:46:0;;-1:-1:-1;28399:24:0::1;::::0;19356:18:1;;28399:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28391:109;;;::::0;-1:-1:-1;;;28391:109:0;;20013:2:1;28391:109:0::1;::::0;::::1;19995:21:1::0;20052:2;20032:18;;;20025:30;20091:34;20071:18;;;20064:62;-1:-1:-1;;;20142:18:1;;;20135:41;20193:19;;28391:109:0::1;19811:407:1::0;28391:109:0::1;28568:20;::::0;-1:-1:-1;;;28568:20:0;;-1:-1:-1;;;;;4646:32:1;;;28568:20:0::1;::::0;::::1;4628:51:1::0;28538:12:0::1;::::0;;;28568:16;::::1;::::0;::::1;::::0;4601:18:1;;28568:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28537:51;;;;28600:14;28619:26;28630:6;28638;28619:10;:26::i;:::-;28599:46;;;28687:6;-1:-1:-1::0;;;;;28677:16:0::1;:6;-1:-1:-1::0;;;;;28677:16:0::1;;:58;;28718:7;28727;28677:58;;;28697:7;28706;28677:58;28656:79:::0;;-1:-1:-1;28656:79:0;-1:-1:-1;28754:21:0;;::::1;;28746:73;;;;-1:-1:-1::0;;;28746:73:0::1;;;;;;;:::i;:::-;28849:10;28838:7;:21;;28830:73;;;;-1:-1:-1::0;;;28830:73:0::1;;;;;;;:::i;:::-;28323:588;;;;28036:875:::0;;;;;;;;;;;;:::o;31783:790::-;32038:21;32019:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;32096:14:::1;::::0;;32108:1:::1;32096:14:::0;;;;;::::1;::::0;;;32072:21:::1;::::0;32096:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;32096:14:0;;-1:-1:-1;;32096:14:0;;;;::::1;::::0;::::1;;;;;32072:38;;32138:9;32121:6;32128:1;32121:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;32121:26:0::1;;;-1:-1:-1::0;;;;;32121:26:0::1;;;::::0;::::1;32173:7;32158:6;32165:1;32158:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;32158:22:0::1;;;-1:-1:-1::0;;;;;32158:22:0::1;;;::::0;::::1;32210:6;32191;32198:1;32191:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;32237:31:::1;32251:8:::0;32261:6;32237:13:::1;:31::i;:::-;32227:41;;32318:12;32287:7;32312:1;32295:7;:14;:18;;;;:::i;:::-;32287:27;;;;;;;;:::i;:::-;;;;;;;:43;;32279:100;;;;-1:-1:-1::0;;;32279:100:0::1;;;;;;;:::i;:::-;32390:138;32422:6;32429:1;32422:9;;;;;;;;:::i;:::-;;;;;;;:14;;;32438:10;32450:55;32458:6;32465:1;32458:9;;;;;;;;:::i;:::-;;;;;;;:14;;;32474:6;32481:1;32474:9;;;;;;;;:::i;:::-;;;;;;;:12;;;32488:6;32495:1;32488:9;;;;;;;;:::i;:::-;;;;;;;:16;;;32450:7;:55::i;:::-;32507:7;32515:1;32507:10;;;;;;;;:::i;:::-;;;;;;;32390:17;:138::i;:::-;32539:26;32545:7;32554:6;32562:2;32539:5;:26::i;:::-;32061:512;31783:790:::0;;;;;;;;;;:::o;33816:775::-;33983:21;33959:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34070:4:0::1;34030:45;:6:::0;;34037:17:::1;34053:1;34030:6:::0;34037:17:::1;:::i;:::-;34030:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34030:45:0::1;;34022:88;;;;-1:-1:-1::0;;;34022:88:0::1;;;;;;;:::i;:::-;34131:31;34145:8;34155:6;;34131:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;34121:41;;34212:12;34181:7;34206:1;34189:7;:14;:18;;;;:::i;:::-;34181:27;;;;;;;;:::i;:::-;;;;;;;:43;;34173:100;;;;-1:-1:-1::0;;;34173:100:0::1;;;;;;;:::i;:::-;34284:138;34316:6;;34323:1;34316:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;34316:14:0::1;:::i;:::-;34332:10;34344:55;34352:6;;34359:1;34352:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;34352:14:0::1;:::i;:::-;34368:6;;34375:1;34368:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;34382:6;;34389:1;34382:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;34344:55::-;34401:7;34409:1;34401:10;;;;;;;;:::i;34284:138::-;34433:37;34439:7;34448:6;;34433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;34464:4;34433:5;:37::i;:::-;34481:4;-1:-1:-1::0;;;;;34481:13:0::1;;34495:7;34520:1;34503:7;:14;:18;;;;:::i;:::-;34495:27;;;;;;;;:::i;:::-;;;;;;;34481:42;;;;;;;;;;;;;15469:25:1::0;;15457:2;15442:18;;15323:177;34481:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34534:49;34551:2;34555:7;34580:1;34563:7;:14;:18;;;;:::i;:::-;34555:27;;;;;;;;:::i;:::-;;;;;;;34534:16;:49::i;:::-;33816:775:::0;;;;;;;;;:::o;23963:752::-;24120:12;24134;24211:13;24240:7;-1:-1:-1;;;;;24227:29:0;;24257:6;24265;24273;24227:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24211:69;-1:-1:-1;;;;;;24297:19:0;;24293:64;;24341:1;24343;24333:12;;;;;;;24293:64;24370:13;24385;24402:35;24414:6;24422;24430;24402:11;:35::i;:::-;24369:68;;;;24448:17;24475:5;-1:-1:-1;;;;;24468:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24448:47;-1:-1:-1;24448:47:0;24518:20;24530:8;24518:9;:20;:::i;:::-;:35;;;;:::i;:::-;24508:45;-1:-1:-1;24645:12:0;24622:20;24634:8;24622:9;:20;:::i;:::-;:35;;;;:::i;:::-;24612:45;;24148:567;;;;23963:752;;;;;;;;:::o;30309:670::-;30603:16;30621:14;30648:12;30663:37;30671:5;30686:4;30693:6;30663:7;:37::i;:::-;30648:52;;30711:10;30724;:39;;30754:9;30724:39;;;-1:-1:-1;;30724:39:0;30774:71;;-1:-1:-1;;;30774:71:0;;30711:52;;-1:-1:-1;;;;;;30774:18:0;;;;;:71;;30793:10;;30813:4;;30711:52;;30827:8;;30837:1;;30840;;30843;;30774:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30883:88;30902:5;30909:6;30917:9;30928:14;30944:12;30958:2;30962:8;30883:18;:88::i;:::-;30856:115;;;;;;;;30637:342;;30309:670;;;;;;;;;;;;;;:::o;19086:508::-;19535:51;;-1:-1:-1;;;19535:51:0;;19169:12;;-1:-1:-1;;;;;19548:7:0;19535:29;;;;:51;;19565:6;;19572;;19579;;19535:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19528:58;19086:508;-1:-1:-1;;;;19086:508:0:o;18642:347::-;18715:14;18731;18776:6;-1:-1:-1;;;;;18766:16:0;:6;-1:-1:-1;;;;;18766:16:0;;;18758:66;;;;-1:-1:-1;;;18758:66:0;;25168:2:1;18758:66:0;;;25150:21:1;25207:2;25187:18;;;25180:30;25246:34;25226:18;;;25219:62;-1:-1:-1;;;25297:18:1;;;25290:35;25342:19;;18758:66:0;24966:401:1;18758:66:0;18863:6;-1:-1:-1;;;;;18854:15:0;:6;-1:-1:-1;;;;;18854:15:0;;:53;;18892:6;18900;18854:53;;;18873:6;18881;18854:53;18835:72;;-1:-1:-1;18835:72:0;-1:-1:-1;;;;;;18926:20:0;;18918:63;;;;-1:-1:-1;;;18918:63:0;;25574:2:1;18918:63:0;;;25556:21:1;25613:2;25593:18;;;25586:30;25652:32;25632:18;;;25625:60;25702:18;;18918:63:0;25372:354:1;18918:63:0;18642:347;;;;;:::o;26335:696::-;26628:12;26642;26656:14;26609:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;26704:93:::1;26718:6;26726;26734;26742:14;26758;26774:10;26786;26704:13;:93::i;:::-;26683:114:::0;;-1:-1:-1;26683:114:0;-1:-1:-1;26808:12:0::1;26823:31;26831:6:::0;26839;26847;26823:7:::1;:31::i;:::-;26808:46;;26865:52;26883:6;26891:10;26903:4;26909:7;26865:17;:52::i;:::-;26928;26946:6;26954:10;26966:4;26972:7;26928:17;:52::i;:::-;27003:20;::::0;-1:-1:-1;;;27003:20:0;;-1:-1:-1;;;;;4646:32:1;;;27003:20:0::1;::::0;::::1;4628:51:1::0;27003:16:0;::::1;::::0;::::1;::::0;4601:18:1;;27003:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26991:32;;26672:359;26335:696:::0;;;;;;;;;;;;;;:::o;20629:662::-;20722:11;20735;20759:12;20774:32;20782:7;20791:8;20801:4;20774:7;:32::i;:::-;20879:34;;-1:-1:-1;;;20879:34:0;;-1:-1:-1;;;;;4646:32:1;;;20879:34:0;;;4628:51:1;4646:32;;-1:-1:-1;;;;;20892:7:0;20879:28;;;;;;4601:18:1;;20879:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20875:125;;;20945:43;;-1:-1:-1;;;20945:43:0;;;;;25905:25:1;;;-1:-1:-1;;;;;25966:32:1;;;25946:18;;;25939:60;20945:24:0;;;;;25878:18:1;;20945:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20930:58;;20875:125;21017:33;21025:7;21034:8;21044:5;21017:7;:33::i;:::-;21065:34;;-1:-1:-1;;;21065:34:0;;-1:-1:-1;;;;;4646:32:1;;;21065:34:0;;;4628:51:1;21010:40:0;;-1:-1:-1;21078:7:0;21065:28;;;;;;4601:18:1;;21065:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21061:127;;;21133:43;;-1:-1:-1;;;21133:43:0;;;;;25905:25:1;;;-1:-1:-1;;;;;25966:32:1;;;25946:18;;;25939:60;21133:24:0;;;;;25878:18:1;;21133:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21116:60;;21061:127;21220:14;21205:12;:29;:78;;21261:14;21277:5;21205:78;;;21238:12;21252:4;21205:78;21198:85;;;;;;;20629:662;;;;;;:::o;20102:375::-;20189:13;20204;20231:14;20250:26;20261:6;20269;20250:10;:26::i;:::-;20230:46;;;20288:13;20303;20327:31;20335:6;20343;20351;20327:7;:31::i;:::-;-1:-1:-1;;;;;20321:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20287:86;;;;;20417:6;-1:-1:-1;;;;;20407:16:0;:6;-1:-1:-1;;;;;20407:16:0;;:62;;20450:8;20460;20407:62;;;20427:8;20437;20407:62;20384:85;;;;-1:-1:-1;20102:375:0;-1:-1:-1;;;;;;;20102:375:0:o;33176:632::-;33341:21;33317:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;33414:4:::1;-1:-1:-1::0;;;;;33388:31:0::1;:6;;33395:1;33388:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;33388:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;33388:31:0::1;;33380:74;;;;-1:-1:-1::0;;;33380:74:0::1;;;;;;;:::i;:::-;33475:32;33489:9;33500:6;;33475:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;33465:42;;33557:12;33526:7;33551:1;33534:7;:14;:18;;;;:::i;:::-;33526:27;;;;;;;;:::i;:::-;;;;;;;:43;;33518:100;;;;-1:-1:-1::0;;;33518:100:0::1;;;;;;;:::i;:::-;33629:4;-1:-1:-1::0;;;;;33629:12:0::1;;33649:7;33657:1;33649:10;;;;;;;;:::i;:::-;;;;;;;33629:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;33680:4;-1:-1:-1::0;;;;;33680:13:0::1;;33694:55;33702:6;;33709:1;33702:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;33702:14:0::1;:::i;:::-;33718:6;;33725:1;33718:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;33732:6;;33739:1;33732:9;;;;;;;:::i;33694:55::-;33751:7;33759:1;33751:10;;;;;;;;:::i;:::-;;;;;;;33680:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26513:32:1;;;;26495:51;;26577:2;26562:18;;26555:34;26483:2;26468:18;;26321:274;33680:82:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33673:90;;;;:::i;:::-;33774:26;33780:7;33789:6;;33774:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;33797:2;33774:5;:26::i;:::-;33176:632:::0;;;;;;;;:::o;38426:737::-;38643:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;38664:163:::1;38693:6;;38700:1;38693:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;38693:14:0::1;:::i;:::-;38719:10;38741:55;38749:6;;38756:1;38749:9;;;;;;;:::i;38741:55::-;38808:8;38664:17;:163::i;:::-;38838:18;38866:6:::0;;38873:17:::1;38889:1;38866:6:::0;38873:17:::1;:::i;:::-;38866:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;38859:50;::::0;-1:-1:-1;;;38859:50:0;;-1:-1:-1;;;;;4646:32:1;;;38859:50:0::1;::::0;::::1;4628:51:1::0;38859:46:0;;;::::1;::::0;::::1;::::0;4601:18:1;;38859:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38838:71;;38920:46;38955:6;;38963:2;38920:34;:46::i;:::-;39071:12:::0;39053:13;39006:6;;39013:17:::1;39029:1;39006:6:::0;39013:17:::1;:::i;:::-;39006:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;38999:50;::::0;-1:-1:-1;;;38999:50:0;;-1:-1:-1;;;;;4646:32:1;;;38999:50:0::1;::::0;::::1;4628:51:1::0;38999:46:0;;;::::1;::::0;::::1;::::0;4601:18:1;;38999:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;38977:178;;;;-1:-1:-1::0;;;38977:178:0::1;;;;;;;:::i;:::-;38653:510;38426:737:::0;;;;;;;:::o;34599:404::-;34793:13;34774:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;34819:114:::1;34837:6;;34844:1;34837:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;34837:14:0::1;:::i;:::-;34853:10;34865:55;34873:6;;34880:1;34873:9;;;;;;;:::i;34865:55::-;34922:7;34930:1;34922:10;;;;;;;;:::i;34819:114::-;34944:26;34950:7;34959:6;;34944:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;-1:-1:-1::0;34988:7:0;;34599:404;-1:-1:-1;;;;;34599:404:0:o;39169:838::-;39394:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;39454:4:::1;-1:-1:-1::0;;;;;39428:31:0::1;:6;;39435:1;39428:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;39428:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;39428:31:0::1;;39420:74;;;;-1:-1:-1::0;;;39420:74:0::1;;;;;;;:::i;:::-;39505:13;39521:9;39505:25;;39541:4;-1:-1:-1::0;;;;;39541:12:0::1;;39561:8;39541:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;39590:4;-1:-1:-1::0;;;;;39590:13:0::1;;39604:55;39612:6;;39619:1;39612:9;;;;;;;:::i;39604:55::-;39590:80;::::0;-1:-1:-1;;;;;;39590:80:0::1;::::0;;;;;;-1:-1:-1;;;;;26513:32:1;;;39590:80:0::1;::::0;::::1;26495:51:1::0;26562:18;;;26555:34;;;26468:18;;39590:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39583:88;;;;:::i;:::-;39682:18;39710:6:::0;;39717:17:::1;39733:1;39710:6:::0;39717:17:::1;:::i;:::-;39710:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;39703:50;::::0;-1:-1:-1;;;39703:50:0;;-1:-1:-1;;;;;4646:32:1;;;39703:50:0::1;::::0;::::1;4628:51:1::0;39703:46:0;;;::::1;::::0;::::1;::::0;4601:18:1;;39703:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39682:71;;39764:46;39799:6;;39807:2;39764:34;:46::i;:::-;39915:12:::0;39897:13;39850:6;;39857:17:::1;39873:1;39850:6:::0;39857:17:::1;:::i;:::-;39850:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;39843:50;::::0;-1:-1:-1;;;39843:50:0;;-1:-1:-1;;;;;4646:32:1;;;39843:50:0::1;::::0;::::1;4628:51:1::0;39843:46:0;;;::::1;::::0;::::1;::::0;4601:18:1;;39843:50:0::1;4468:217:1::0;40013:813:0;40245:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40319:4:0::1;40279:45;:6:::0;;40286:17:::1;40302:1;40279:6:::0;40286:17:::1;:::i;:::-;40279:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40279:45:0::1;;40271:88;;;;-1:-1:-1::0;;;40271:88:0::1;;;;;;;:::i;:::-;40370:136;40402:6;;40409:1;40402:9;;;;;;;:::i;40370:136::-;40517:57;40552:6;;40568:4;40517:34;:57::i;:::-;40602:46;::::0;-1:-1:-1;;;40602:46:0;;40642:4:::1;40602:46;::::0;::::1;4628:51:1::0;40585:14:0::1;::::0;40617:4:::1;-1:-1:-1::0;;;;;40602:31:0::1;::::0;::::1;::::0;4601:18:1;;40602:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40585:63;;40680:12;40667:9;:25;;40659:82;;;;-1:-1:-1::0;;;40659:82:0::1;;;;;;;:::i;:::-;40752:24;::::0;-1:-1:-1;;;40752:24:0;;::::1;::::0;::::1;15469:25:1::0;;;40752:4:0::1;-1:-1:-1::0;;;;;40752:13:0::1;::::0;::::1;::::0;15442:18:1;;40752:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40787:31;40804:2;40808:9;40787:16;:31::i;21769:569::-:0;21851:21;21910:1;21893:6;:13;:18;;21885:61;;;;-1:-1:-1;;;21885:61:0;;;;;;;:::i;:::-;21978:13;;:15;;21992:1;21978:15;:::i;:::-;21967:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21967:27:0;;21957:37;;22018:8;22005:7;22013:1;22005:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;22042:6;22037:294;22058:6;:13;22054:1;:17;22037:294;;;22093:12;22108:55;22116:6;22123:1;22116:9;;;;;;;;:::i;:::-;;;;;;;:14;;;22132:6;22139:1;22132:9;;;;;;;;:::i;:::-;;;;;;;:12;;;22146:6;22153:1;22146:9;;;;;;;;:::i;22108:55::-;22182:34;;-1:-1:-1;;;22182:34:0;;-1:-1:-1;;;;;4646:32:1;;;22182:34:0;;;4628:51:1;22093:70:0;;-1:-1:-1;22195:7:0;22182:28;;;;;;4601:18:1;;22182:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22178:142;;;22258:4;-1:-1:-1;;;;;22252:24:0;;22277:7;22285:1;22277:10;;;;;;;;:::i;:::-;;;;;;;22289:6;22296:1;22289:9;;;;;;;;:::i;:::-;;;;;;;:14;;;22252:52;;;;;;;;;;;;;;;25905:25:1;;;-1:-1:-1;;;;;25966:32:1;25961:2;25946:18;;25939:60;25893:2;25878:18;;25731:274;22252:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22237:7;22245:3;:1;22247;22245:3;:::i;:::-;22237:12;;;;;;;;:::i;:::-;;;;;;:67;;;;;22178:142;-1:-1:-1;22073:3:0;;;;:::i;:::-;;;;22037:294;;;;21769:569;;;;:::o;22473:1482::-;22662:12;22676;22690:14;22769:13;22798:7;-1:-1:-1;;;;;22785:29:0;;22815:6;22823;22831;22785:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22769:69;-1:-1:-1;22850:13:0;;;-1:-1:-1;;;;;22934:19:0;;;22930:167;;22992:5;-1:-1:-1;;;;;22985:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22970:42;;23050:35;23062:6;23070;23078;23050:11;:35::i;:::-;23027:58;;-1:-1:-1;23027:58:0;-1:-1:-1;22930:167:0;23111:13;;:30;;;;-1:-1:-1;23128:13:0;;23111:30;23107:841;;;23180:14;;-1:-1:-1;23196:14:0;;-1:-1:-1;18112:5:0;23238:28;23248:17;23196:14;23180;23248:17;:::i;:::-;23238:9;:28::i;:::-;:48;;;;:::i;:::-;23226:60;;23107:841;;;23321:19;23343:50;23358:14;23374:8;23384;23343:14;:50::i;:::-;23321:72;;23430:14;23412;:32;23408:529;;23487:14;;-1:-1:-1;23503:14:0;-1:-1:-1;23503:14:0;23549:78;23583:8;23558:22;23568:12;23487:14;23558:22;:::i;:::-;:33;;;;:::i;:::-;23618:8;23593:22;23603:12;23593:7;:22;:::i;:::-;:33;;;;:::i;:::-;23549:8;:78::i;:::-;23537:90;;23408:529;;;23668:19;23690:50;23705:14;23721:8;23731;23690:14;:50::i;:::-;23668:72;-1:-1:-1;23797:14:0;;-1:-1:-1;23668:72:0;;-1:-1:-1;23843:78:0;23877:8;23852:22;23862:12;23668:72;23852:22;:::i;:::-;:33;;;;:::i;:::-;23912:8;23887:22;23897:12;23887:7;:22;:::i;23843:78::-;23831:90;;23649:288;23408:529;23304:644;23107:841;22706:1249;;;;22473:1482;;;;;;;;;:::o;29600:701::-;29911:12;29925;29950;29965:31;29973:6;29981;29989;29965:7;:31::i;:::-;29950:46;;30022:10;30035;:39;;30065:9;30035:39;;;-1:-1:-1;;30035:39:0;30089:71;;-1:-1:-1;;;30089:71:0;;30022:52;;-1:-1:-1;;;;;;30089:18:0;;;;;:71;;30108:10;;30128:4;;30022:52;;30142:8;;30152:1;;30155;;30158;;30089:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30007:165;30205:88;30221:6;30229;30237;30245:9;30256:10;30268;30280:2;30284:8;30205:15;:88::i;:::-;30184:109;;;;;;;;29939:362;29600:701;;;;;;;;;;;;;;;:::o;27039:949::-;27297:16;27315:14;27331;27278:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;27385:206:::1;27413:5;27441:4;27461:6;27482:18;27515:9;27539:14;27568:12;27385:13;:206::i;:::-;27358:233:::0;;-1:-1:-1;27358:233:0;-1:-1:-1;27602:12:0::1;27617:37;27625:5:::0;27640:4:::1;27647:6:::0;27617:7:::1;:37::i;:::-;27602:52;;27665:55;27683:5;27690:10;27702:4;27708:11;27665:17;:55::i;:::-;27731:4;-1:-1:-1::0;;;;;27731:12:0::1;;27751:9;27731:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27781:30:0::1;::::0;-1:-1:-1;;;27781:30:0;;-1:-1:-1;;;;;26513:32:1;;;27781:30:0::1;::::0;::::1;26495:51:1::0;26562:18;;;26555:34;;;27781:4:0::1;:13;::::0;-1:-1:-1;27781:13:0::1;::::0;-1:-1:-1;26468:18:1;;;-1:-1:-1;27781:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27774:38;;;;:::i;:::-;27835:20;::::0;-1:-1:-1;;;27835:20:0;;-1:-1:-1;;;;;4646:32:1;;;27835:20:0::1;::::0;::::1;4628:51:1::0;27835:16:0;::::1;::::0;::::1;::::0;4601:18:1;;27835:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27823:32;;27918:9;27906;:21;27902:78;;;27929:51;27946:10;27958:21;27970:9:::0;27958::::1;:21;:::i;:::-;27929:16;:51::i;:::-;27347:641;27039:949:::0;;;;;;;;;;;;:::o;28919:673::-;29161:16;29179:14;29142:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;29233:226:::1;29263:5;29291:4;29311:6;29332:9;29356:14;29385:12;29420:4;29440:8;29233:15;:226::i;:::-;29206:253:::0;;-1:-1:-1;29206:253:0;-1:-1:-1;29470:37:0::1;29484:5:::0;29491:2;29206:253;29470:13:::1;:37::i;:::-;29518:24;::::0;-1:-1:-1;;;29518:24:0;;::::1;::::0;::::1;15469:25:1::0;;;29518:4:0::1;-1:-1:-1::0;;;;;29518:13:0::1;::::0;::::1;::::0;15442:18:1;;29518:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29553:31;29570:2;29574:9;29553:16;:31::i;:::-;28919:673:::0;;;;;;;;;;;:::o;21366:316::-;21472:11;21496:12;21511:34;21519:7;21528:8;21538:6;21511:7;:34::i;:::-;21560;;-1:-1:-1;;;21560:34:0;;-1:-1:-1;;;;;4646:32:1;;;21560:34:0;;;4628:51:1;21496:49:0;;-1:-1:-1;21573:7:0;21560:28;;;;;;4601:18:1;;21560:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21556:119;;;21620:43;;-1:-1:-1;;;21620:43:0;;;;;25905:25:1;;;-1:-1:-1;;;;;25966:32:1;;;25946:18;;;25939:60;21620:24:0;;;;;25878:18:1;;21620:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21611:52;;21556:119;21485:197;21366:316;;;;;;:::o;36293:752::-;36616:16;36634:14;36661:12;36676:37;36684:5;36699:4;36706:6;36676:7;:37::i;:::-;36661:52;;36724:10;36737;:39;;36767:9;36737:39;;;-1:-1:-1;;36737:39:0;36787:71;;-1:-1:-1;;;36787:71:0;;36724:52;;-1:-1:-1;;;;;;36787:18:0;;;;;:71;;36806:10;;36826:4;;36724:52;;36840:8;;36850:1;;36853;;36856;;36787:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36896:141;36958:5;36965:6;36973:9;36984:14;37000:12;37014:2;37018:8;36896:47;:141::i;22346:119::-;22423:34;;-1:-1:-1;;;22423:34:0;;-1:-1:-1;;;;;4646:32:1;;;22423:34:0;;;4628:51:1;22399:4:0;;22436:7;22423:28;;;;;;4601:18:1;;22423:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22416:41;22346:119;-1:-1:-1;;22346:119:0:o;32581:587::-;32788:21;32769:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;32832:31:::1;32846:8;32856:6;;32832:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;32822:41;;32913:12;32882:7;32907:1;32890:7;:14;:18;;;;:::i;:::-;32882:27;;;;;;;;:::i;:::-;;;;;;;:43;;32874:100;;;;-1:-1:-1::0;;;32874:100:0::1;;;;;;;:::i;:::-;32985:138;33017:6;;33024:1;33017:9;;;;;;;:::i;32985:138::-;33134:26;33140:7;33149:6;;33134:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;35558:729:::0;35829:16;35847:14;35810:8;18232:15;18220:8;:27;;18212:65;;;;-1:-1:-1;;;18212:65:0;;;;;;;:::i;:::-;35901:226:::1;35931:5;35959:4;35979:6;36000:9;36024:14;36053:12;36088:4;36108:8;35901:15;:226::i;:::-;36163:38;::::0;-1:-1:-1;;;36163:38:0;;36195:4:::1;36163:38;::::0;::::1;4628:51:1::0;35874:253:0;;-1:-1:-1;35874:253:0;-1:-1:-1;36138:64:0::1;::::0;36152:5;;36159:2;;-1:-1:-1;;;;;36163:23:0;::::1;::::0;::::1;::::0;4601:18:1;;36163:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36138:13;:64::i;41500:444::-:0;41631:1;41611:5;-1:-1:-1;;;;;41611:17:0;;:21;41603:74;;;;-1:-1:-1;;;41603:74:0;;;;;;;:::i;:::-;41744:69;;;-1:-1:-1;;;;;19439:15:1;;;41744:69:0;;;19421:34:1;19491:15;;;19471:18;;;19464:43;19523:18;;;;19516:34;;;41744:69:0;;;;;;;;;;19356:18:1;;;;41744:69:0;;;;;;;-1:-1:-1;;;;;41744:69:0;-1:-1:-1;;;41744:69:0;;;41733:81;;-1:-1:-1;;;;41733:10:0;;;;:81;;41744:69;41733:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41688:126;;;;41833:7;:57;;;;-1:-1:-1;41845:11:0;;:16;;:44;;;41876:4;41865:24;;;;;;;;;;;;:::i;:::-;41825:111;;;;-1:-1:-1;;;41825:111:0;;28026:2:1;41825:111:0;;;28008:21:1;28065:2;28045:18;;;28038:30;28104:34;28084:18;;;28077:62;-1:-1:-1;;;28155:18:1;;;28148:39;28204:19;;41825:111:0;27824:405:1;41825:111:0;41592:352;;41500:444;;;;:::o;31095:680::-;31202:6;31197:571;31218:6;:13;31214:1;:17;31197:571;;;31254:14;31273:40;31284:6;31291:1;31284:9;;;;;;;;:::i;:::-;;;;;;;:14;;;31300:6;31307:1;31300:9;;;;;;;;:::i;:::-;;;;;;;:12;;;31273:10;:40::i;:::-;-1:-1:-1;31253:60:0;-1:-1:-1;31328:14:0;31345:7;31353:5;:1;31357;31353:5;:::i;:::-;31345:14;;;;;;;;:::i;:::-;;;;;;;31328:31;;31375:15;31392;31429:6;-1:-1:-1;;;;;31411:24:0;:6;31418:1;31411:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;31411:24:0;;:70;;31462:9;31478:1;31411:70;;;31444:1;31448:9;31411:70;31374:107;;;;31496:10;31529:1;31513:6;:13;:17;;;;:::i;:::-;31509:1;:21;:91;;31597:3;31509:91;;;31533:61;31541:6;31548:3;:1;31550;31548:3;:::i;:::-;31541:11;;;;;;;;:::i;:::-;;;;;;;:16;;;31559:6;31566:1;31568;31566:3;;;;:::i;:::-;31559:11;;;;;;;;:::i;:::-;;;;;;;:14;;;31575:6;31582:1;31584;31582:3;;;;:::i;:::-;31575:11;;;;;;;;:::i;31533:61::-;31496:104;;31621:55;31629:6;31636:1;31629:9;;;;;;;;:::i;:::-;;;;;;;:14;;;31645:6;31652:1;31645:9;;;;;;;;:::i;:::-;;;;;;;:12;;;31659:6;31666:1;31659:9;;;;;;;;:::i;31621:55::-;-1:-1:-1;;;;;31615:67:0;;31701:10;31713;31725:2;31739:1;31729:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31729:12:0;;31615:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31238:530;;;;;31233:3;;;;;:::i;:::-;;;;31197:571;;;;31095:680;;;:::o;40876:196::-;40985:12;;;40947;40985;;;;;;;;;-1:-1:-1;;;;;40964:7:0;;;40978:5;;40964:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40946:52;;;41017:7;41009:55;;;;-1:-1:-1;;;41009:55:0;;29065:2:1;41009:55:0;;;29047:21:1;29104:2;29084:18;;;29077:30;29143:34;29123:18;;;29116:62;-1:-1:-1;;;29194:18:1;;;29187:33;29237:19;;41009:55:0;28863:399:1;41009:55:0;40935:137;40876:196;;:::o;24723:1604::-;24955:12;24969;25020:10;25002:14;:28;;24994:82;;;;-1:-1:-1;;;24994:82:0;;29469:2:1;24994:82:0;;;29451:21:1;29508:2;29488:18;;;29481:30;29547:34;29527:18;;;29520:62;-1:-1:-1;;;29598:18:1;;;29591:39;29647:19;;24994:82:0;29267:405:1;24994:82:0;25113:10;25095:14;:28;;25087:82;;;;-1:-1:-1;;;25087:82:0;;29879:2:1;25087:82:0;;;29861:21:1;29918:2;29898:18;;;29891:30;29957:34;29937:18;;;29930:62;-1:-1:-1;;;30008:18:1;;;30001:39;30057:19;;25087:82:0;29677:405:1;25087:82:0;25248:53;;-1:-1:-1;;;25248:53:0;;25232:13;;-1:-1:-1;;;;;25261:7:0;25248:29;;;;:53;;25278:6;;25286;;25294;;25248:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25232:69;-1:-1:-1;;;;;;25316:19:0;;25312:116;;25360:56;;-1:-1:-1;;;25360:56:0;;-1:-1:-1;;;;;25373:7:0;25360:32;;;;:56;;25393:6;;25401;;25409;;25360:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25352:64;;25312:116;25439:13;25454;25471:35;25483:6;25491;25499;25471:11;:35::i;:::-;25438:68;;;;25521:8;25533:1;25521:13;:30;;;;-1:-1:-1;25538:13:0;;25521:30;25517:803;;;25590:14;;-1:-1:-1;25606:14:0;;-1:-1:-1;25517:803:0;;;25654:19;25676:50;25691:14;25707:8;25717;25676:14;:50::i;:::-;25654:72;;25763:14;25745;:32;25741:568;;25824:10;25806:14;:28;;25798:80;;;;-1:-1:-1;;;25798:80:0;;;;;;;:::i;:::-;25919:14;;-1:-1:-1;25935:14:0;-1:-1:-1;25935:14:0;25741:568;;;25991:19;26013:50;26028:14;26044:8;26054;26013:14;:50::i;:::-;25991:72;;26107:14;26089;:32;;26082:40;;;;:::i;:::-;26167:10;26149:14;:28;;26141:80;;;;-1:-1:-1;;;26141:80:0;;;;;;;:::i;:::-;26262:14;-1:-1:-1;26278:14:0;;-1:-1:-1;25741:568:0;25639:681;25517:803;24983:1344;;;24723:1604;;;;;;;;;;:::o;37190:1230::-;37305:6;37300:1113;37313:17;;;37300:1113;;;37431:14;37450:40;37461:6;;37468:1;37461:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;37461:14:0;:::i;:::-;37477:6;;37484:1;37477:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;37450:40::-;37430:60;;;37505:10;37524:55;37532:6;;37539:1;37532:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;37532:14:0;:::i;:::-;37548:6;;37555:1;37548:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;37562:6;;37569:1;37562:9;;;;;;;:::i;37524:55::-;37505:75;;37595:16;37626:17;37715:13;37730;37748:4;-1:-1:-1;;;;;37748:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37714:52;;;;;37783:17;37823:6;-1:-1:-1;;;;;37805:24:0;:6;;37812:1;37805:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;37805:14:0;:::i;:::-;-1:-1:-1;;;;;37805:24:0;;:70;;37856:8;37866;37805:70;;;37833:8;37843;37805:70;37782:93;;;37956:12;37912:6;;37919:1;37912:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;37912:14:0;:::i;:::-;37905:47;;-1:-1:-1;;;37905:47:0;;-1:-1:-1;;;;;4646:32:1;;;37905:47:0;;;4628:51:1;37905:32:0;;;;;;;4601:18:1;;37905:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;37891:78;;38000:73;38013:11;38026:6;;38033:1;38026:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;38026:14:0;:::i;:::-;38042:6;;38049:1;38042:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;38056:6;;38063:1;38056:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;38000:73::-;37985:88;;37658:431;;;38104:15;38121;38158:6;-1:-1:-1;;;;;38140:24:0;:6;;38147:1;38140:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;38140:14:0;:::i;:::-;-1:-1:-1;;;;;38140:24:0;;:76;;38194:12;38213:1;38140:76;;;38173:1;38177:12;38140:76;38103:113;;-1:-1:-1;38103:113:0;-1:-1:-1;38231:10:0;38248:17;38264:1;38248:6;:17;:::i;:::-;38244:1;:21;:91;;38332:3;38244:91;;;38268:61;38276:6;;38283:3;:1;38285;38283:3;:::i;:::-;38276:11;;;;;;;:::i;:::-;:16;;;:11;;;;;:16;;;;-1:-1:-1;38276:16:0;:::i;:::-;38294:6;;38301:3;:1;38303;38301:3;:::i;:::-;38294:11;;;;;;;:::i;:::-;;;;;;:14;;;;;;;;;;:::i;:::-;38310:6;;38317:3;:1;38319;38317:3;:::i;:::-;38310:11;;;;;;;:::i;38268:61::-;38388:12;;;38398:1;38388:12;;;;;;;;;-1:-1:-1;;;38350:51:0;;;38231:104;;-1:-1:-1;;;;;;38350:9:0;;;;;:51;;38360:10;;38372;;38231:104;;38350:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37337:1076;;;;;;;37332:3;;;;;:::i;:::-;;;;37300:1113;;8370:1673;8418:7;8442:6;8438:47;;-1:-1:-1;8472:1:0;;8370:1673;-1:-1:-1;8370:1673:0:o;8438:47::-;9176:14;9210:1;9199:7;9204:1;9199:4;:7::i;:::-;:12;;9193:1;:19;;9176:36;;9678:1;9667:6;9663:1;:10;;;;;:::i;:::-;;9654:6;:19;9653:26;;9644:35;;9728:1;9717:6;9713:1;:10;;;;;:::i;:::-;;9704:6;:19;9703:26;;9694:35;;9778:1;9767:6;9763:1;:10;;;;;:::i;:::-;;9754:6;:19;9753:26;;9744:35;;9828:1;9817:6;9813:1;:10;;;;;:::i;:::-;;9804:6;:19;9803:26;;9794:35;;9878:1;9867:6;9863:1;:10;;;;;:::i;:::-;;9854:6;:19;9853:26;;9844:35;;9928:1;9917:6;9913:1;:10;;;;;:::i;:::-;;9904:6;:19;9903:26;;9894:35;;9978:1;9967:6;9963:1;:10;;;;;:::i;:::-;;9954:6;:19;9953:26;;9944:35;;10001:23;10005:6;10017;10013:1;:10;;;;;:::i;:::-;;10001:3;:23::i;:::-;9994:30;8370:1673;-1:-1:-1;;;8370:1673:0:o;19712:327::-;19803:12;19846:1;19836:7;:11;19828:61;;;;-1:-1:-1;;;19828:61:0;;30289:2:1;19828:61:0;;;30271:21:1;30328:2;30308:18;;;30301:30;30367:34;30347:18;;;30340:62;-1:-1:-1;;;30418:18:1;;;30411:35;30463:19;;19828:61:0;30087:401:1;19828:61:0;19919:1;19908:8;:12;:28;;;;;19935:1;19924:8;:12;19908:28;19900:81;;;;-1:-1:-1;;;19900:81:0;;30695:2:1;19900:81:0;;;30677:21:1;30734:2;30714:18;;;30707:30;30773:34;30753:18;;;30746:62;-1:-1:-1;;;30824:18:1;;;30817:38;30872:19;;19900:81:0;30493:404:1;19900:81:0;20023:8;20002:18;20012:8;20002:7;:18;:::i;:::-;:29;;;;:::i;2302:106::-;2360:7;2391:1;2387;:5;:13;;2399:1;2387:13;;;-1:-1:-1;2395:1:0;;2380:20;-1:-1:-1;2302:106:0:o;41080:412::-;41193:1;41173:5;-1:-1:-1;;;;;41173:17:0;;:21;41165:74;;;;-1:-1:-1;;;41165:74:0;;;;;;;:::i;:::-;41306:59;;;-1:-1:-1;;;;;26513:32:1;;;41306:59:0;;;26495:51:1;26562:18;;;;26555:34;;;41306:59:0;;;;;;;;;;26468:18:1;;;;41306:59:0;;;;;;;-1:-1:-1;;;;;41306:59:0;-1:-1:-1;;;41306:59:0;;;41295:71;;-1:-1:-1;;;;41295:10:0;;;;:71;;41306:59;41295:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41250:116;;;;41385:7;:57;;;;-1:-1:-1;41397:11:0;;:16;;:44;;;41428:4;41417:24;;;;;;;;;;;;:::i;:::-;41377:107;;;;-1:-1:-1;;;41377:107:0;;31104:2:1;41377:107:0;;;31086:21:1;31143:2;31123:18;;;31116:30;31182:34;31162:18;;;31155:62;-1:-1:-1;;;31233:18:1;;;31226:35;31278:19;;41377:107:0;30902:401:1;41377:107:0;41154:338;;41080:412;;;:::o;10520:1019::-;10572:7;;10659:3;10650:12;;;:16;10646:102;;10697:3;10687:13;;;;10719;10646:102;10775:2;10766:11;;;:15;10762:99;;10812:2;10802:12;;;;10833;10762:99;10888:2;10879:11;;;:15;10875:99;;10925:2;10915:12;;;;10946;10875:99;11001:2;10992:11;;;:15;10988:99;;11038:2;11028:12;;;;11059;10988:99;11114:1;11105:10;;;:14;11101:96;;11150:1;11140:11;;;;11170;11101:96;11224:1;11215:10;;;:14;11211:96;;11260:1;11250:11;;;;11280;11211:96;11334:1;11325:10;;;:14;11321:96;;11370:1;11360:11;;;;11390;11321:96;11444:1;11435:10;;;:14;11431:66;;11480:1;11470:11;11525:6;10520:1019;-1:-1:-1;;10520:1019:0:o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:384::-;3334:8;3344:6;3398:3;3391:4;3383:6;3379:17;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;-1:-1:-1;3439:20:1;;3482:18;3471:30;;3468:50;;;3514:1;3511;3504:12;3468:50;3551:4;3543:6;3539:17;3527:29;;3614:3;3607:4;3599;3591:6;3587:17;3579:6;3575:30;3571:41;3568:50;3565:70;;;3631:1;3628;3621:12;3646:817;3793:6;3801;3809;3817;3825;3833;3886:3;3874:9;3865:7;3861:23;3857:33;3854:53;;;3903:1;3900;3893:12;3854:53;3939:9;3926:23;3916:33;;3996:2;3985:9;3981:18;3968:32;3958:42;;4051:2;4040:9;4036:18;4023:32;4078:18;4070:6;4067:30;4064:50;;;4110:1;4107;4100:12;4064:50;4149:84;4225:7;4216:6;4205:9;4201:22;4149:84;:::i;:::-;4252:8;;-1:-1:-1;4123:110:1;-1:-1:-1;;4337:2:1;4322:18;;4309:32;4350:31;4309:32;4350:31;:::i;:::-;4400:5;4390:15;;;4452:3;4441:9;4437:19;4424:33;4414:43;;3646:817;;;;;;;;:::o;4690:592::-;4773:6;4781;4789;4797;4850:3;4838:9;4829:7;4825:23;4821:33;4818:53;;;4867:1;4864;4857:12;4818:53;4906:9;4893:23;4925:31;4950:5;4925:31;:::i;:::-;4975:5;-1:-1:-1;5032:2:1;5017:18;;5004:32;5045:33;5004:32;5045:33;:::i;:::-;5097:7;-1:-1:-1;5156:2:1;5141:18;;5128:32;5169:30;5128:32;5169:30;:::i;:::-;4690:592;;;;-1:-1:-1;5218:7:1;;5272:2;5257:18;5244:32;;-1:-1:-1;;4690:592:1:o;5287:156::-;5353:20;;5413:4;5402:16;;5392:27;;5382:55;;5433:1;5430;5423:12;5448:1146;5589:6;5597;5605;5613;5621;5629;5637;5645;5653;5661;5669:7;5723:3;5711:9;5702:7;5698:23;5694:33;5691:53;;;5740:1;5737;5730:12;5691:53;5779:9;5766:23;5798:31;5823:5;5798:31;:::i;:::-;5848:5;-1:-1:-1;5905:2:1;5890:18;;5877:32;5918:30;5877:32;5918:30;:::i;:::-;5967:7;-1:-1:-1;6021:2:1;6006:18;;5993:32;;-1:-1:-1;6072:2:1;6057:18;;6044:32;;-1:-1:-1;6123:3:1;6108:19;;6095:33;;-1:-1:-1;6180:3:1;6165:19;;6152:33;6194;6152;6194;:::i;:::-;6246:7;-1:-1:-1;6300:3:1;6285:19;;6272:33;;-1:-1:-1;6357:3:1;6342:19;;6329:33;6371:30;6329:33;6371:30;:::i;:::-;6420:7;-1:-1:-1;6446:37:1;6478:3;6463:19;;6446:37;:::i;:::-;6436:47;;6530:3;6519:9;6515:19;6502:33;6492:43;;6583:3;6572:9;6568:19;6555:33;6544:44;;5448:1146;;;;;;;;;;;;;;:::o;6599:523::-;6673:6;6681;6689;6742:2;6730:9;6721:7;6717:23;6713:32;6710:52;;;6758:1;6755;6748:12;6710:52;6797:9;6784:23;6816:31;6841:5;6816:31;:::i;:::-;6866:5;-1:-1:-1;6923:2:1;6908:18;;6895:32;6936:33;6895:32;6936:33;:::i;:::-;6988:7;-1:-1:-1;7047:2:1;7032:18;;7019:32;7060:30;7019:32;7060:30;:::i;:::-;7109:7;7099:17;;;6599:523;;;;;:::o;7335:388::-;7403:6;7411;7464:2;7452:9;7443:7;7439:23;7435:32;7432:52;;;7480:1;7477;7470:12;7432:52;7519:9;7506:23;7538:31;7563:5;7538:31;:::i;:::-;7588:5;-1:-1:-1;7645:2:1;7630:18;;7617:32;7658:33;7617:32;7658:33;:::i;:::-;7710:7;7700:17;;;7335:388;;;;;:::o;8037:1010::-;8165:6;8173;8181;8189;8197;8205;8213;8221;8229;8282:3;8270:9;8261:7;8257:23;8253:33;8250:53;;;8299:1;8296;8289:12;8250:53;8338:9;8325:23;8357:31;8382:5;8357:31;:::i;:::-;8407:5;-1:-1:-1;8464:2:1;8449:18;;8436:32;8477:33;8436:32;8477:33;:::i;:::-;8529:7;-1:-1:-1;8588:2:1;8573:18;;8560:32;8601:30;8560:32;8601:30;:::i;:::-;8650:7;-1:-1:-1;8704:2:1;8689:18;;8676:32;;-1:-1:-1;8755:3:1;8740:19;;8727:33;;-1:-1:-1;8807:3:1;8792:19;;8779:33;;-1:-1:-1;8859:3:1;8844:19;;8831:33;;-1:-1:-1;8916:3:1;8901:19;;8888:33;8930;8888;8930;:::i;:::-;8982:7;8972:17;;;9036:3;9025:9;9021:19;9008:33;8998:43;;8037:1010;;;;;;;;;;;:::o;9376:456::-;9453:6;9461;9469;9522:2;9510:9;9501:7;9497:23;9493:32;9490:52;;;9538:1;9535;9528:12;9490:52;9574:9;9561:23;9551:33;;9634:2;9623:9;9619:18;9606:32;9647:31;9672:5;9647:31;:::i;:::-;9697:5;-1:-1:-1;9754:2:1;9739:18;;9726:32;9767:33;9726:32;9767:33;:::i;10100:748::-;10238:6;10246;10254;10262;10270;10323:3;10311:9;10302:7;10298:23;10294:33;10291:53;;;10340:1;10337;10330:12;10291:53;10376:9;10363:23;10353:33;;10437:2;10426:9;10422:18;10409:32;10464:18;10456:6;10453:30;10450:50;;;10496:1;10493;10486:12;10450:50;10535:84;10611:7;10602:6;10591:9;10587:22;10535:84;:::i;:::-;10638:8;;-1:-1:-1;10509:110:1;-1:-1:-1;;10723:2:1;10708:18;;10695:32;10736:31;10695:32;10736:31;:::i;:::-;10100:748;;;;-1:-1:-1;10100:748:1;;10838:2;10823:18;10810:32;;10100:748;-1:-1:-1;;10100:748:1:o;10853:127::-;10914:10;10909:3;10905:20;10902:1;10895:31;10945:4;10942:1;10935:15;10969:4;10966:1;10959:15;10985:275;11056:2;11050:9;11121:2;11102:13;;-1:-1:-1;;11098:27:1;11086:40;;11156:18;11141:34;;11177:22;;;11138:62;11135:88;;;11203:18;;:::i;:::-;11239:2;11232:22;10985:275;;-1:-1:-1;10985:275:1:o;11265:183::-;11325:4;11358:18;11350:6;11347:30;11344:56;;;11380:18;;:::i;:::-;-1:-1:-1;11425:1:1;11421:14;11437:4;11417:25;;11265:183::o;11453:1411::-;11616:6;11624;11632;11640;11648;11701:3;11689:9;11680:7;11676:23;11672:33;11669:53;;;11718:1;11715;11708:12;11669:53;11758:9;11745:23;11787:18;11828:2;11820:6;11817:14;11814:34;;;11844:1;11841;11834:12;11814:34;11882:6;11871:9;11867:22;11857:32;;11927:7;11920:4;11916:2;11912:13;11908:27;11898:55;;11949:1;11946;11939:12;11898:55;11985:2;11972:16;12007:4;12031:60;12047:43;12087:2;12047:43;:::i;:::-;12031:60;:::i;:::-;12125:15;;;12207:1;12203:10;;;;12195:19;;12191:28;;;12156:12;;;;12231:19;;;12228:39;;;12263:1;12260;12253:12;12228:39;12287:11;;;;12307:142;12323:6;12318:3;12315:15;12307:142;;;12389:17;;12377:30;;12340:12;;;;12427;;;;12307:142;;;12468:5;-1:-1:-1;;12511:18:1;;12498:32;;-1:-1:-1;;12542:16:1;;;12539:36;;;12571:1;12568;12561:12;12539:36;;12610:86;12688:7;12677:8;12666:9;12662:24;12610:86;:::i;:::-;12715:8;;-1:-1:-1;12584:112:1;-1:-1:-1;12769:38:1;;-1:-1:-1;12803:2:1;12788:18;;12769:38;:::i;12869:752::-;12921:5;12969:4;12957:9;12952:3;12948:19;12944:30;12941:50;;;12987:1;12984;12977:12;12941:50;13020:2;13014:9;13062:4;13054:6;13050:17;13133:6;13121:10;13118:22;13097:18;13085:10;13082:34;13079:62;13076:88;;;13144:18;;:::i;:::-;13180:2;13173:22;13213:6;-1:-1:-1;13213:6:1;13243:23;;13275:33;13243:23;13275:33;:::i;:::-;13317:23;;13392:2;13377:18;;13364:32;13405:33;13364:32;13405:33;:::i;:::-;13466:2;13454:15;;13447:32;13531:2;13516:18;;13503:32;13544:30;13503:32;13544:30;:::i;:::-;13602:2;13590:15;;;;13583:32;12869:752;;-1:-1:-1;;12869:752:1:o;13626:1026::-;13742:6;13750;13803:2;13791:9;13782:7;13778:23;13774:32;13771:52;;;13819:1;13816;13809:12;13771:52;13855:9;13842:23;13832:33;;13884:2;13937;13926:9;13922:18;13909:32;13964:18;13956:6;13953:30;13950:50;;;13996:1;13993;13986:12;13950:50;14019:22;;14072:4;14064:13;;14060:27;-1:-1:-1;14050:55:1;;14101:1;14098;14091:12;14050:55;14137:2;14124:16;14160:60;14176:43;14216:2;14176:43;:::i;14160:60::-;14254:15;;;14316:4;14355:11;;;14347:20;;14343:29;;;14285:12;;;;14242:3;14384:19;;;14381:39;;;14416:1;14413;14406:12;14381:39;14440:11;;;;14460:162;14476:6;14471:3;14468:15;14460:162;;;14542:37;14571:7;14566:3;14542:37;:::i;:::-;14530:50;;14493:12;;;;14600;;;;14460:162;;;14464:3;14641:5;14631:15;;;;;;;13626:1026;;;;;:::o;14657:661::-;14749:6;14757;14765;14773;14781;14834:3;14822:9;14813:7;14809:23;14805:33;14802:53;;;14851:1;14848;14841:12;14802:53;14890:9;14877:23;14909:31;14934:5;14909:31;:::i;:::-;14959:5;-1:-1:-1;15016:2:1;15001:18;;14988:32;15029:33;14988:32;15029:33;:::i;:::-;15081:7;-1:-1:-1;15140:2:1;15125:18;;15112:32;15153:30;15112:32;15153:30;:::i;:::-;14657:661;;;;-1:-1:-1;15202:7:1;;15256:2;15241:18;;15228:32;;-1:-1:-1;15307:3:1;15292:19;15279:33;;14657:661;-1:-1:-1;;14657:661:1:o;15505:1290::-;15655:6;15663;15671;15679;15687;15695;15703;15711;15719;15727;15735:7;15744;15798:3;15786:9;15777:7;15773:23;15769:33;15766:53;;;15815:1;15812;15805:12;15766:53;15854:9;15841:23;15873:31;15898:5;15873:31;:::i;:::-;15923:5;-1:-1:-1;15980:2:1;15965:18;;15952:32;15993:33;15952:32;15993:33;:::i;:::-;16045:7;-1:-1:-1;16104:2:1;16089:18;;16076:32;16117:30;16076:32;16117:30;:::i;:::-;16166:7;-1:-1:-1;16220:2:1;16205:18;;16192:32;;-1:-1:-1;16271:3:1;16256:19;;16243:33;;-1:-1:-1;16323:3:1;16308:19;;16295:33;;-1:-1:-1;16380:3:1;16365:19;;16352:33;16394;16352;16394;:::i;:::-;16446:7;-1:-1:-1;16500:3:1;16485:19;;16472:33;;-1:-1:-1;16557:3:1;16542:19;;16529:33;16571:30;16529:33;16571:30;:::i;:::-;16620:7;-1:-1:-1;16646:37:1;16678:3;16663:19;;16646:37;:::i;:::-;16636:47;;16731:3;16720:9;16716:19;16703:33;16692:44;;16784:3;16773:9;16769:19;16756:33;16745:44;;15505:1290;;;;;;;;;;;;;;:::o;16800:799::-;16910:6;16918;16926;16934;16942;16950;16958;17011:3;16999:9;16990:7;16986:23;16982:33;16979:53;;;17028:1;17025;17018:12;16979:53;17067:9;17054:23;17086:31;17111:5;17086:31;:::i;:::-;17136:5;-1:-1:-1;17193:2:1;17178:18;;17165:32;17206:30;17165:32;17206:30;:::i;:::-;17255:7;-1:-1:-1;17309:2:1;17294:18;;17281:32;;-1:-1:-1;17360:2:1;17345:18;;17332:32;;-1:-1:-1;17411:3:1;17396:19;;17383:33;;-1:-1:-1;17468:3:1;17453:19;;17440:33;17482;17440;17482;:::i;17604:592::-;17687:6;17695;17703;17711;17764:3;17752:9;17743:7;17739:23;17735:33;17732:53;;;17781:1;17778;17771:12;17732:53;17817:9;17804:23;17794:33;;17877:2;17866:9;17862:18;17849:32;17890:31;17915:5;17890:31;:::i;:::-;17940:5;-1:-1:-1;17997:2:1;17982:18;;17969:32;18010:33;17969:32;18010:33;:::i;:::-;18062:7;-1:-1:-1;18121:2:1;18106:18;;18093:32;18134:30;18093:32;18134:30;:::i;:::-;17604:592;;;;-1:-1:-1;17604:592:1;;-1:-1:-1;;17604:592:1:o;18383:247::-;18442:6;18495:2;18483:9;18474:7;18470:23;18466:32;18463:52;;;18511:1;18508;18501:12;18463:52;18550:9;18537:23;18569:31;18594:5;18569:31;:::i;18827:349::-;19029:2;19011:21;;;19068:2;19048:18;;;19041:30;19107:27;19102:2;19087:18;;19080:55;19167:2;19152:18;;18827:349::o;19561:245::-;19628:6;19681:2;19669:9;19660:7;19656:23;19652:32;19649:52;;;19697:1;19694;19687:12;19649:52;19729:9;19723:16;19748:28;19770:5;19748:28;:::i;20223:245::-;20302:6;20310;20363:2;20351:9;20342:7;20338:23;20334:32;20331:52;;;20379:1;20376;20369:12;20331:52;-1:-1:-1;;20402:16:1;;20458:2;20443:18;;;20437:25;20402:16;;20437:25;;-1:-1:-1;20223:245:1:o;20473:403::-;20675:2;20657:21;;;20714:2;20694:18;;;20687:30;20753:34;20748:2;20733:18;;20726:62;-1:-1:-1;;;20819:2:1;20804:18;;20797:37;20866:3;20851:19;;20473:403::o;20881:::-;21083:2;21065:21;;;21122:2;21102:18;;;21095:30;21161:34;21156:2;21141:18;;21134:62;-1:-1:-1;;;21227:2:1;21212:18;;21205:37;21274:3;21259:19;;20881:403::o;21289:127::-;21350:10;21345:3;21341:20;21338:1;21331:31;21381:4;21378:1;21371:15;21405:4;21402:1;21395:15;21421:127;21482:10;21477:3;21473:20;21470:1;21463:31;21513:4;21510:1;21503:15;21537:4;21534:1;21527:15;21553:125;21593:4;21621:1;21618;21615:8;21612:34;;;21626:18;;:::i;:::-;-1:-1:-1;21663:9:1;;21553:125::o;21683:408::-;21885:2;21867:21;;;21924:2;21904:18;;;21897:30;21963:34;21958:2;21943:18;;21936:62;-1:-1:-1;;;22029:2:1;22014:18;;22007:42;22081:3;22066:19;;21683:408::o;22096:354::-;22298:2;22280:21;;;22337:2;22317:18;;;22310:30;22376:32;22371:2;22356:18;;22349:60;22441:2;22426:18;;22096:354::o;22455:223::-;22537:6;22590:2;22578:9;22569:7;22565:23;22561:32;22558:52;;;22606:1;22603;22596:12;22558:52;22629:43;22664:7;22653:9;22629:43;:::i;22683:241::-;22739:6;22792:2;22780:9;22771:7;22767:23;22763:32;22760:52;;;22808:1;22805;22798:12;22760:52;22847:9;22834:23;22866:28;22888:5;22866:28;:::i;22929:385::-;-1:-1:-1;;;;;23181:15:1;;;23163:34;;23233:15;;;;23228:2;23213:18;;23206:43;23292:14;;23285:22;23280:2;23265:18;;23258:50;23113:2;23098:18;;22929:385::o;23319:251::-;23389:6;23442:2;23430:9;23421:7;23417:23;23413:32;23410:52;;;23458:1;23455;23448:12;23410:52;23490:9;23484:16;23509:31;23534:5;23509:31;:::i;23575:184::-;23645:6;23698:2;23686:9;23677:7;23673:23;23669:32;23666:52;;;23714:1;23711;23704:12;23666:52;-1:-1:-1;23737:16:1;;23575:184;-1:-1:-1;23575:184:1:o;23764:168::-;23804:7;23870:1;23866;23862:6;23858:14;23855:1;23852:21;23847:1;23840:9;23833:17;23829:45;23826:71;;;23877:18;;:::i;:::-;-1:-1:-1;23917:9:1;;23764:168::o;23937:127::-;23998:10;23993:3;23989:20;23986:1;23979:31;24029:4;24026:1;24019:15;24053:4;24050:1;24043:15;24069:217;24109:1;24135;24125:132;;24179:10;24174:3;24170:20;24167:1;24160:31;24214:4;24211:1;24204:15;24242:4;24239:1;24232:15;24125:132;-1:-1:-1;24271:9:1;;24069:217::o;24291:670::-;-1:-1:-1;;;;;24658:15:1;;;24640:34;;24710:15;;;;24705:2;24690:18;;24683:43;24757:2;24742:18;;24735:34;;;;24800:2;24785:18;;24778:34;;;;24861:4;24849:17;24843:3;24828:19;;24821:46;24620:3;24883:19;;24876:35;24942:3;24927:19;;24920:35;;;;24589:3;24574:19;;24291:670::o;26010:306::-;26098:6;26106;26114;26167:2;26155:9;26146:7;26142:23;26138:32;26135:52;;;26183:1;26180;26173:12;26135:52;26212:9;26206:16;26196:26;;26262:2;26251:9;26247:18;26241:25;26231:35;;26306:2;26295:9;26291:18;26285:25;26275:35;;26010:306;;;;;:::o;26600:128::-;26640:3;26671:1;26667:6;26664:1;26661:13;26658:39;;;26677:18;;:::i;:::-;-1:-1:-1;26713:9:1;;26600:128::o;26733:135::-;26772:3;-1:-1:-1;;26793:17:1;;26790:43;;;26813:18;;:::i;:::-;-1:-1:-1;26860:1:1;26849:13;;26733:135::o;26873:404::-;27075:2;27057:21;;;27114:2;27094:18;;;27087:30;27153:34;27148:2;27133:18;;27126:62;-1:-1:-1;;;27219:2:1;27204:18;;27197:38;27267:3;27252:19;;26873:404::o;27282:258::-;27354:1;27364:113;27378:6;27375:1;27372:13;27364:113;;;27454:11;;;27448:18;27435:11;;;27428:39;27400:2;27393:10;27364:113;;;27495:6;27492:1;27489:13;27486:48;;;-1:-1:-1;;27530:1:1;27512:16;;27505:27;27282:258::o;27545:274::-;27674:3;27712:6;27706:13;27728:53;27774:6;27769:3;27762:4;27754:6;27750:17;27728:53;:::i;:::-;27797:16;;;;;27545:274;-1:-1:-1;;27545:274:1:o;28234:624::-;28465:6;28454:9;28447:25;28508:6;28503:2;28492:9;28488:18;28481:34;28580:1;28576;28571:3;28567:11;28563:19;28555:6;28551:32;28546:2;28535:9;28531:18;28524:60;28620:3;28615:2;28604:9;28600:18;28593:31;28428:4;28653:6;28647:13;28697:6;28691:3;28680:9;28676:19;28669:35;28713:67;28773:6;28767:3;28756:9;28752:19;28747:2;28739:6;28735:15;28713:67;:::i;:::-;28841:2;28820:15;-1:-1:-1;;28816:29:1;28801:45;;;;28848:3;28797:55;;28234:624;-1:-1:-1;;;;;28234:624:1:o
Swarm Source
ipfs://d92ea2341a11bd9534d7c7e1c73a72bc860f7c6ff1ee6e43c4290815b9c706aa
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.