Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
FireBirdRouter
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-25 */ // SPDX-License-Identifier: MIT pragma solidity >=0.7.6; pragma abicoder v2; interface IFireBirdFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint32 tokenWeight0, uint32 swapFee, uint256); function feeTo() external view returns (address); function formula() external view returns (address); function protocolFee() external view returns (uint256); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function isPair(address) external view returns (bool); function allPairsLength() external view returns (uint256); function createPair( address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee ) external returns (address pair); function getWeightsAndSwapFee(address pair) external view returns ( uint32 tokenWeight0, uint32 tokenWeight1, uint32 swapFee ); function setFeeTo(address) external; function setFeeToSetter(address) external; function setProtocolFee(uint256) external; } /* Bancor Formula interface */ interface IFireBirdFormula { function getFactoryReserveAndWeights( address factory, address pair, address tokenA, uint8 dexId ) external view returns ( address tokenB, uint256 reserveA, uint256 reserveB, uint32 tokenWeightA, uint32 tokenWeightB, uint32 swapFee ); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee ) external view returns (uint256 amountIn); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee ) external view returns (uint256 amountOut); function getFactoryAmountsIn( address factory, address tokenIn, address tokenOut, uint256 amountOut, address[] calldata path, uint8[] calldata dexIds ) external view returns (uint256[] memory amounts); function getFactoryAmountsOut( address factory, address tokenIn, address tokenOut, uint256 amountIn, address[] calldata path, uint8[] calldata dexIds ) external view returns (uint256[] memory amounts); function ensureConstantValue( uint256 reserve0, uint256 reserve1, uint256 balance0Adjusted, uint256 balance1Adjusted, uint32 tokenWeight0 ) external view returns (bool); function getReserves( address pair, address tokenA, address tokenB ) external view returns (uint256 reserveA, uint256 reserveB); function getOtherToken(address pair, address tokenA) external view returns (address tokenB); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1); function mintLiquidityFee( uint256 totalLiquidity, uint112 reserve0, uint112 reserve1, uint32 tokenWeight0, uint32 tokenWeight1, uint112 collectedFee0, uint112 collectedFee1 ) external view returns (uint256 amount); } interface IFireBirdPair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event PaidProtocolFee(uint112 collectedFee0, uint112 collectedFee1); event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function getCollectedFees() external view returns (uint112 _collectedFee0, uint112 _collectedFee1); function getTokenWeights() external view returns (uint32 tokenWeight0, uint32 tokenWeight1); function getSwapFee() external view returns (uint32); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize( address, address, uint32, uint32 ) external; } // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED"); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED"); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED"); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } } interface IERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); } interface IFireBirdRouter { event Exchange(address pair, uint256 amountOut, address output); function factory() external view returns (address); function formula() external view returns (address); function WETH() external view returns (address); function addLiquidity( address pair, address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address pair, address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForTokens( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( address tokenIn, address tokenOut, uint256 amountOut, uint256 amountInMax, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( address tokenOut, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( address tokenIn, uint256 amountOut, uint256 amountInMax, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( address tokenOut, uint256 amountOut, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( address tokenOut, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external; function createPair( address tokenA, address tokenB, uint256 amountA, uint256 amountB, uint32 tokenWeightA, uint32 swapFee, address to ) external returns (uint256 liquidity); function createPairETH( address token, uint256 amountToken, uint32 tokenWeight, uint32 swapFee, address to ) external payable returns (uint256 liquidity); function removeLiquidity( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); } // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } function div(uint256 a, uint256 b) internal pure returns (uint256 c) { require(b > 0, "ds-math-division-by-zero"); c = a / b; } } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; function balanceOf(address account) external view returns (uint256); } interface IAggregationExecutor { function callBytes(bytes calldata data) external payable; // 0xd9c45357 } interface IERC20Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } library RevertReasonParser { function parse(bytes memory data, string memory prefix) internal pure returns (string memory) { // https://solidity.readthedocs.io/en/latest/control-structures.html#revert // We assume that revert reason is abi-encoded as Error(string) // 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") { string memory reason; // solhint-disable no-inline-assembly assembly { // 68 = 32 bytes data length + 4-byte selector + 32 bytes offset reason := add(data, 68) } /* revert reason is padded up to 32 bytes with ABI encoder: Error(string) also sometimes there is extra 32 bytes of zeros padded in the end: https://github.com/ethereum/solidity/issues/10170 because of that we can't check for equality and instead check that string length + extra 68 bytes is less than overall data length */ require(data.length >= 68 + bytes(reason).length, "Invalid revert reason"); return string(abi.encodePacked(prefix, "Error(", reason, ")")); } // 36 = 4-byte selector 0x4e487b71 + 32 bytes integer else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") { uint256 code; // solhint-disable no-inline-assembly assembly { // 36 = 32 bytes data length + 4-byte selector code := mload(add(data, 36)) } return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")")); } return string(abi.encodePacked(prefix, "Unknown(", _toHex(data), ")")); } function _toHex(uint256 value) private pure returns (string memory) { return _toHex(abi.encodePacked(value)); } function _toHex(bytes memory data) private pure returns (string memory) { bytes16 alphabet = 0x30313233343536373839616263646566; bytes memory str = new bytes(2 + data.length * 2); str[0] = "0"; str[1] = "x"; for (uint256 i = 0; i < data.length; i++) { str[2 * i + 2] = alphabet[uint8(data[i] >> 4)]; str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)]; } return string(str); } } contract Permitable { event Error(string reason); function _permit( IERC20 token, uint256 amount, bytes calldata permit ) internal { if (permit.length == 32 * 7) { // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory result) = address(token).call(abi.encodePacked(IERC20Permit.permit.selector, permit)); if (!success) { string memory reason = RevertReasonParser.parse(result, "Permit call failed: "); if (token.allowance(msg.sender, address(this)) < amount) { revert(reason); } else { emit Error(reason); } } } } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract FireBirdRouter is IFireBirdRouter, Ownable, Permitable { using SafeMath for uint256; address public immutable override factory; address public immutable override formula; address public immutable override WETH; address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); uint256 private constant _PARTIAL_FILL = 0x01; uint256 private constant _REQUIRES_EXTRA_ETH = 0x02; uint256 private constant _SHOULD_CLAIM = 0x04; uint256 private constant _BURN_FROM_MSG_SENDER = 0x08; uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10; struct SwapDescription { IERC20 srcToken; IERC20 dstToken; address srcReceiver; address dstReceiver; uint256 amount; uint256 minReturnAmount; uint256 flags; bytes permit; } event Swapped(address sender, IERC20 srcToken, IERC20 dstToken, address dstReceiver, uint256 spentAmount, uint256 returnAmount); modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "Router: EXPIRED"); _; } constructor( address _factory, address _formula, address _WETH ) public { factory = _factory; formula = _formula; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } // **** ADD LIQUIDITY **** function _addLiquidity( address pair, address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { (uint256 reserveA, uint256 reserveB) = IFireBirdFormula(formula).getReserves(pair, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = IFireBirdFormula(formula).quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = IFireBirdFormula(formula).quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function _addLiquidityToken( address pair, address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal returns (uint256 amountA, uint256 amountB) { (amountA, amountB) = _addLiquidity(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); } function createPair( address tokenA, address tokenB, uint256 amountA, uint256 amountB, uint32 tokenWeightA, uint32 swapFee, address to ) public virtual override returns (uint256 liquidity) { address pair = IFireBirdFactory(factory).createPair(tokenA, tokenB, tokenWeightA, swapFee); _addLiquidityToken(pair, tokenA, tokenB, amountA, amountB, 0, 0); liquidity = IFireBirdPair(pair).mint(to); } function addLiquidity( address pair, address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB) = _addLiquidityToken(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); liquidity = IFireBirdPair(pair).mint(to); } function _addLiquidityETH( address pair, address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to ) internal returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity(pair, token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); transferETHTo(amountETH, pair); liquidity = IFireBirdPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } function createPairETH( address token, uint256 amountToken, uint32 tokenWeight, uint32 swapFee, address to ) public payable virtual override returns (uint256 liquidity) { address pair = IFireBirdFactory(factory).createPair(token, WETH, tokenWeight, swapFee); (, , liquidity) = _addLiquidityETH(pair, token, amountToken, 0, 0, to); } function addLiquidityETH( address pair, address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public payable virtual override ensure(deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH, liquidity) = _addLiquidityETH(pair, token, amountTokenDesired, amountTokenMin, amountETHMin, to); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( address tokenIn, uint256[] memory amounts, address[] memory path, address _to ) internal virtual { address input = tokenIn; for (uint256 i = 0; i < path.length; i++) { IFireBirdPair pairV2 = IFireBirdPair(path[i]); address token0 = pairV2.token0(); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out, address output) = input == token0 ? (uint256(0), amountOut, pairV2.token1()) : (amountOut, uint256(0), token0); address to = i < path.length - 1 ? path[i + 1] : _to; pairV2.swap(amount0Out, amount1Out, to, new bytes(0)); emit Exchange(address(pairV2), amountOut, output); input = output; } } function swapExactTokensForTokens( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] memory path, uint8[] memory dexIds, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = _validateAmountOut(tokenIn, tokenOut, amountIn, amountOutMin, path, dexIds); TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]); _swap(tokenIn, amounts, path, to); } function swapTokensForExactTokens( address tokenIn, address tokenOut, uint256 amountOut, uint256 amountInMax, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = _validateAmountIn(tokenIn, tokenOut, amountOut, amountInMax, path, dexIds); TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]); _swap(tokenIn, amounts, path, to); } function swapExactETHForTokens( address tokenOut, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = _validateAmountOut(WETH, tokenOut, msg.value, amountOutMin, path, dexIds); transferETHTo(amounts[0], path[0]); _swap(WETH, amounts, path, to); } function swapTokensForExactETH( address tokenIn, uint256 amountOut, uint256 amountInMax, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = _validateAmountIn(tokenIn, WETH, amountOut, amountInMax, path, dexIds); TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]); _swap(tokenIn, amounts, path, address(this)); transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]); } function swapExactTokensForETH( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = _validateAmountOut(tokenIn, WETH, amountIn, amountOutMin, path, dexIds); TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]); _swap(tokenIn, amounts, path, address(this)); transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]); } function swapETHForExactTokens( address tokenOut, uint256 amountOut, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = _validateAmountIn(WETH, tokenOut, amountOut, msg.value, path, dexIds); transferETHTo(amounts[0], path[0]); _swap(WETH, amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address tokenIn, address[] memory path, uint8[] memory dexIds, address _to ) internal virtual { for (uint256 i; i < path.length; i++) { uint256 amountOutput; address currentOutput; { (address output, uint256 reserveInput, uint256 reserveOutput, uint32 tokenWeightInput, , uint32 swapFee) = IFireBirdFormula(formula).getFactoryReserveAndWeights(factory, path[i], tokenIn, dexIds[i]); uint256 amountInput = IERC20(tokenIn).balanceOf(path[i]).sub(reserveInput); amountOutput = IFireBirdFormula(formula).getAmountOut(amountInput, reserveInput, reserveOutput, tokenWeightInput, 100 - tokenWeightInput, swapFee); currentOutput = output; } IFireBirdPair pair = IFireBirdPair(path[i]); (uint256 amount0Out, uint256 amount1Out) = tokenIn == pair.token0() ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 1 ? path[i + 1] : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); emit Exchange(path[i], amountOutput, currentOutput); tokenIn = currentOutput; } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amountIn); uint256 balanceBefore = IERC20(tokenOut).balanceOf(to); _swapSupportingFeeOnTransferTokens(tokenIn, path, dexIds, to); require(IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); } function swapExactETHForTokensSupportingFeeOnTransferTokens( address tokenOut, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external payable virtual override ensure(deadline) { // require(path[0] == WETH, 'Router: INVALID_PATH'); uint256 amountIn = msg.value; transferETHTo(amountIn, path[0]); uint256 balanceBefore = IERC20(tokenOut).balanceOf(to); _swapSupportingFeeOnTransferTokens(WETH, path, dexIds, to); require(IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); } function swapExactTokensForETHSupportingFeeOnTransferTokens( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint8[] calldata dexIds, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amountIn); _swapSupportingFeeOnTransferTokens(tokenIn, path, dexIds, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); transferAll(ETH_ADDRESS, to, amountOut); } function swap( IAggregationExecutor caller, SwapDescription calldata desc, bytes calldata data ) external payable returns (uint256 returnAmount, uint256 gasLeft) { require(desc.minReturnAmount > 0, "Min return should not be 0"); require(data.length > 0, "data should be not zero"); uint256 flags = desc.flags; uint256 amount = desc.amount; IERC20 srcToken = desc.srcToken; IERC20 dstToken = desc.dstToken; if (flags & _REQUIRES_EXTRA_ETH != 0) { require(msg.value > (isETH(srcToken) ? amount : 0), "Invalid msg.value"); } else { require(msg.value == (isETH(srcToken) ? amount : 0), "Invalid msg.value"); } if (flags & _SHOULD_CLAIM != 0) { require(!isETH(srcToken), "Claim token is ETH"); _permit(srcToken, amount, desc.permit); TransferHelper.safeTransferFrom(address(srcToken), msg.sender, desc.srcReceiver, amount); } address dstReceiver = (desc.dstReceiver == address(0)) ? msg.sender : desc.dstReceiver; uint256 initialSrcBalance = (flags & _PARTIAL_FILL != 0) ? getBalance(srcToken, msg.sender) : 0; uint256 initialDstBalance = getBalance(dstToken, dstReceiver); { // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory result) = address(caller).call{value: msg.value}(abi.encodeWithSelector(caller.callBytes.selector, data)); if (!success) { revert(RevertReasonParser.parse(result, "callBytes failed: ")); } } uint256 spentAmount = amount; returnAmount = getBalance(dstToken, dstReceiver).sub(initialDstBalance); if (flags & _PARTIAL_FILL != 0) { spentAmount = initialSrcBalance.add(amount).sub(getBalance(srcToken, msg.sender)); require(returnAmount.mul(amount) >= desc.minReturnAmount.mul(spentAmount), "Return amount is not enough"); } else { require(returnAmount >= desc.minReturnAmount, "Return amount is not enough"); } emit Swapped(msg.sender, srcToken, dstToken, dstReceiver, spentAmount, returnAmount); emit Exchange(address(caller), returnAmount, isETH(dstToken) ? WETH : address(dstToken)); gasLeft = gasleft(); } function getBalance(IERC20 token, address account) internal view returns (uint256) { if (isETH(token)) { return account.balance; } else { return token.balanceOf(account); } } function _validateAmountOut( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] memory path, uint8[] memory dexIds ) internal view returns (uint256[] memory amounts) { amounts = IFireBirdFormula(formula).getFactoryAmountsOut(factory, tokenIn, tokenOut, amountIn, path, dexIds); require(amounts[amounts.length - 1] >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); } function _validateAmountIn( address tokenIn, address tokenOut, uint256 amountOut, uint256 amountInMax, address[] calldata path, uint8[] calldata dexIds ) internal view returns (uint256[] memory amounts) { amounts = IFireBirdFormula(formula).getFactoryAmountsIn(factory, tokenIn, tokenOut, amountOut, path, dexIds); require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT"); } function transferETHTo(uint256 amount, address to) internal { IWETH(WETH).deposit{value: amount}(); assert(IWETH(WETH).transfer(to, amount)); } function transferAll( address token, address to, uint256 amount ) internal returns (bool) { if (amount == 0) { return true; } if (isETH(IERC20(token))) { IWETH(WETH).withdraw(amount); TransferHelper.safeTransferETH(to, amount); } else { TransferHelper.safeTransfer(token, to, amount); } return true; } function isETH(IERC20 token) internal pure returns (bool) { return (address(token) == ETH_ADDRESS); } // **** REMOVE LIQUIDITY **** function _removeLiquidity( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to ) internal returns (uint256 amountA, uint256 amountB) { require(IFireBirdFactory(factory).isPair(pair), "Router: Invalid pair"); IFireBirdPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IFireBirdPair(pair).burn(to); (address token0, ) = IFireBirdFormula(formula).sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT"); } function removeLiquidity( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to); } function removeLiquidityETH( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = _removeLiquidity(pair, token, WETH, liquidity, amountTokenMin, amountETHMin, address(this)); TransferHelper.safeTransfer(token, to, amountToken); transferAll(ETH_ADDRESS, to, amountETH); } function removeLiquidityWithPermit( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { { uint256 value = approveMax ? uint256(-1) : liquidity; IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to); } function removeLiquidityETHWithPermit( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountETH) { uint256 value = approveMax ? uint256(-1) : liquidity; IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity(pair, token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline); TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); transferAll(ETH_ADDRESS, to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountETH) { uint256 value = approveMax ? uint256(-1) : liquidity; IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline); } function rescueFunds(address token, uint256 amount) external onlyOwner { if (isETH(IERC20(token))) { TransferHelper.safeTransferETH(msg.sender, amount); } else { TransferHelper.safeTransfer(token, msg.sender, amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_formula","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"Error","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"output","type":"address"}],"name":"Exchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"srcToken","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"dstToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"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":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint32","name":"tokenWeightA","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPair","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint32","name":"tokenWeight","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPairETH","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formula","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"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":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"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":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"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":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"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":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct FireBirdRouter.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasLeft","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"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":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"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":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"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":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162005d4538038062005d458339810160408190526200003491620000d3565b600062000040620000b2565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606093841b811660805291831b821660a05290911b1660c0526200011c565b3390565b80516001600160a01b0381168114620000ce57600080fd5b919050565b600080600060608486031215620000e8578283fd5b620000f384620000b6565b92506200010360208501620000b6565b91506200011360408501620000b6565b90509250925092565b60805160601c60a05160601c60c05160601c615b58620001ed600039806101cd528061072752806109ee5280610b225280610dc5528061157552806116ab528061177452806118ba528061191f5280611a005280611e725280611fbc5280611ffe52806128a7528061293f52806131ed52806132a6525080610879528061243152806125855280612c685280612e185280613d0d5280613e7e5280613f8a52806140a1525080610ae55280611a675280611a8e528061246d5280612a4d5280612e455280613d3a5250615b586000f3fe6080604052600436106101b05760003560e01c80638da5cb5b116100ec578063d0f2c82a1161008a578063ebb5d2e911610064578063ebb5d2e9146104b0578063f0c62e2b146104d0578063f2fde38b146104e3578063fbf4513514610503576101f6565b8063d0f2c82a14610450578063dc9f702914610470578063e1f4a78414610490576101f6565b8063ad5c4648116100c6578063ad5c4648146103e6578063af7e6aec146103fb578063b56b681d1461041b578063c45a01551461043b576101f6565b80638da5cb5b1461039e578063991bffc7146103b3578063a4aabb08146103c6576101f6565b80636cb494281161015957806378e3214f1161013357806378e3214f1461032b5780637a286fa21461034b5780637c0252001461036b57806389df37af1461037e576101f6565b80636cb49428146102f0578063715018a614610303578063752ebb7c14610318576101f6565b80634b75f54f1161018a5780634b75f54f146102735780634c17fd7c14610295578063674f19f8146102c3576101f6565b80630e2f024c146101fb578063242e3b9f146102315780633990ba5414610251576101f6565b366101f6573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101f457fe5b005b600080fd5b34801561020757600080fd5b5061021b610216366004614949565b610523565b604051610228919061508b565b60405180910390f35b34801561023d57600080fd5b506101f461024c366004614b46565b610606565b61026461025f3660046148d8565b610815565b604051610228939291906159c2565b34801561027f57600080fd5b50610288610877565b6040516102289190615094565b3480156102a157600080fd5b506102b56102b03660046145b1565b61089b565b604051610228929190615979565b3480156102cf57600080fd5b506102e36102de366004614b46565b6109ab565b60405161022891906153f3565b61021b6102fe366004614c68565b610ae0565b34801561030f57600080fd5b506101f4610bd2565b6101f4610326366004614aa0565b610cb4565b34801561033757600080fd5b506101f4610346366004614a75565b610f29565b34801561035757600080fd5b506102e36103663660046146fa565b610fc8565b6102b5610379366004614d7b565b611078565b34801561038a57600080fd5b506102e36103993660046147bd565b6115c0565b3480156103aa57600080fd5b5061028861164d565b6102e36103c1366004614aa0565b611669565b3480156103d257600080fd5b506102b56103e1366004614949565b6117cf565b3480156103f257600080fd5b506102886118b8565b34801561040757600080fd5b506102e3610416366004614b46565b6118dc565b34801561042757600080fd5b506102b56104363660046148d8565b6119bb565b34801561044757600080fd5b50610288611a65565b34801561045c57600080fd5b5061021b61046b3660046149f2565b611a89565b34801561047c57600080fd5b506101f461048b3660046146fa565b611bf5565b34801561049c57600080fd5b506102b56104ab36600461452d565b611dcf565b3480156104bc57600080fd5b5061021b6104cb3660046148d8565b611e2e565b6102e36104de366004614aa0565b611f7a565b3480156104ef57600080fd5b506101f46104fe3660046144bc565b612095565b34801561050f57600080fd5b5061026461051e36600461466c565b6121e2565b60008085610531578a610553565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8e169063d505accf906105b4903390309086908d908c908c908c906004016150dc565b600060405180830381600087803b1580156105ce57600080fd5b505af11580156105e2573d6000803e3d6000fd5b505050506105f58d8d8d8d8d8d8d611e2e565b9d9c50505050505050505050505050565b804281101561064a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b60405180910390fd5b6106778a338989600081811061065c57fe5b905060200201602081019061067191906144bc565b8c6122ec565b6106e78a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a918291850190849080828437600092019190915250309250612418915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061075c903090600401615094565b60206040518083038186803b15801561077457600080fd5b505afa158015610788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ac9190614e21565b9050888110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061582b565b61080773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858361284d565b505050505050505050505050565b60008060008342811015610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b6108638b8b8b8b8b8b612933565b919d909c50909a5098505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008086428110156108d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b6000876108e6578c610908565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508f73ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848d8c8c8c6040518863ffffffff1660e01b815260040161094f97969594939291906150dc565b600060405180830381600087803b15801561096957600080fd5b505af115801561097d573d6000803e3d6000fd5b50505050506109918f8f8f8f8f8f8f612a48565b8093508194505050509c509c9a5050505050505050505050565b606081428110156109e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b610a188b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c8c8c612dd8565b9150610a5b8b338a8a6000818110610a2c57fe5b9050602002016020810190610a4191906144bc565b85600081518110610a4e57fe5b60200260200101516122ec565b610a9b8b838a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612f49915050565b610ad173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8584600186510381518110610ac457fe5b602002602001015161284d565b50509998505050505050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb887f000000000000000000000000000000000000000000000000000000000000000088886040518563ffffffff1660e01b8152600401610b62949392919061535f565b602060405180830381600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb491906144d8565b9050610bc581888860008088612933565b9998505050505050505050565b610bda6131e7565b73ffffffffffffffffffffffffffffffffffffffff16610bf861164d565b73ffffffffffffffffffffffffffffffffffffffff1614610c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615751565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b8042811015610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b34610d19818989600081610cff57fe5b9050602002016020810190610d1491906144bc565b6131eb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190610d6e908890600401615094565b60206040518083038186803b158015610d8657600080fd5b505afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614e21565b9050610e507f00000000000000000000000000000000000000000000000000000000000000008a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250612418915050565b89610ee4828d73ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401610e8e9190615094565b60206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190614e21565b90613338565b1015610f1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061582b565b5050505050505050505050565b610f316131e7565b73ffffffffffffffffffffffffffffffffffffffff16610f4f61164d565b73ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615751565b610fa58261337b565b15610fb957610fb433826133ae565b610fc4565b610fc4823383613467565b5050565b60608142811015611005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b6110158c8c8c8c8c8c8c8c612dd8565b91506110298c338a8a6000818110610a2c57fe5b6110698c838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250612f49915050565b509a9950505050505050505050565b60008060008560a00135116110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061571a565b826110f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906157bd565b60c08501356080860135600061110960208901896144bc565b9050600061111d60408a0160208b016144bc565b9050600284161561117b576111318261337b565b61113c57600061113e565b825b3411611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615675565b6111c9565b6111848261337b565b61118f576000611191565b825b34146111c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615675565b6004841615611244576111db8261337b565b15611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615505565b611229828461122460e08d018d615a0c565b613589565b611244823361123e60608d0160408e016144bc565b866122ec565b60008061125760808c0160608d016144bc565b73ffffffffffffffffffffffffffffffffffffffff16146112875761128260808b0160608c016144bc565b611289565b335b905060006001861661129c5760006112a6565b6112a68433613796565b905060006112b48484613796565b90506000808e73ffffffffffffffffffffffffffffffffffffffff163463d9c4535760e01b8f8f6040516024016112ec929190615437565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516113759190614f1f565b60006040518083038185875af1925050503d80600081146113b2576040519150601f19603f3d011682016040523d82523d6000602084013e6113b7565b606091505b50915091508161143357611400816040518060400160405280601281526020017f63616c6c4279746573206661696c65643a20000000000000000000000000000081525061386d565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419190615484565b5086905061144582610ede8787613796565b995060018816156114be5761146761145d8733613796565b610ede858a613c3f565b905061147760a08e013582613c7c565b6114818b89613c7c565b10156114b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906156e3565b6114fc565b8c60a001358a10156114fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906156e3565b7fd6d4f5681c246c9f42c203e287975af1601f8df8035a9251f79aab5c8f09e2f833878787858f6040516115359695949392919061515b565b60405180910390a17fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488e8b6115698861337b565b6115735787611595565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516115a4939291906153c3565b60405180910390a15a9850505050505050505094509492505050565b606081428110156115fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b61160b8a8a8a8a8a8a613ccd565b91506116348a338860008151811061161f57fe5b602002602001015185600081518110610a4e57fe5b6116408a838887612f49565b5098975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b606081428110156116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b6117487f00000000000000000000000000000000000000000000000000000000000000008b348c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ccd92505050565b915061176f8260008151811061175a57fe5b602002602001015189896000818110610cff57fe5b6116407f0000000000000000000000000000000000000000000000000000000000000000838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250612f49915050565b6000806000866117df578b611801565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8f169063d505accf90611862903390309086908e908d908d908d906004016150dc565b600060405180830381600087803b15801561187c57600080fd5b505af1158015611890573d6000803e3d6000fd5b505050506118a38e8e8e8e8e8e8e6119bb565b909f909e509c50505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608142811015611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b610a188b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ccd92505050565b60008082428110156119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b611a288a8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b30612a48565b9093509150611a38898685613467565b611a5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee868461284d565b505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb8a8a88886040518563ffffffff1660e01b8152600401611aeb949392919061535f565b602060405180830381600087803b158015611b0557600080fd5b505af1158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906144d8565b9050611b4f818a8a8a8a600080613e3b565b50506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290611ba3908690600401615094565b602060405180830381600087803b158015611bbd57600080fd5b505af1158015611bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190614e21565b8042811015611c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b611c428b338989600081811061065c57fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190611c97908790600401615094565b60206040518083038186803b158015611caf57600080fd5b505afa158015611cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce79190614e21565b9050611d598c89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a9250612418915050565b88611d97828d73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401610e8e9190615094565b1015610807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061582b565b6000808242811015611e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b611e1c8b8b8b8b8b8b8b612a48565b909c909b509950505050505050505050565b60008142811015611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b611e9b89897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611dcf565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152909350611f4e91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190611ef9903090600401615094565b60206040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f499190614e21565b613467565b611f6d73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858461284d565b5050979650505050505050565b60608142811015611fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b611fe77f00000000000000000000000000000000000000000000000000000000000000008b8b348c8c8c8c612dd8565b9150611ff98260008151811061175a57fe5b6120597f0000000000000000000000000000000000000000000000000000000000000000838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250612f49915050565b8160008151811061206657fe5b602002602001015134111561164057611640338360008151811061208657fe5b602002602001015134036133ae565b61209d6131e7565b73ffffffffffffffffffffffffffffffffffffffff166120bb61164d565b73ffffffffffffffffffffffffffffffffffffffff1614612108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615751565b73ffffffffffffffffffffffffffffffffffffffff8116612155576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061553c565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008060008342811015612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615786565b6122318d8d8d8d8d8d8d613e3b565b6040517f6a627842000000000000000000000000000000000000000000000000000000008152919550935073ffffffffffffffffffffffffffffffffffffffff8e1690636a62784290612288908990600401615094565b602060405180830381600087803b1580156122a257600080fd5b505af11580156122b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122da9190614e21565b91505099509950999650505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016123209392919061512a565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161236e9190614f1f565b6000604051808303816000865af19150503d80600081146123ab576040519150601f19603f3d011682016040523d82523d6000602084013e6123b0565b606091505b50915091508180156123da5750805115806123da5750808060200190518101906123da9190614d5f565b612410576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906158e5565b505050505050565b60005b83518110156128465760008060008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663eb22d54f7f00000000000000000000000000000000000000000000000000000000000000008d8b8151811061249857fe5b60200260200101518f8e8d815181106124ad57fe5b60200260200101516040518563ffffffff1660e01b81526004016124d49493929190615326565b60c06040518083038186803b1580156124ec57600080fd5b505afa158015612500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125249190614bf5565b95505094509450945094506000612581858e73ffffffffffffffffffffffffffffffffffffffff166370a082318f8d8151811061255d57fe5b60200260200101516040518263ffffffff1660e01b8152600401610e8e9190615094565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663671a11b58287878788606403886040518763ffffffff1660e01b81526004016125e9969594939291906159d8565b60206040518083038186803b15801561260157600080fd5b505afa158015612615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126399190614e21565b9750859650505050505050600086848151811061265257fe5b602002602001015190506000808273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156126a557600080fd5b505afa1580156126b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126dd91906144d8565b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146127175784600061271b565b6000855b91509150600060018a51038710612732578761274a565b89876001018151811061274157fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff85169063022c0d9f906127b29086908690869060248101615987565b600060405180830381600087803b1580156127cc57600080fd5b505af11580156127e0573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488a888151811061281157fe5b6020026020010151878760405161282a939291906153c3565b60405180910390a150929850506001909301925061241b915050565b5050505050565b60008161285c5750600161292c565b6128658461337b565b1561291d576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906128dc90859060040161508b565b600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b5050505061291883836133ae565b612928565b612928848484613467565b5060015b9392505050565b600080600061296789897f00000000000000000000000000000000000000000000000000000000000000008a348b8b613e76565b909350915061297888338b866122ec565b612982828a6131eb565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a1690636a627842906129d4908790600401615094565b602060405180830381600087803b1580156129ee57600080fd5b505af1158015612a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a269190614e21565b905081341115612a3c57612a3c338334036133ae565b96509650969350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5e31b138a6040518263ffffffff1660e01b8152600401612aa49190615094565b60206040518083038186803b158015612abc57600080fd5b505afa158015612ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af49190614d5f565b612b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615942565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906323b872dd90612b809033908d908b9060040161512a565b602060405180830381600087803b158015612b9a57600080fd5b505af1158015612bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd29190614d5f565b506000808a73ffffffffffffffffffffffffffffffffffffffff166389afcb44866040518263ffffffff1660e01b8152600401612c0f9190615094565b6040805180830381600087803b158015612c2857600080fd5b505af1158015612c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c609190614e39565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663544caa568c8c6040518363ffffffff1660e01b8152600401612cc19291906150b5565b604080518083038186803b158015612cd857600080fd5b505afa158015612cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1091906144f4565b5090508073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612d4d578183612d50565b82825b909550935087851015612d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906156ac565b86841015612dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615607565b50505097509795505050505050565b6040517f30994f7100000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906330994f7190612e7b907f0000000000000000000000000000000000000000000000000000000000000000908d908d908d908c908c908c908c906004016151d2565b60006040518083038186803b158015612e9357600080fd5b505afa158015612ea7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612eed9190810190614ccf565b90508581600081518110612efd57fe5b60200260200101511115612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906155d0565b98975050505050505050565b8360005b8351811015612410576000848281518110612f6457fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612fb657600080fd5b505afa158015612fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fee91906144d8565b9050600087846001018151811061300157fe5b6020026020010151905060008060008473ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461304c57836000866130cd565b6000848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561309557600080fd5b505afa1580156130a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130cd91906144d8565b925092509250600060018b510388106130e657896130fe565b8a88600101815181106130f557fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff88169063022c0d9f906131669087908790869060248101615987565b600060405180830381600087803b15801561318057600080fd5b505af1158015613194573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488786846040516131cb939291906153c3565b60405180910390a15096505060019094019350612f4d92505050565b3390565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561325357600080fd5b505af1158015613267573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506132e091508490869060040161539d565b602060405180830381600087803b1580156132fa57600080fd5b505af115801561330e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133329190614d5f565b610fc457fe5b80820382811115613375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615497565b92915050565b73ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516133e59190614f1f565b60006040518083038185875af1925050503d8060008114613422576040519150601f19603f3d011682016040523d82523d6000602084013e613427565b606091505b5050905080613462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615888565b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161349992919061539d565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516134e79190614f1f565b6000604051808303816000865af19150503d8060008114613524576040519150601f19603f3d011682016040523d82523d6000602084013e613529565b606091505b50915091508180156135535750805115806135535750808060200190518101906135539190614d5f565b612846576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906154ce565b60e0811415613790576000808573ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b85856040516020016135c893929190614ee3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261360091614f1f565b6000604051808303816000865af19150503d806000811461363d576040519150601f19603f3d011682016040523d82523d6000602084013e613642565b606091505b50915091508161241057600061368d826040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a2000000000000000000000000081525061386d565b9050858773ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016136cb9291906150b5565b60206040518083038186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b9190614e21565b101561375557806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419190615484565b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa816040516137849190615484565b60405180910390a15050505b50505050565b60006137a18361337b565b156137c4575073ffffffffffffffffffffffffffffffffffffffff811631613375565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190613816908590600401615094565b60206040518083038186803b15801561382e57600080fd5b505afa158015613842573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138669190614e21565b9050613375565b606060448351101580156138d457508260008151811061388957fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b80156139335750826001815181106138e857fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b801561399257508260028151811061394757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b80156139f15750826003815181106139a657fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15613a67576060604484019050805160440184511015613a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906157f4565b8281604051602001613a5092919061503f565b604051602081830303815290604052915050613375565b82516024148015613acb575082600081518110613a8057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b8015613b2a575082600181518110613adf57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b8015613b89575082600281518110613b3e57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b8015613be8575082600381518110613b9d57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b15613c0d57602483015182613bfc82614182565b604051602001613a50929190614f3b565b81613c17846141a8565b604051602001613c28929190614fbd565b604051602081830303815290604052905092915050565b80820182811015613375576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061563e565b6000811580613c9757505080820282828281613c9457fe5b04145b613375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615599565b6040517ff2734c3800000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f2734c3890613d6c907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908a908a90600401615293565b60006040518083038186803b158015613d8457600080fd5b505afa158015613d98573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052613dde9190810190614ccf565b90508381600183510381518110613df157fe5b60200260200101511015613e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061582b565b9695505050505050565b600080613e4d89898989898989613e76565b9092509050613e5e88338b856122ec565b613e6a87338b846122ec565b97509795505050505050565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663327494618c8c8c6040518463ffffffff1660e01b8152600401613ed9939291906151a2565b604080518083038186803b158015613ef057600080fd5b505afa158015613f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f289190614e39565b91509150816000148015613f3a575080155b15613f4a57879350869250611a57565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec90613fc3908c90879087906004016159c2565b60206040518083038186803b158015613fdb57600080fd5b505afa158015613fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140139190614e21565b90508781116140615785811015614056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190615607565b889450925082612dc9565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec906140da908c90879089906004016159c2565b60206040518083038186803b1580156140f257600080fd5b505afa158015614106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412a9190614e21565b90508981111561413657fe5b87811015614170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610641906156ac565b9c979b50969950505050505050505050565b606061337582604051602001614198919061508b565b6040516020818303038152906040525b80516060907f30313233343536373839616263646566000000000000000000000000000000009060009060029081020167ffffffffffffffff811180156141ee57600080fd5b506040519080825280601f01601f191660200182016040528015614219576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061424a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106142a757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b84518110156143dc578260048683815181106142f157fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c60f81c6010811061432757fe5b1a60f81b82826002026002018151811061433d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285828151811061437957fe5b60209101015160f81c600f166010811061438f57fe5b1a60f81b8282600202600301815181106143a557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016142d9565b509392505050565b80356133a981615add565b60008083601f840112614400578182fd5b50813567ffffffffffffffff811115614417578182fd5b602083019150836020808302850101111561443157600080fd5b9250929050565b600082601f830112614448578081fd5b8135602061445d61445883615a93565b615a6f565b8281528181019085830183850287018401881015614479578586fd5b855b8581101561449e5761448c826144ab565b8452928401929084019060010161447b565b5090979650505050505050565b803560ff811681146133a957600080fd5b6000602082840312156144cd578081fd5b813561292c81615add565b6000602082840312156144e9578081fd5b815161292c81615add565b60008060408385031215614506578081fd5b825161451181615add565b602084015190925061452281615add565b809150509250929050565b600080600080600080600080610100898b031215614549578384fd5b883561455481615add565b9750602089013561456481615add565b9650604089013561457481615add565b9550606089013594506080890135935060a0890135925060c089013561459981615add565b8092505060e089013590509295985092959890939650565b6000806000806000806000806000806000806101808d8f0312156145d3578586fd5b8c356145de81615add565b9b5060208d01356145ee81615add565b9a5060408d01356145fe81615add565b995060608d0135985060808d0135975060a08d0135965060c08d013561462381615add565b955060e08d013594506101008d013561463b81615b02565b935061464a6101208e016144ab565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060008060006101208a8c03121561468a578283fd5b893561469581615add565b985060208a01356146a581615add565b975060408a01356146b581615add565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356146e181615add565b809250506101008a013590509295985092959850929598565b6000806000806000806000806000806101008b8d031215614719578384fd5b8a3561472481615add565b995060208b013561473481615add565b985060408b0135975060608b0135965060808b013567ffffffffffffffff8082111561475e578586fd5b61476a8e838f016143ef565b909850965060a08d0135915080821115614782578586fd5b5061478f8d828e016143ef565b90955093505060c08b01356147a381615add565b8092505060e08b013590509295989b9194979a5092959850565b600080600080600080600080610100898b0312156147d9578182fd5b6147e38935615add565b8835975060208901356147f581615add565b96506040890135955060608901359450608089013567ffffffffffffffff8082111561481f578384fd5b818b0191508b601f830112614832578384fd5b813561484061445882615a93565b80828252602082019150602085018f60208086028801011115614861578788fd5b8795505b8386101561488e576148778135615add565b803583526001959095019460209283019201614865565b509750505060a08b01359150808211156148a6578384fd5b506148b38b828c01614438565b9350506148c260c08a016143e4565b915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156148f2578081fd5b87356148fd81615add565b9650602088013561490d81615add565b955060408801359450606088013593506080880135925060a088013561493281615add565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e03121561496a578485fd5b8b3561497581615add565b9a5060208c013561498581615add565b995060408c0135985060608c0135975060808c0135965060a08c01356149aa81615add565b955060c08c0135945060e08c01356149c181615b02565b93506149d06101008d016144ab565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600060e0888a031215614a0c578081fd5b8735614a1781615add565b96506020880135614a2781615add565b955060408801359450606088013593506080880135614a4581615b10565b925060a0880135614a5581615b10565b915060c0880135614a6581615add565b8091505092959891949750929550565b60008060408385031215614a87578182fd5b8235614a9281615add565b946020939093013593505050565b60008060008060008060008060c0898b031215614abb578182fd5b8835614ac681615add565b975060208901359650604089013567ffffffffffffffff80821115614ae9578384fd5b614af58c838d016143ef565b909850965060608b0135915080821115614b0d578384fd5b50614b1a8b828c016143ef565b9095509350506080890135614b2e81615add565b8092505060a089013590509295985092959890939650565b600080600080600080600080600060e08a8c031215614b63578283fd5b8935614b6e81615add565b985060208a0135975060408a0135965060608a013567ffffffffffffffff80821115614b98578485fd5b614ba48d838e016143ef565b909850965060808c0135915080821115614bbc578485fd5b50614bc98c828d016143ef565b90955093505060a08a0135614bdd81615add565b8092505060c08a013590509295985092959850929598565b60008060008060008060c08789031215614c0d578384fd5b8651614c1881615add565b8096505060208701519450604087015193506060870151614c3881615b10565b6080880151909350614c4981615b10565b60a0880151909250614c5a81615b10565b809150509295509295509295565b600080600080600060a08688031215614c7f578283fd5b8535614c8a81615add565b9450602086013593506040860135614ca181615b10565b92506060860135614cb181615b10565b91506080860135614cc181615add565b809150509295509295909350565b60006020808385031215614ce1578182fd5b825167ffffffffffffffff811115614cf7578283fd5b8301601f81018513614d07578283fd5b8051614d1561445882615a93565b8181528381019083850185840285018601891015614d31578687fd5b8694505b83851015614d53578051835260019490940193918501918501614d35565b50979650505050505050565b600060208284031215614d70578081fd5b815161292c81615b02565b60008060008060608587031215614d90578182fd5b8435614d9b81615add565b9350602085013567ffffffffffffffff80821115614db7578384fd5b908601906101008289031215614dcb578384fd5b90935060408601359080821115614de0578384fd5b818701915087601f830112614df3578384fd5b813581811115614e01578485fd5b886020828501011115614e12578485fd5b95989497505060200194505050565b600060208284031215614e32578081fd5b5051919050565b60008060408385031215614e4b578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015614e8e57815160ff1687529582019590820190600101614e6f565b509495945050505050565b60008151808452614eb1816020860160208601615ab1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffff000000000000000000000000000000000000000000000000000000008516825282846004840137910160040190815292915050565b60008251614f31818460208701615ab1565b9190910192915050565b60008351614f4d818460208801615ab1565b7f50616e69632800000000000000000000000000000000000000000000000000009083019081528351614f87816006840160208801615ab1565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b60008351614fcf818460208801615ab1565b7f556e6b6e6f776e280000000000000000000000000000000000000000000000009083019081528351615009816008840160208801615ab1565b7f290000000000000000000000000000000000000000000000000000000000000060089290910191820152600901949350505050565b60008351615051818460208801615ab1565b7f4572726f722800000000000000000000000000000000000000000000000000009083019081528351614f87816006840160208801615ab1565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152928516604085015293166060830152608082019290925260a081019190915260c00190565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b600060c0820173ffffffffffffffffffffffffffffffffffffffff808c1684526020818c1681860152818b16604086015289606086015260c060808601528288845260e086019050899350845b8981101561524657843561523281615add565b84168252938201939082019060010161521f565b5085810360a087015286815281019250869150835b868110156152815760ff61526e846144ab565b168452928101929181019160010161525b565b50919c9b505050505050505050505050565b600060c0820173ffffffffffffffffffffffffffffffffffffffff808a1684526020818a1681860152818916604086015287606086015260c0608086015282875180855260e0870191508289019450855b818110156153025785518516835294830194918301916001016152e4565b505085810360a08701526153168188614e5c565b9c9b505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff948516815292841660208401529216604082015260ff909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015263ffffffff9081166040830152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b8181101561542b5783518352928401929184019160010161540f565b50909695505050505050565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006020825261292c6020830184614e99565b60208082526015908201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604082015260600190565b60208082526014908201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201527f526f757465723a20455850495245440000000000000000000000000000000000604082015260600190565b60208082526017908201527f646174612073686f756c64206265206e6f74207a65726f000000000000000000604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f5560408201527f4e54000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160408201527f494c454400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f526f757465723a20496e76616c69642070616972000000000000000000000000604082015260600190565b918252602082015260400190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e316080830184614e99565b9283526020830191909152604082015260600190565b9586526020860194909452604085019290925263ffffffff908116606085015290811660808401521660a082015260c00190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615a40578283fd5b83018035915067ffffffffffffffff821115615a5a578283fd5b60200191503681900382131561443157600080fd5b60405181810167ffffffffffffffff81118282101715615a8b57fe5b604052919050565b600067ffffffffffffffff821115615aa757fe5b5060209081020190565b60005b83811015615acc578181015183820152602001615ab4565b838111156137905750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114615aff57600080fd5b50565b8015158114615aff57600080fd5b63ffffffff81168114615aff57600080fdfea26469706673582212203504e2f987379d590f55402ae272c2c2cddd1e941dc23c4e2e51b67a84d9f2cf64736f6c634300070600330000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8000000000000000000000000f8f007970cd7345a6bff4a0226f50feeb417378c0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8000000000000000000000000f8f007970cd7345a6bff4a0226f50feeb417378c0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
-----Decoded View---------------
Arg [0] : _factory (address): 0x5de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : _formula (address): 0xf8f007970cd7345a6bff4a0226f50feeb417378c
Arg [2] : _WETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : 000000000000000000000000f8f007970cd7345a6bff4a0226f50feeb417378c
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Deployed ByteCode Sourcemap
21614:21640:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22902:10;:18;22916:4;22902:18;;22895:26;;;;21614:21640;;;;;42354:638;;;;;;;;;;-1:-1:-1;42354:638:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34071:632;;;;;;;;;;-1:-1:-1;34071:632:0;;;;;:::i;:::-;;:::i;26808:510::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;21760:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40458:643::-;;;;;;;;;;-1:-1:-1;40458:643:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;29682:576::-;;;;;;;;;;-1:-1:-1;29682:576:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26429:373::-;;;;;;:::i;:::-;;:::i;21094:138::-;;;;;;;;;;;;;:::i;33405:660::-;;;;;;:::i;:::-;;:::i;42998:253::-;;;;;;;;;;-1:-1:-1;42998:253:0;;;;;:::i;:::-;;:::i;28691:531::-;;;;;;;;;;-1:-1:-1;28691:531:0;;;;;:::i;:::-;;:::i;34709:2207::-;;;;;;:::i;:::-;;:::i;28159:526::-;;;;;;;;;;-1:-1:-1;28159:526:0;;;;;:::i;:::-;;:::i;20483:81::-;;;;;;;;;;;;;:::i;29228:448::-;;;;;;:::i;:::-;;:::i;41107:616::-;;;;;;;;;;-1:-1:-1;41107:616:0;;;;;:::i;:::-;;:::i;21806:38::-;;;;;;;;;;;;;:::i;30264:577::-;;;;;;;;;;-1:-1:-1;30264:577:0;;;;;:::i;:::-;;:::i;39935:517::-;;;;;;;;;;-1:-1:-1;39935:517:0;;;;;:::i;:::-;;:::i;21714:41::-;;;;;;;;;;;;;:::i;24671:448::-;;;;;;;;;;-1:-1:-1;24671:448:0;;;;;:::i;:::-;;:::i;32761:638::-;;;;;;;;;;-1:-1:-1;32761:638:0;;;;;:::i;:::-;;:::i;39529:400::-;;;;;;;;;;-1:-1:-1;39529:400:0;;;;;:::i;:::-;;:::i;41798:550::-;;;;;;;;;;-1:-1:-1;41798:550:0;;;;;:::i;:::-;;:::i;30847:574::-;;;;;;:::i;:::-;;:::i;21377:230::-;;;;;;;;;;-1:-1:-1;21377:230:0;;;;;:::i;:::-;;:::i;25125:574::-;;;;;;;;;;-1:-1:-1;25125:574:0;;;;;:::i;:::-;;:::i;42354:638::-;42688:17;42714:13;42730:10;:36;;42757:9;42730:36;;;42751:2;42730:36;42773:79;;;;;42714:52;;-1:-1:-1;42773:26:0;;;;;;:79;;42800:10;;42820:4;;42714:52;;42834:8;;42844:1;;42847;;42850;;42773:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42871:115;42919:4;42925:5;42932:9;42943:14;42959:12;42973:2;42977:8;42871:47;:115::i;:::-;42859:127;42354:638;-1:-1:-1;;;;;;;;;;;;;42354:638:0:o;34071:632::-;34341:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34358:71:::1;34390:7;34399:10;34411:4;;34416:1;34411:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;34420:8;34358:31;:71::i;:::-;34436:72;34471:7;34480:4;;34436:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;34436:72:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;34486:6:0;;-1:-1:-1;34486:6:0;;;;34436:72;::::1;::::0;34486:6;;34436:72;34486:6;34436:72;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34502:4:0::1;::::0;-1:-1:-1;34436:34:0::1;::::0;-1:-1:-1;;34436:72:0:i:1;:::-;34535:37;::::0;;;;34515:17:::1;::::0;34535:22:::1;34542:4;34535:22;::::0;::::1;::::0;:37:::1;::::0;34566:4:::1;::::0;34535:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34515:57;;34600:12;34587:9;:25;;34579:72;;;;;;;;;;;;:::i;:::-;34658:39;21896:42;34683:2;34687:9;34658:11;:39::i;:::-;;22677:1;34071:632:::0;;;;;;;;;;:::o;26808:510::-;27102:19;27130:17;27156;27070:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;27229:83:::1;27246:4;27252:5;27259:18;27279:14;27295:12;27309:2;27229:16;:83::i;:::-;27191:121:::0;;;;-1:-1:-1;27191:121:0;;-1:-1:-1;26808:510:0;-1:-1:-1;;;;;;;;;26808:510:0:o;21760:41::-;;;:::o;40458:643::-;40793:15;40810;40774:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;40843:13:::1;40859:10;:36;;40886:9;40859:36;;;40880:2;40859:36;40843:52;;40918:4;40904:26;;;40931:10;40951:4;40958:5;40965:8;40975:1;40978;40981;40904:79;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22677:1;41018:77;41035:4;41041:6;41049;41057:9;41068:10;41080;41092:2;41018:16;:77::i;:::-;40997:98;;;;;;;;40458:643:::0;;;;;;;;;;;;;;;;:::o;29682:576::-;29942:24;29923:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;29985:70:::1;30003:7;30012:4;30018:9;30029:11;30042:4;;30048:6;;29985:17;:70::i;:::-;29975:80;;30064:73;30096:7;30105:10;30117:4;;30122:1;30117:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;30126;30134:1;30126:10;;;;;;;;;;;;;;30064:31;:73::i;:::-;30144:44;30150:7;30159;30168:4;;30144:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30182:4:0::1;::::0;-1:-1:-1;30144:5:0::1;::::0;-1:-1:-1;;30144:44:0:i:1;:::-;30195:57;21896:42;30220:2;30224:7;30249:1;30232:7;:14;:18;30224:27;;;;;;;;;;;;;;30195:11;:57::i;:::-;;29682:576:::0;;;;;;;;;;;;:::o;26429:373::-;26607:17;26633:12;26665:7;26648:36;;;26685:5;26692:4;26698:11;26711:7;26648:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26633:86;;26744:52;26761:4;26767:5;26774:11;26787:1;26790;26793:2;26744:16;:52::i;:::-;26726:70;26429:373;-1:-1:-1;;;;;;;;;26429:373:0:o;21094:138::-;20696:12;:10;:12::i;:::-;20685:23;;:7;:5;:7::i;:::-;:23;;;20677:68;;;;;;;;;;;;:::i;:::-;21197:1:::1;21181:6:::0;;21160:40:::1;::::0;::::1;21181:6:::0;;::::1;::::0;21160:40:::1;::::0;21197:1;;21160:40:::1;21224:1;21207:19:::0;;;::::1;::::0;;21094:138::o;33405:660::-;33661:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;33766:9:::1;33782:32;33766:9:::0;33806:4;;33747:16:::1;33806:7:::0;::::1;;;;;;;;;;;;;;;;;:::i;:::-;33782:13;:32::i;:::-;33845:30;::::0;;;;33821:21:::1;::::0;33845:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;33872:2;;33845:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33821:54;;33882:58;33917:4;33923;;33882:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;33882:58:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;33929:6:0;;-1:-1:-1;33929:6:0;;;;33882:58;::::1;::::0;33929:6;;33882:58;33929:6;33882:58;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33937:2:0;;-1:-1:-1;33882:34:0::1;::::0;-1:-1:-1;;33882:58:0:i:1;:::-;34008:12;33955:49;33990:13;33962:8;33955:26;;;33982:2;33955:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34:::0;::::1;:49::i;:::-;:65;;33947:112;;;;;;;;;;;;:::i;:::-;22677:1;;33405:660:::0;;;;;;;;;:::o;42998:253::-;20696:12;:10;:12::i;:::-;20685:23;;:7;:5;:7::i;:::-;:23;;;20677:68;;;;;;;;;;;;:::i;:::-;43080:20:::1;43093:5;43080;:20::i;:::-;43076:170;;;43111:50;43142:10;43154:6;43111:30;:50::i;:::-;43076:170;;;43184:54;43212:5;43219:10;43231:6;43184:27;:54::i;:::-;42998:253:::0;;:::o;28691:531::-;28977:24;28958:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;29020:74:::1;29038:7;29047:8;29057:9;29068:11;29081:4;;29087:6;;29020:17;:74::i;:::-;29010:84;;29103:73;29135:7;29144:10;29156:4;;29161:1;29156:7;;;;;;29103:73;29183:33;29189:7;29198;29207:4;;29183:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29213:2:0;;-1:-1:-1;29183:5:0::1;::::0;-1:-1:-1;;29183:33:0:i:1;:::-;28691:531:::0;;;;;;;;;;;;;:::o;34709:2207::-;34850:20;34872:15;34927:1;34904:4;:20;;;:24;34896:63;;;;;;;;;;;;:::i;:::-;34974:15;34966:51;;;;;;;;;;;;:::i;:::-;35042:10;;;;35076:11;;;;35026:13;35112;;;;35042:4;35112:13;:::i;:::-;35094:31;-1:-1:-1;35132:15:0;35150:13;;;;;;;;:::i;:::-;35132:31;-1:-1:-1;22043:4:0;35176:27;;:32;35172:223;;35240:15;35246:8;35240:5;:15::i;:::-;:28;;35267:1;35240:28;;;35258:6;35240:28;35227:9;:42;35219:72;;;;;;;;;;;;:::i;:::-;35172:223;;;35336:15;35342:8;35336:5;:15::i;:::-;:28;;35363:1;35336:28;;;35354:6;35336:28;35322:9;:43;35314:73;;;;;;;;;;;;:::i;:::-;22093:4;35407:21;;:26;35403:240;;35453:15;35459:8;35453:5;:15::i;:::-;35452:16;35444:47;;;;;;;;;;;;:::i;:::-;35500:38;35508:8;35518:6;35526:11;;;;:4;:11;:::i;:::-;35500:7;:38::i;:::-;35547:88;35587:8;35598:10;35610:16;;;;;;;;:::i;:::-;35628:6;35547:31;:88::i;:::-;35651:19;;35674:16;;;;;;;;:::i;:::-;:30;;;35673:64;;35721:16;;;;;;;;:::i;:::-;35673:64;;;35708:10;35673:64;35651:86;-1:-1:-1;35744:25:0;21987:4;35773:21;;35772:67;;35838:1;35772:67;;;35803:32;35814:8;35824:10;35803;:32::i;:::-;35744:95;;35846:25;35874:33;35885:8;35895:11;35874:10;:33::i;:::-;35846:61;;35984:12;35998:19;36029:6;36021:20;;36049:9;36083:25;;;36110:4;;36060:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36021:95;;;;36060:55;36021:95;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35983:133;;;;36130:7;36125:97;;36157:54;36182:6;36157:54;;;;;;;;;;;;;;;;;:24;:54::i;:::-;36150:62;;;;;;;;;;;:::i;36125:97::-;-1:-1:-1;36259:6:0;;-1:-1:-1;36287:56:0;36325:17;36287:33;36298:8;36308:11;36287:10;:33::i;:56::-;36272:71;-1:-1:-1;21987:4:0;36356:21;;:26;36352:343;;36407:67;36441:32;36452:8;36462:10;36441;:32::i;:::-;36407:29;:17;36429:6;36407:21;:29::i;:67::-;36393:81;-1:-1:-1;36519:37:0;:20;;;;36393:81;36519:24;:37::i;:::-;36491:24;:12;36508:6;36491:16;:24::i;:::-;:65;;36483:105;;;;;;;;;;;;:::i;:::-;36352:343;;;36635:4;:20;;;36619:12;:36;;36611:76;;;;;;;;;;;;:::i;:::-;36708:79;36716:10;36728:8;36738;36748:11;36761;36774:12;36708:79;;;;;;;;;;;:::i;:::-;;;;;;;;36799:83;36816:6;36825:12;36839:15;36845:8;36839:5;:15::i;:::-;:42;;36872:8;36839:42;;;36857:4;36839:42;36799:83;;;;;;;;:::i;:::-;;;;;;;;36901:9;36891:19;;34709:2207;;;;;;;;;;;;;;;:::o;28159:526::-;28439:24;28420:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;28482:75:::1;28501:7;28510:8;28520;28530:12;28544:4;28550:6;28482:18;:75::i;:::-;28472:85;;28566:73;28598:7;28607:10;28619:4;28624:1;28619:7;;;;;;;;;;;;;;28628;28636:1;28628:10;;;;;;;28566:73;28646:33;28652:7;28661;28670:4;28676:2;28646:5;:33::i;:::-;28159:526:::0;;;;;;;;;;;:::o;20483:81::-;20529:7;20552:6;;;20483:81;:::o;29228:448::-;29474:24;29455:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;29517:73:::1;29536:4;29542:8;29552:9;29563:12;29577:4;;29517:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29583:6;;29517:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29517:18:0::1;::::0;-1:-1:-1;;;29517:73:0:i:1;:::-;29507:83;;29599:34;29613:7;29621:1;29613:10;;;;;;;;;;;;;;29625:4;;29630:1;29625:7;;;;;;29599:34;29640:30;29646:4;29652:7;29661:4;;29640:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29667:2:0;;-1:-1:-1;29640:5:0::1;::::0;-1:-1:-1;;29640:30:0:i:1;41107:616::-:0;41412:19;41433:17;41459:13;41475:10;:36;;41502:9;41475:36;;;41496:2;41475:36;41518:79;;;;;41459:52;;-1:-1:-1;41518:26:0;;;;;;:79;;41545:10;;41565:4;;41459:52;;41579:8;;41589:1;;41592;;41595;;41518:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41631:86;41650:4;41656:5;41663:9;41674:14;41690:12;41704:2;41708:8;41631:18;:86::i;:::-;41604:113;;;;-1:-1:-1;41107:616:0;-1:-1:-1;;;;;;;;;;;;;41107:616:0:o;21806:38::-;;;:::o;30264:577::-;30524:24;30505:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;30567:71:::1;30586:7;30595:4;30601:8;30611:12;30625:4;;30567:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30631:6;;30567:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30567:18:0::1;::::0;-1:-1:-1;;;30567:71:0:i:1;39935:517::-:0;40177:19;40198:17;40158:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;40251:91:::1;40268:4;40274:5;40281:4;40287:9;40298:14;40314:12;40336:4;40251:16;:91::i;:::-;40224:118:::0;;-1:-1:-1;40224:118:0;-1:-1:-1;40349:51:0::1;40377:5:::0;40384:2;40224:118;40349:27:::1;:51::i;:::-;40407:39;21896:42;40432:2;40436:9;40407:11;:39::i;:::-;;39935:517:::0;;;;;;;;;;;:::o;21714:41::-;;;:::o;24671:448::-;24879:17;24905:12;24937:7;24920:36;;;24957:6;24965;24973:12;24987:7;24920:75;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24905:90;;25002:64;25021:4;25027:6;25035;25043:7;25052;25061:1;25064;25002:18;:64::i;:::-;-1:-1:-1;;25085:28:0;;;;;:24;;;;;;:28;;25110:2;;25085:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32761:638::-;33057:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;33074:71:::1;33106:7;33115:10;33127:4;;33132:1;33127:7;;;;;;33074:71;33176:30;::::0;;;;33152:21:::1;::::0;33176:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;33203:2;;33176:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33152:54;;33213:61;33248:7;33257:4;;33213:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;33213:61:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;33263:6:0;;-1:-1:-1;33263:6:0;;;;33213:61;::::1;::::0;33263:6;;33213:61;33263:6;33213:61;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33271:2:0;;-1:-1:-1;33213:34:0::1;::::0;-1:-1:-1;;33213:61:0:i:1;:::-;33342:12;33289:49;33324:13;33296:8;33289:26;;;33316:2;33289:30;;;;;;;;;;;;;;;:::i;:49::-;:65;;33281:112;;;;;;;;;;;;:::i;39529:400::-:0;39784:15;39801;39765:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;39846:77:::1;39863:4;39869:6;39877;39885:9;39896:10;39908;39920:2;39846:16;:77::i;:::-;39825:98:::0;;;;-1:-1:-1;39529:400:0;-1:-1:-1;;;;;;;;;;39529:400:0:o;41798:550::-;42069:17;42050:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;42111:100:::1;42127:4;42133:5;42140:4;42146:9;42157:14;42173:12;42195:4;42202:8;42111:15;:100::i;:::-;42257:38;::::0;;;;42095:116;;-1:-1:-1;42218:78:0::1;::::0;-1:-1:-1;42246:5:0;;42253:2;;42257:23:::1;::::0;::::1;::::0;::::1;::::0;:38:::1;::::0;42289:4:::1;::::0;42257:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42218:27;:78::i;:::-;42303:39;21896:42;42328:2;42332:9;42303:11;:39::i;:::-;;41798:550:::0;;;;;;;;;;:::o;30847:574::-;31090:24;31071:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;31133:69:::1;31151:4;31157:8;31167:9;31178;31189:4;;31195:6;;31133:17;:69::i;:::-;31123:79;;31211:34;31225:7;31233:1;31225:10;;;;;;;31211:34;31252:30;31258:4;31264:7;31273:4;;31252:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31279:2:0;;-1:-1:-1;31252:5:0::1;::::0;-1:-1:-1;;31252:30:0:i:1;:::-;31337:7;31345:1;31337:10;;;;;;;;;;;;;;31325:9;:22;31321:94;;;31349:66;31380:10;31404:7;31412:1;31404:10;;;;;;;;;;;;;;31392:9;:22;31349:30;:66::i;21377:230::-:0;20696:12;:10;:12::i;:::-;20685:23;;:7;:5;:7::i;:::-;:23;;;20677:68;;;;;;;;;;;;:::i;:::-;21462:22:::1;::::0;::::1;21454:73;;;;;;;;;;;;:::i;:::-;21560:6;::::0;;21539:38:::1;::::0;::::1;::::0;;::::1;::::0;21560:6;::::1;::::0;21539:38:::1;::::0;::::1;21584:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;21377:230::o;25125:574::-;25446:15;25470;25494:17;25414:8;22635:15;22623:8;:27;;22615:55;;;;;;;;;;;;:::i;:::-;25550:96:::1;25569:4;25575:6;25583;25591:14;25607;25623:10;25635;25550:18;:96::i;:::-;25665:28;::::0;;;;25529:117;;-1:-1:-1;25529:117:0;-1:-1:-1;25665:24:0::1;::::0;::::1;::::0;::::1;::::0;:28:::1;::::0;25690:2;;25665:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25653:40;;25125:574:::0;;;;;;;;;;;;;;:::o;7358:416::-;7557:12;7571:17;7592:5;:10;;7626;7638:4;7644:2;7648:5;7603:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7592:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7556:99;;;;7670:7;:57;;;;-1:-1:-1;7682:11:0;;:16;;:44;;;7713:4;7702:24;;;;;;;;;;;;:::i;:::-;7662:106;;;;;;;;;;;;:::i;:::-;7358:416;;;;;;:::o;31562:1193::-;31736:9;31731:1019;31751:4;:11;31747:1;:15;31731:1019;;;31778:20;31807:21;31849:14;31865:20;31887:21;31910:23;31937:14;31983:7;31966:53;;;32020:7;32029:4;32034:1;32029:7;;;;;;;;;;;;;;32038;32047:6;32054:1;32047:9;;;;;;;;;;;;;;31966:91;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31848:209;;;;;;;;;;;32068:19;32090:52;32129:12;32097:7;32090:25;;;32116:4;32121:1;32116:7;;;;;;;;;;;;;;32090:34;;;;;;;;;;;;;;;:::i;:52::-;32068:74;;32185:7;32168:38;;;32207:11;32220:12;32234:13;32249:16;32273;32267:3;:22;32291:7;32168:131;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32153:146;;32326:6;32310:22;;31731:1019;;;;;;32352:18;32387:4;32392:1;32387:7;;;;;;;;;;;;;;32352:43;;32405:18;32425;32458:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32447:24;;:7;:24;;;:82;;32504:12;32526:1;32447:82;;;32483:1;32487:12;32447:82;32404:125;;;;32538:10;32569:1;32555:4;:11;:15;32551:1;:19;:39;;32587:3;32551:39;;;32573:4;32578:1;32582;32578:5;32573:11;;;;;;;;;;;;;;32551:39;32637:12;;;32647:1;32637:12;;;;;;;;;32599:51;;;;32538:52;;-1:-1:-1;32599:9:0;;;;;;:51;;32609:10;;32621;;32538:52;;32599:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32664:46;32673:4;32678:1;32673:7;;;;;;;;;;;;;;32682:12;32696:13;32664:46;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;32729:13:0;;-1:-1:-1;;31764:3:0;;;;;-1:-1:-1;31731:1019:0;;-1:-1:-1;;31731:1019:0;;;31562:1193;;;;:::o;38191:382::-;38293:4;38310:11;38306:45;;-1:-1:-1;38339:4:0;38332:11;;38306:45;38363:20;38376:5;38363;:20::i;:::-;38359:191;;;38394:28;;;;;:20;38400:4;38394:20;;;;:28;;38415:6;;38394:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38431:42;38462:2;38466:6;38431:30;:42::i;:::-;38359:191;;;38496:46;38524:5;38531:2;38535:6;38496:27;:46::i;:::-;-1:-1:-1;38563:4:0;38191:382;;;;;;:::o;25705:718::-;25917:19;25945:17;25971;26033:93;26047:4;26053:5;26060:4;26066:18;26086:9;26097:14;26113:12;26033:13;:93::i;:::-;26006:120;;-1:-1:-1;26006:120:0;-1:-1:-1;26133:69:0;26165:5;26172:10;26184:4;26006:120;26133:31;:69::i;:::-;26209:30;26223:9;26234:4;26209:13;:30::i;:::-;26258:28;;;;;:24;;;;;;:28;;26283:2;;26258:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26246:40;;26341:9;26329;:21;26325:92;;;26352:65;26383:10;26407:9;26395;:21;26352:30;:65::i;:::-;25705:718;;;;;;;;;;:::o;38727:796::-;38928:15;38945;38994:7;38977:32;;;39010:4;38977:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38969:71;;;;;;;;;;;;:::i;:::-;39047:61;;;;;:32;;;;;;:61;;39080:10;;39061:4;;39098:9;;39047:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39147:15;39164;39197:4;39183:24;;;39208:2;39183:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39146:65;;;;39219:14;39256:7;39239:36;;;39276:6;39284;39239:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39218:73;;;39329:6;39319:16;;:6;:16;;;:58;;39360:7;39369;39319:58;;;39339:7;39348;39319:58;39298:79;;-1:-1:-1;39298:79:0;-1:-1:-1;39392:21:0;;;;39384:63;;;;;;;;;;;;:::i;:::-;39473:10;39462:7;:21;;39454:63;;;;;;;;;;;;:::i;:::-;38727:796;;;;;;;;;;;;;:::o;37591:432::-;37844:98;;;;;37801:24;;37844:45;37861:7;37844:45;;;;:98;;37890:7;;37899;;37908:8;;37918:9;;37929:4;;;;37935:6;;;;37844:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37834:108;;37971:11;37957:7;37965:1;37957:10;;;;;;;;;;;;;;:25;;37949:68;;;;;;;;;;;;:::i;:::-;37591:432;;;;;;;;;;:::o;27423:730::-;27582:7;27566:13;27596:552;27620:4;:11;27616:1;:15;27596:552;;;27647:20;27684:4;27689:1;27684:7;;;;;;;;;;;;;;27647:45;;27701:14;27718:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27701:32;;27742:17;27762:7;27770:1;27774;27770:5;27762:14;;;;;;;;;;;;;;27742:34;;27786:18;27806;27826:14;27853:6;27844:15;;:5;:15;;;:92;;27906:9;27925:1;27929:6;27844:92;;;27871:1;27875:9;27886:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27785:151;;;;;;27945:10;27976:1;27962:4;:11;:15;27958:1;:19;:39;;27994:3;27958:39;;;27980:4;27985:1;27989;27985:5;27980:11;;;;;;;;;;;;;;27958:39;28046:12;;;28056:1;28046:12;;;;;;;;;28006:53;;;;27945:52;;-1:-1:-1;28006:11:0;;;;;;:53;;28018:10;;28030;;27945:52;;28006:53;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28073:44;28090:6;28099:9;28110:6;28073:44;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;28134:6:0;-1:-1:-1;;27633:3:0;;;;;-1:-1:-1;27596:552:0;;-1:-1:-1;;;27596:552:0;19165:100;19249:10;19165:100;:::o;38029:156::-;38102:4;38096:19;;;38123:6;38096:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38146:32:0;;;;;:20;38152:4;38146:20;;-1:-1:-1;38146:20:0;;-1:-1:-1;38146:32:0;;-1:-1:-1;38167:2:0;;38171:6;;38146:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38139:40;;;14588:132;14677:5;;;14672:16;;;;14664:50;;;;;;;;;;;;:::i;:::-;14588:132;;;;:::o;38579:109::-;38652:29;;;21896:42;38652:29;38579:109;;;;:::o;7780:190::-;7889:12;;;7849;7889;;;;;;;;;7867:7;;;;7882:5;;7867:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7848:54;;;7917:7;7909:55;;;;;;;;;;;;:::i;:::-;7780:190;;;:::o;6982:370::-;7146:12;7160:17;7181:5;:10;;7215;7227:2;7231:5;7192:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7181:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7145:93;;;;7253:7;:57;;;;-1:-1:-1;7265:11:0;;:16;;:44;;;7296:4;7285:24;;;;;;;;;;;;:::i;:::-;7245:101;;;;;;;;;;;;:::i;18012:605::-;18139:6;18122:23;;18118:494;;;18215:12;18229:19;18260:5;18252:19;;18289:28;;;18319:6;;18272:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;18252:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18214:113;;;;18341:7;18336:269;;18361:20;18384:56;18409:6;18384:56;;;;;;;;;;;;;;;;;:24;:56::i;:::-;18361:79;;18500:6;18455:5;:15;;;18471:10;18491:4;18455:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;18451:145;;;18528:6;18521:14;;;;;;;;;;;:::i;18451:145::-;18571:13;18577:6;18571:13;;;;;;:::i;:::-;;;;;;;;18336:269;18118:494;;;18012:605;;;;:::o;36922:206::-;36996:7;37016:12;37022:5;37016;:12::i;:::-;37012:111;;;-1:-1:-1;37046:15:0;;;;37039:22;;37012:111;37091:24;;;;;:15;;;;;;:24;;37107:7;;37091:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37084:31;;;;15622:1769;15701:13;15970:2;15955:4;:11;:17;;:38;;;;;15976:4;15981:1;15976:7;;;;;;;;;;;;;;;:17;;15955:38;:59;;;;;15997:4;16002:1;15997:7;;;;;;;;;;;;;;;:17;;15955:59;:80;;;;;16018:4;16023:1;16018:7;;;;;;;;;;;;;;;:17;;15955:80;:101;;;;;16039:4;16044:1;16039:7;;;;;;;;;;;;;;;:17;;15955:101;15951:1356;;;16067:20;16255:2;16249:4;16245:13;16235:23;;16739:6;16733:20;16728:2;:25;16713:4;:11;:40;;16705:74;;;;;;;;;;;;:::i;:::-;16819:6;16837;16802:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16788:62;;;;;15951:1356;16932:4;:11;16947:2;16932:17;:38;;;;;16953:4;16958:1;16953:7;;;;;;;;;;;;;;;:17;;16932:38;:59;;;;;16974:4;16979:1;16974:7;;;;;;;;;;;;;;;:17;;16932:59;:80;;;;;16995:4;17000:1;16995:7;;;;;;;;;;;;;;;:17;;16932:80;:101;;;;;17016:4;17021:1;17016:7;;;;;;;;;;;;;;;:17;;16932:101;16928:379;;;17210:2;17200:13;;17194:20;17262:6;17280:12;17194:20;17280:6;:12::i;:::-;17245:53;;;;;;;;;:::i;16928:379::-;17346:6;17366:12;17373:4;17366:6;:12::i;:::-;17329:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17315:70;;15622:1769;;;;:::o;14451:131::-;14540:5;;;14535:16;;;;14527:49;;;;;;;;;;;;:::i;14726:145::-;14784:9;14810:6;;;:30;;-1:-1:-1;;14825:5:0;;;14839:1;14834;14825:5;14834:1;14820:15;;;;;:20;14810:30;14802:63;;;;;;;;;;;;:::i;37134:451::-;37384:98;;;;;37341:24;;37384:46;37401:7;37384:46;;;;:98;;37431:7;;37440;;37449:8;;37459;;37469:4;;37475:6;;37384:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37374:108;;37528:12;37497:7;37522:1;37505:7;:14;:18;37497:27;;;;;;;;;;;;;;:43;;37489:90;;;;;;;;;;;;:::i;:::-;37134:451;;;;;;;;:::o;24140:525::-;24360:15;24377;24422:91;24436:4;24442:6;24450;24458:14;24474;24490:10;24502;24422:13;:91::i;:::-;24401:112;;-1:-1:-1;24401:112:0;-1:-1:-1;24520:66:0;24552:6;24560:10;24572:4;24401:112;24520:31;:66::i;:::-;24593;24625:6;24633:10;24645:4;24651:7;24593:31;:66::i;:::-;24140:525;;;;;;;;;;:::o;23023:1111::-;23246:15;23263;23288:16;23306;23343:7;23326:37;;;23364:4;23370:6;23378;23326:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23287:98;;;;23396:8;23408:1;23396:13;:30;;;;-1:-1:-1;23413:13:0;;23396:30;23392:737;;;23459:14;;-1:-1:-1;23475:14:0;;-1:-1:-1;23392:737:0;;;23538:67;;;;;23513:22;;23538:31;23555:7;23538:31;;;;:67;;23570:14;;23586:8;;23596;;23538:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23513:92;;23636:14;23618;:32;23614:508;;23689:10;23671:14;:28;;23663:70;;;;;;;;;;;;:::i;:::-;23766:14;;-1:-1:-1;23782:14:0;-1:-1:-1;23782:14:0;23614:508;;;23849:67;;;;;23824:22;;23849:31;23866:7;23849:31;;;;:67;;23881:14;;23897:8;;23907;;23849:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23824:92;;23952:14;23934;:32;;23927:40;;;;24004:10;23986:14;:28;;23978:70;;;;;;;;;;;;:::i;:::-;24081:14;24097;;-1:-1:-1;23023:1111:0;;-1:-1:-1;;;;;;;;;;23023:1111:0:o;17397:119::-;17450:13;17479:31;17503:5;17486:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;17522:425;17694:11;;17579:13;;17601:53;;:16;;17708:1;17694:15;;;17690:19;17680:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17680:30:0;;17661:49;;17717:12;:3;17721:1;17717:6;;;;;;;;;;;:12;;;;;;;;;;;17736;:3;17740:1;17736:6;;;;;;;;;;;:12;;;;;;;;;;;17760:9;17755:162;17779:4;:11;17775:1;:15;17755:162;;;17823:8;17849:1;17838:4;17843:1;17838:7;;;;;;;;;;;;;;:12;;:7;17832:19;17823:29;;;;;;;;;;17806:3;17814:1;17810;:5;17818:1;17810:9;17806:14;;;;;;;;;;;:46;;;;;;;;;;;17878:8;17893:4;17898:1;17893:7;;;;;;;;;;;;;;;17903:4;17887:21;17878:31;;;;;;;;;;17861:3;17869:1;17865;:5;17873:1;17865:9;17861:14;;;;;;;;;;;:48;;;;;;;;;;-1:-1:-1;17792:3:0;;17755:162;;;-1:-1:-1;17937:3:0;17522:425;-1:-1:-1;;;17522:425:0:o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:404::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;315:8;305;298:26;257:2;-1:-1:-1;345:20:1;;388:18;377:30;;374:2;;;427:8;417;410:26;374:2;471:4;463:6;459:17;447:29;;534:3;527:4;519;511:6;507:17;499:6;495:30;491:41;488:50;485:2;;;551:1;548;541:12;485:2;247:314;;;;;:::o;566:709::-;;677:3;670:4;662:6;658:17;654:27;644:2;;699:5;692;685:20;644:2;739:6;726:20;765:4;789:65;804:49;850:2;804:49;:::i;:::-;789:65;:::i;:::-;888:15;;;919:12;;;;951:15;;;997:11;;;985:24;;981:33;;978:42;-1:-1:-1;975:2:1;;;1037:5;1030;1023:20;975:2;1063:5;1077:169;1091:2;1088:1;1085:9;1077:169;;;1148:23;1167:3;1148:23;:::i;:::-;1136:36;;1192:12;;;;1224;;;;1109:1;1102:9;1077:169;;;-1:-1:-1;1264:5:1;;634:641;-1:-1:-1;;;;;;;634:641:1:o;1280:158::-;1348:20;;1408:4;1397:16;;1387:27;;1377:2;;1428:1;1425;1418:12;1443:259;;1555:2;1543:9;1534:7;1530:23;1526:32;1523:2;;;1576:6;1568;1561:22;1523:2;1620:9;1607:23;1639:33;1666:5;1639:33;:::i;1707:263::-;;1830:2;1818:9;1809:7;1805:23;1801:32;1798:2;;;1851:6;1843;1836:22;1798:2;1888:9;1882:16;1907:33;1934:5;1907:33;:::i;1975:399::-;;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2136:6;2128;2121:22;2083:2;2173:9;2167:16;2192:33;2219:5;2192:33;:::i;:::-;2294:2;2279:18;;2273:25;2244:5;;-1:-1:-1;2307:35:1;2273:25;2307:35;:::i;:::-;2361:7;2351:17;;;2073:301;;;;;:::o;2379:965::-;;;;;;;;;2610:3;2598:9;2589:7;2585:23;2581:33;2578:2;;;2632:6;2624;2617:22;2578:2;2676:9;2663:23;2695:33;2722:5;2695:33;:::i;:::-;2747:5;-1:-1:-1;2804:2:1;2789:18;;2776:32;2817:35;2776:32;2817:35;:::i;:::-;2871:7;-1:-1:-1;2930:2:1;2915:18;;2902:32;2943:35;2902:32;2943:35;:::i;:::-;2997:7;-1:-1:-1;3051:2:1;3036:18;;3023:32;;-1:-1:-1;3102:3:1;3087:19;;3074:33;;-1:-1:-1;3154:3:1;3139:19;;3126:33;;-1:-1:-1;3211:3:1;3196:19;;3183:33;3225:35;3183:33;3225:35;:::i;:::-;3279:7;3269:17;;;3333:3;3322:9;3318:19;3305:33;3295:43;;2568:776;;;;;;;;;;;:::o;3349:1318::-;;;;;;;;;;;;;3645:3;3633:9;3624:7;3620:23;3616:33;3613:2;;;3667:6;3659;3652:22;3613:2;3711:9;3698:23;3730:33;3757:5;3730:33;:::i;:::-;3782:5;-1:-1:-1;3839:2:1;3824:18;;3811:32;3852:35;3811:32;3852:35;:::i;:::-;3906:7;-1:-1:-1;3965:2:1;3950:18;;3937:32;3978:35;3937:32;3978:35;:::i;:::-;4032:7;-1:-1:-1;4086:2:1;4071:18;;4058:32;;-1:-1:-1;4137:3:1;4122:19;;4109:33;;-1:-1:-1;4189:3:1;4174:19;;4161:33;;-1:-1:-1;4246:3:1;4231:19;;4218:33;4260:35;4218:33;4260:35;:::i;:::-;4314:7;-1:-1:-1;4368:3:1;4353:19;;4340:33;;-1:-1:-1;4425:3:1;4410:19;;4397:33;4439:32;4397:33;4439:32;:::i;:::-;4490:7;-1:-1:-1;4516:39:1;4550:3;4535:19;;4516:39;:::i;:::-;4506:49;;4603:3;4592:9;4588:19;4575:33;4564:44;;4656:3;4645:9;4641:19;4628:33;4617:44;;3603:1064;;;;;;;;;;;;;;:::o;4672:1034::-;;;;;;;;;;4920:3;4908:9;4899:7;4895:23;4891:33;4888:2;;;4942:6;4934;4927:22;4888:2;4986:9;4973:23;5005:33;5032:5;5005:33;:::i;:::-;5057:5;-1:-1:-1;5114:2:1;5099:18;;5086:32;5127:35;5086:32;5127:35;:::i;:::-;5181:7;-1:-1:-1;5240:2:1;5225:18;;5212:32;5253:35;5212:32;5253:35;:::i;:::-;5307:7;-1:-1:-1;5361:2:1;5346:18;;5333:32;;-1:-1:-1;5412:3:1;5397:19;;5384:33;;-1:-1:-1;5464:3:1;5449:19;;5436:33;;-1:-1:-1;5516:3:1;5501:19;;5488:33;;-1:-1:-1;5573:3:1;5558:19;;5545:33;5587:35;5545:33;5587:35;:::i;:::-;5641:7;5631:17;;;5695:3;5684:9;5680:19;5667:33;5657:43;;4878:828;;;;;;;;;;;:::o;5711:1445::-;;;;;;;;;;;6010:3;5998:9;5989:7;5985:23;5981:33;5978:2;;;6032:6;6024;6017:22;5978:2;6076:9;6063:23;6095:33;6122:5;6095:33;:::i;:::-;6147:5;-1:-1:-1;6204:2:1;6189:18;;6176:32;6217:35;6176:32;6217:35;:::i;:::-;6271:7;-1:-1:-1;6325:2:1;6310:18;;6297:32;;-1:-1:-1;6376:2:1;6361:18;;6348:32;;-1:-1:-1;6431:3:1;6416:19;;6403:33;6455:18;6485:14;;;6482:2;;;6517:6;6509;6502:22;6482:2;6561:76;6629:7;6620:6;6609:9;6605:22;6561:76;:::i;:::-;6656:8;;-1:-1:-1;6535:102:1;-1:-1:-1;6744:3:1;6729:19;;6716:33;;-1:-1:-1;6761:16:1;;;6758:2;;;6795:6;6787;6780:22;6758:2;;6839:78;6909:7;6898:8;6887:9;6883:24;6839:78;:::i;:::-;6936:8;;-1:-1:-1;6813:104:1;-1:-1:-1;;7023:3:1;7008:19;;6995:33;7037:35;6995:33;7037:35;:::i;:::-;7091:7;7081:17;;;7145:3;7134:9;7130:19;7117:33;7107:43;;5968:1188;;;;;;;;;;;;;:::o;7161:1799::-;;;;;;;;;7440:3;7428:9;7419:7;7415:23;7411:33;7408:2;;;7462:6;7454;7447:22;7408:2;7480:51;7520:9;7507:23;7480:51;:::i;:::-;7563:9;7550:23;7540:33;;7623:2;7612:9;7608:18;7595:32;7636:33;7663:5;7636:33;:::i;:::-;7688:5;-1:-1:-1;7740:2:1;7725:18;;7712:32;;-1:-1:-1;7791:2:1;7776:18;;7763:32;;-1:-1:-1;7846:3:1;7831:19;;7818:33;7870:18;7900:14;;;7897:2;;;7932:6;7924;7917:22;7897:2;7975:6;7964:9;7960:22;7950:32;;8020:7;8013:4;8009:2;8005:13;8001:27;7991:2;;8047:6;8039;8032:22;7991:2;8088;8075:16;8111:65;8126:49;8172:2;8126:49;:::i;8111:65::-;8198:3;8222:2;8217:3;8210:15;8250:2;8245:3;8241:12;8234:19;;8281:2;8277;8273:11;8330:7;8325:2;8319;8315;8311:11;8307:2;8303:20;8299:29;8296:42;8293:2;;;8356:6;8348;8341:22;8293:2;8383:6;8374:15;;8398:221;8412:2;8409:1;8406:9;8398:221;;;8457:45;8497:3;8484:17;8457:45;:::i;:::-;8527:17;;8515:30;;8430:1;8423:9;;;;;8574:2;8565:12;;;;8597;8398:221;;;-1:-1:-1;8638:5:1;-1:-1:-1;;;8696:3:1;8681:19;;8668:33;;-1:-1:-1;8713:16:1;;;8710:2;;;8747:6;8739;8732:22;8710:2;;8775:67;8834:7;8823:8;8812:9;8808:24;8775:67;:::i;:::-;8765:77;;;8861:41;8897:3;8886:9;8882:19;8861:41;:::i;:::-;8851:51;;8949:3;8938:9;8934:19;8921:33;8911:43;;7398:1562;;;;;;;;;;;:::o;8965:821::-;;;;;;;;9179:3;9167:9;9158:7;9154:23;9150:33;9147:2;;;9201:6;9193;9186:22;9147:2;9245:9;9232:23;9264:33;9291:5;9264:33;:::i;:::-;9316:5;-1:-1:-1;9373:2:1;9358:18;;9345:32;9386:35;9345:32;9386:35;:::i;:::-;9440:7;-1:-1:-1;9494:2:1;9479:18;;9466:32;;-1:-1:-1;9545:2:1;9530:18;;9517:32;;-1:-1:-1;9596:3:1;9581:19;;9568:33;;-1:-1:-1;9653:3:1;9638:19;;9625:33;9667:35;9625:33;9667:35;:::i;:::-;9721:7;9711:17;;;9775:3;9764:9;9760:19;9747:33;9737:43;;9137:649;;;;;;;;;;:::o;9791:1172::-;;;;;;;;;;;;10069:3;10057:9;10048:7;10044:23;10040:33;10037:2;;;10091:6;10083;10076:22;10037:2;10135:9;10122:23;10154:33;10181:5;10154:33;:::i;:::-;10206:5;-1:-1:-1;10263:2:1;10248:18;;10235:32;10276:35;10235:32;10276:35;:::i;:::-;10330:7;-1:-1:-1;10384:2:1;10369:18;;10356:32;;-1:-1:-1;10435:2:1;10420:18;;10407:32;;-1:-1:-1;10486:3:1;10471:19;;10458:33;;-1:-1:-1;10543:3:1;10528:19;;10515:33;10557:35;10515:33;10557:35;:::i;:::-;10611:7;-1:-1:-1;10665:3:1;10650:19;;10637:33;;-1:-1:-1;10722:3:1;10707:19;;10694:33;10736:32;10694:33;10736:32;:::i;:::-;10787:7;-1:-1:-1;10813:39:1;10847:3;10832:19;;10813:39;:::i;:::-;10803:49;;10899:3;10888:9;10884:19;10871:33;10861:43;;10952:3;10941:9;10937:19;10924:33;10913:44;;10027:936;;;;;;;;;;;;;;:::o;10968:967::-;;;;;;;;11180:3;11168:9;11159:7;11155:23;11151:33;11148:2;;;11202:6;11194;11187:22;11148:2;11246:9;11233:23;11265:33;11292:5;11265:33;:::i;:::-;11317:5;-1:-1:-1;11374:2:1;11359:18;;11346:32;11387:35;11346:32;11387:35;:::i;:::-;11441:7;-1:-1:-1;11495:2:1;11480:18;;11467:32;;-1:-1:-1;11546:2:1;11531:18;;11518:32;;-1:-1:-1;11602:3:1;11587:19;;11574:33;11616:34;11574:33;11616:34;:::i;:::-;11669:7;-1:-1:-1;11728:3:1;11713:19;;11700:33;11742:34;11700:33;11742:34;:::i;:::-;11795:7;-1:-1:-1;11854:3:1;11839:19;;11826:33;11868:35;11826:33;11868:35;:::i;:::-;11922:7;11912:17;;;11138:797;;;;;;;;;;:::o;11940:327::-;;;12069:2;12057:9;12048:7;12044:23;12040:32;12037:2;;;12090:6;12082;12075:22;12037:2;12134:9;12121:23;12153:33;12180:5;12153:33;:::i;:::-;12205:5;12257:2;12242:18;;;;12229:32;;-1:-1:-1;;;12027:240:1:o;12272:1232::-;;;;;;;;;12537:3;12525:9;12516:7;12512:23;12508:33;12505:2;;;12559:6;12551;12544:22;12505:2;12603:9;12590:23;12622:33;12649:5;12622:33;:::i;:::-;12674:5;-1:-1:-1;12726:2:1;12711:18;;12698:32;;-1:-1:-1;12781:2:1;12766:18;;12753:32;12804:18;12834:14;;;12831:2;;;12866:6;12858;12851:22;12831:2;12910:76;12978:7;12969:6;12958:9;12954:22;12910:76;:::i;:::-;13005:8;;-1:-1:-1;12884:102:1;-1:-1:-1;13093:2:1;13078:18;;13065:32;;-1:-1:-1;13109:16:1;;;13106:2;;;13143:6;13135;13128:22;13106:2;;13187:78;13257:7;13246:8;13235:9;13231:24;13187:78;:::i;:::-;13284:8;;-1:-1:-1;13161:104:1;-1:-1:-1;;13371:3:1;13356:19;;13343:33;13385:35;13343:33;13385:35;:::i;:::-;13439:7;13429:17;;;13493:3;13482:9;13478:19;13465:33;13455:43;;12495:1009;;;;;;;;;;;:::o;13509:1301::-;;;;;;;;;;13791:3;13779:9;13770:7;13766:23;13762:33;13759:2;;;13813:6;13805;13798:22;13759:2;13857:9;13844:23;13876:33;13903:5;13876:33;:::i;:::-;13928:5;-1:-1:-1;13980:2:1;13965:18;;13952:32;;-1:-1:-1;14031:2:1;14016:18;;14003:32;;-1:-1:-1;14086:2:1;14071:18;;14058:32;14109:18;14139:14;;;14136:2;;;14171:6;14163;14156:22;14136:2;14215:76;14283:7;14274:6;14263:9;14259:22;14215:76;:::i;:::-;14310:8;;-1:-1:-1;14189:102:1;-1:-1:-1;14398:3:1;14383:19;;14370:33;;-1:-1:-1;14415:16:1;;;14412:2;;;14449:6;14441;14434:22;14412:2;;14493:78;14563:7;14552:8;14541:9;14537:24;14493:78;:::i;:::-;14590:8;;-1:-1:-1;14467:104:1;-1:-1:-1;;14677:3:1;14662:19;;14649:33;14691:35;14649:33;14691:35;:::i;:::-;14745:7;14735:17;;;14799:3;14788:9;14784:19;14771:33;14761:43;;13749:1061;;;;;;;;;;;:::o;14815:790::-;;;;;;;15020:3;15008:9;14999:7;14995:23;14991:33;14988:2;;;15042:6;15034;15027:22;14988:2;15079:9;15073:16;15098:33;15125:5;15098:33;:::i;:::-;15150:5;15140:15;;;15195:2;15184:9;15180:18;15174:25;15164:35;;15239:2;15228:9;15224:18;15218:25;15208:35;;15288:2;15277:9;15273:18;15267:25;15301:34;15327:7;15301:34;:::i;:::-;15406:3;15391:19;;15385:26;15354:7;;-1:-1:-1;15420:34:1;15385:26;15420:34;:::i;:::-;15525:3;15510:19;;15504:26;15473:7;;-1:-1:-1;15539:34:1;15504:26;15539:34;:::i;:::-;15592:7;15582:17;;;14978:627;;;;;;;;:::o;15610:754::-;;;;;;15788:3;15776:9;15767:7;15763:23;15759:33;15756:2;;;15810:6;15802;15795:22;15756:2;15854:9;15841:23;15873:33;15900:5;15873:33;:::i;:::-;15925:5;-1:-1:-1;15977:2:1;15962:18;;15949:32;;-1:-1:-1;16033:2:1;16018:18;;16005:32;16046:34;16005:32;16046:34;:::i;:::-;16099:7;-1:-1:-1;16158:2:1;16143:18;;16130:32;16171:34;16130:32;16171:34;:::i;:::-;16224:7;-1:-1:-1;16283:3:1;16268:19;;16255:33;16297:35;16255:33;16297:35;:::i;:::-;16351:7;16341:17;;;15746:618;;;;;;;;:::o;16369:943::-;;16495:2;16538;16526:9;16517:7;16513:23;16509:32;16506:2;;;16559:6;16551;16544:22;16506:2;16597:9;16591:16;16630:18;16622:6;16619:30;16616:2;;;16667:6;16659;16652:22;16616:2;16695:22;;16748:4;16740:13;;16736:27;-1:-1:-1;16726:2:1;;16782:6;16774;16767:22;16726:2;16816;16810:9;16839:65;16854:49;16900:2;16854:49;:::i;16839:65::-;16938:15;;;16969:12;;;;17001:11;;;17039;;;17031:20;;17027:29;;17024:42;-1:-1:-1;17021:2:1;;;17084:6;17076;17069:22;17021:2;17111:6;17102:15;;17126:156;17140:2;17137:1;17134:9;17126:156;;;17197:10;;17185:23;;17158:1;17151:9;;;;;17228:12;;;;17260;;17126:156;;;-1:-1:-1;17301:5:1;16475:837;-1:-1:-1;;;;;;;16475:837:1:o;17317:257::-;;17437:2;17425:9;17416:7;17412:23;17408:32;17405:2;;;17458:6;17450;17443:22;17405:2;17495:9;17489:16;17514:30;17538:5;17514:30;:::i;17579:1100::-;;;;;17808:2;17796:9;17787:7;17783:23;17779:32;17776:2;;;17829:6;17821;17814:22;17776:2;17873:9;17860:23;17892:33;17919:5;17892:33;:::i;:::-;17944:5;-1:-1:-1;18000:2:1;17985:18;;17972:32;18023:18;18053:14;;;18050:2;;;18085:6;18077;18070:22;18050:2;18113:22;;;;18169:3;18151:16;;;18147:26;18144:2;;;18191:6;18183;18176:22;18144:2;18219;;-1:-1:-1;18274:2:1;18259:18;;18246:32;;18290:16;;;18287:2;;;18324:6;18316;18309:22;18287:2;18367:8;18356:9;18352:24;18342:34;;18414:7;18407:4;18403:2;18399:13;18395:27;18385:2;;18441:6;18433;18426:22;18385:2;18486;18473:16;18512:2;18504:6;18501:14;18498:2;;;18533:6;18525;18518:22;18498:2;18583:7;18578:2;18569:6;18565:2;18561:15;18557:24;18554:37;18551:2;;;18609:6;18601;18594:22;18551:2;17766:913;;;;-1:-1:-1;;18645:2:1;18637:11;;-1:-1:-1;;;17766:913:1:o;18962:194::-;;19085:2;19073:9;19064:7;19060:23;19056:32;19053:2;;;19106:6;19098;19091:22;19053:2;-1:-1:-1;19134:16:1;;19043:113;-1:-1:-1;19043:113:1:o;19161:255::-;;;19301:2;19289:9;19280:7;19276:23;19272:32;19269:2;;;19322:6;19314;19307:22;19269:2;-1:-1:-1;;19350:16:1;;19406:2;19391:18;;;19385:25;19350:16;;19385:25;;-1:-1:-1;19259:157:1:o;19421:452::-;;19516:5;19510:12;19543:6;19538:3;19531:19;19569:4;19598:2;19593:3;19589:12;19582:19;;19635:2;19628:5;19624:14;19656:3;19668:180;19682:6;19679:1;19676:13;19668:180;;;19747:13;;19762:4;19743:24;19731:37;;19788:12;;;;19823:15;;;;19704:1;19697:9;19668:180;;;-1:-1:-1;19864:3:1;;19486:387;-1:-1:-1;;;;;19486:387:1:o;19878:318::-;;19959:5;19953:12;19986:6;19981:3;19974:19;20002:63;20058:6;20051:4;20046:3;20042:14;20035:4;20028:5;20024:16;20002:63;:::i;:::-;20110:2;20098:15;20115:66;20094:88;20085:98;;;;20185:4;20081:109;;19929:267;-1:-1:-1;;19929:267:1:o;20201:416::-;;20408:66;20400:6;20396:79;20391:3;20384:92;20519:6;20511;20507:1;20502:3;20498:11;20485:41;20549:16;;20567:1;20545:24;20578:15;;;20545:24;20374:243;-1:-1:-1;;20374:243:1:o;20622:274::-;;20789:6;20783:13;20805:53;20851:6;20846:3;20839:4;20831:6;20827:17;20805:53;:::i;:::-;20874:16;;;;;20759:137;-1:-1:-1;;20759:137:1:o;20901:773::-;;21320:6;21314:13;21336:53;21382:6;21377:3;21370:4;21362:6;21358:17;21336:53;:::i;:::-;21450:8;21411:16;;;21436:23;;;21484:13;;21506:65;21484:13;21558:1;21547:13;;21540:4;21528:17;;21506:65;:::i;:::-;21638:3;21634:1;21590:20;;;;21626:10;;;21619:23;21666:1;21658:10;;21290:384;-1:-1:-1;;;;21290:384:1:o;21679:775::-;;22098:6;22092:13;22114:53;22160:6;22155:3;22148:4;22140:6;22136:17;22114:53;:::i;:::-;22228:10;22189:16;;;22214:25;;;22264:13;;22286:65;22264:13;22338:1;22327:13;;22320:4;22308:17;;22286:65;:::i;:::-;22418:3;22414:1;22370:20;;;;22406:10;;;22399:23;22446:1;22438:10;;22068:386;-1:-1:-1;;;;22068:386:1:o;22459:773::-;;22878:6;22872:13;22894:53;22940:6;22935:3;22928:4;22920:6;22916:17;22894:53;:::i;:::-;23008:8;22969:16;;;22994:23;;;23042:13;;23064:65;23042:13;23116:1;23105:13;;23098:4;23086:17;;23064:65;:::i;23237:182::-;23366:19;;;23410:2;23401:12;;23356:63::o;23424:226::-;23600:42;23588:55;;;;23570:74;;23558:2;23543:18;;23525:125::o;23894:335::-;24086:42;24155:15;;;24137:34;;24207:15;;24202:2;24187:18;;24180:43;24064:2;24049:18;;24031:198::o;24234:709::-;24571:42;24640:15;;;24622:34;;24692:15;;;;24687:2;24672:18;;24665:43;24739:2;24724:18;;24717:34;;;;24782:2;24767:18;;24760:34;;;;24843:4;24831:17;24825:3;24810:19;;24803:46;24880:3;24865:19;;24858:35;24924:3;24909:19;;24902:35;;;;24548:3;24533:19;;24515:428::o;24948:406::-;25168:42;25237:15;;;25219:34;;25289:15;;;;25284:2;25269:18;;25262:43;25336:2;25321:18;;25314:34;;;;25146:2;25131:18;;25113:241::o;25359:668::-;25692:42;25761:15;;;25743:34;;25813:15;;;25808:2;25793:18;;25786:43;25865:15;;;25860:2;25845:18;;25838:43;25917:15;;25912:2;25897:18;;25890:43;25964:3;25949:19;;25942:35;;;;26008:3;25993:19;;25986:35;;;;25669:3;25654:19;;25636:391::o;26364:407::-;26576:42;26645:15;;;26627:34;;26697:15;;;26692:2;26677:18;;26670:43;26749:15;;;26744:2;26729:18;;26722:43;26554:2;26539:18;;26521:250::o;26776:1570::-;;27172:3;27161:9;27157:19;27195:42;27276:2;27268:6;27264:15;27253:9;27246:34;27299:2;27349;27341:6;27337:15;27332:2;27321:9;27317:18;27310:43;27401:2;27393:6;27389:15;27384:2;27373:9;27369:18;27362:43;27441:6;27436:2;27425:9;27421:18;27414:34;27485:3;27479;27468:9;27464:19;27457:32;27509:6;27539;27531;27524:22;27577:3;27566:9;27562:19;27555:26;;27604:6;27590:20;;27628:4;27641:262;27655:6;27652:1;27649:13;27641:262;;;27730:6;27717:20;27750:33;27777:5;27750:33;:::i;:::-;27808:14;;27796:27;;27878:15;;;;27843:12;;;;27677:1;27670:9;27641:262;;;-1:-1:-1;27940:19:1;;;27934:3;27919:19;;27912:48;27994:19;;;28031:12;;;-1:-1:-1;28068:6:1;;-1:-1:-1;28094:4:1;28107:211;28123:6;28118:3;28115:15;28107:211;;;28224:4;28194:28;28213:8;28194:28;:::i;:::-;28190:39;28176:54;;28252:14;;;;28291:17;;;;28149:1;28140:11;28107:211;;;-1:-1:-1;28335:5:1;;27133:1213;-1:-1:-1;;;;;;;;;;;;27133:1213:1:o;28351:1193::-;;28727:3;28716:9;28712:19;28750:42;28831:2;28823:6;28819:15;28808:9;28801:34;28854:2;28904;28896:6;28892:15;28887:2;28876:9;28872:18;28865:43;28956:2;28948:6;28944:15;28939:2;28928:9;28924:18;28917:43;28996:6;28991:2;28980:9;28976:18;28969:34;29040:3;29034;29023:9;29019:19;29012:32;29064:6;29099;29093:13;29130:6;29122;29115:22;29168:3;29157:9;29153:19;29146:26;;29207:2;29199:6;29195:15;29181:29;;29228:4;29241:178;29255:6;29252:1;29249:13;29241:178;;;29320:13;;29316:22;;29304:35;;29394:15;;;;29359:12;;;;29277:1;29270:9;29241:178;;;29245:3;;29465:9;29460:3;29456:19;29450:3;29439:9;29435:19;29428:48;29493:45;29534:3;29526:6;29493:45;:::i;:::-;29485:53;28688:856;-1:-1:-1;;;;;;;;;;;;28688:856:1:o;29549:486::-;29786:42;29855:15;;;29837:34;;29907:15;;;29902:2;29887:18;;29880:43;29959:15;;29954:2;29939:18;;29932:43;30023:4;30011:17;;;30006:2;29991:18;;29984:45;29763:3;29748:19;;29730:305::o;30443:513::-;30680:42;30749:15;;;30731:34;;30801:15;;;;30796:2;30781:18;;30774:43;30836:10;30882:15;;;30877:2;30862:18;;30855:43;30934:15;;;30929:2;30914:18;;30907:43;30657:3;30642:19;;30624:332::o;30961:297::-;31165:42;31153:55;;;;31135:74;;31240:2;31225:18;;31218:34;31123:2;31108:18;;31090:168::o;31263:398::-;31475:42;31544:15;;;31526:34;;31591:2;31576:18;;31569:34;;;;31639:15;;;31634:2;31619:18;;31612:43;31453:2;31438:18;;31420:241::o;31666:635::-;31837:2;31889:21;;;31959:13;;31862:18;;;31981:22;;;31666:635;;31837:2;32060:15;;;;32034:2;32019:18;;;31666:635;32106:169;32120:6;32117:1;32114:13;32106:169;;;32181:13;;32169:26;;32250:15;;;;32215:12;;;;32142:1;32135:9;32106:169;;;-1:-1:-1;32292:3:1;;31817:484;-1:-1:-1;;;;;;31817:484:1:o;32306:450::-;;32463:2;32452:9;32445:21;32502:6;32497:2;32486:9;32482:18;32475:34;32559:6;32551;32546:2;32535:9;32531:18;32518:48;32586:22;;;32610:2;32582:31;;;32575:45;;;;32672:2;32660:15;;;32677:66;32656:88;32641:104;32637:113;;32435:321;-1:-1:-1;32435:321:1:o;32761:221::-;;32910:2;32899:9;32892:21;32930:46;32972:2;32961:9;32957:18;32949:6;32930:46;:::i;32987:345::-;33189:2;33171:21;;;33228:2;33208:18;;;33201:30;33267:23;33262:2;33247:18;;33240:51;33323:2;33308:18;;33161:171::o;33337:355::-;33539:2;33521:21;;;33578:2;33558:18;;;33551:30;33617:33;33612:2;33597:18;;33590:61;33683:2;33668:18;;33511:181::o;33697:342::-;33899:2;33881:21;;;33938:2;33918:18;;;33911:30;33977:20;33972:2;33957:18;;33950:48;34030:2;34015:18;;33871:168::o;34044:402::-;34246:2;34228:21;;;34285:2;34265:18;;;34258:30;34324:34;34319:2;34304:18;;34297:62;34395:8;34390:2;34375:18;;34368:36;34436:3;34421:19;;34218:228::o;34451:344::-;34653:2;34635:21;;;34692:2;34672:18;;;34665:30;34731:22;34726:2;34711:18;;34704:50;34786:2;34771:18;;34625:170::o;34800:354::-;35002:2;34984:21;;;35041:2;35021:18;;;35014:30;35080:32;35075:2;35060:18;;35053:60;35145:2;35130:18;;34974:180::o;35159:353::-;35361:2;35343:21;;;35400:2;35380:18;;;35373:30;35439:31;35434:2;35419:18;;35412:59;35503:2;35488:18;;35333:179::o;35517:344::-;35719:2;35701:21;;;35758:2;35738:18;;;35731:30;35797:22;35792:2;35777:18;;35770:50;35852:2;35837:18;;35691:170::o;35866:341::-;36068:2;36050:21;;;36107:2;36087:18;;;36080:30;36146:19;36141:2;36126:18;;36119:47;36198:2;36183:18;;36040:167::o;36212:353::-;36414:2;36396:21;;;36453:2;36433:18;;;36426:30;36492:31;36487:2;36472:18;;36465:59;36556:2;36541:18;;36386:179::o;36570:351::-;36772:2;36754:21;;;36811:2;36791:18;;;36784:30;36850:29;36845:2;36830:18;;36823:57;36912:2;36897:18;;36744:177::o;36926:350::-;37128:2;37110:21;;;37167:2;37147:18;;;37140:30;37206:28;37201:2;37186:18;;37179:56;37267:2;37252:18;;37100:176::o;37281:356::-;37483:2;37465:21;;;37502:18;;;37495:30;37561:34;37556:2;37541:18;;37534:62;37628:2;37613:18;;37455:182::o;37642:339::-;37844:2;37826:21;;;37883:2;37863:18;;;37856:30;37922:17;37917:2;37902:18;;37895:45;37972:2;37957:18;;37816:165::o;37986:347::-;38188:2;38170:21;;;38227:2;38207:18;;;38200:30;38266:25;38261:2;38246:18;;38239:53;38324:2;38309:18;;38160:173::o;38338:345::-;38540:2;38522:21;;;38579:2;38559:18;;;38552:30;38618:23;38613:2;38598:18;;38591:51;38674:2;38659:18;;38512:171::o;38688:398::-;38890:2;38872:21;;;38929:2;38909:18;;;38902:30;38968:34;38963:2;38948:18;;38941:62;39039:4;39034:2;39019:18;;39012:32;39076:3;39061:19;;38862:224::o;39091:399::-;39293:2;39275:21;;;39332:2;39312:18;;;39305:30;39371:34;39366:2;39351:18;;39344:62;39442:5;39437:2;39422:18;;39415:33;39480:3;39465:19;;39265:225::o;39495:400::-;39697:2;39679:21;;;39736:2;39716:18;;;39709:30;39775:34;39770:2;39755:18;;39748:62;39846:6;39841:2;39826:18;;39819:34;39885:3;39870:19;;39669:226::o;39900:344::-;40102:2;40084:21;;;40141:2;40121:18;;;40114:30;40180:22;40175:2;40160:18;;40153:50;40235:2;40220:18;;40074:170::o;40431:248::-;40605:25;;;40661:2;40646:18;;40639:34;40593:2;40578:18;;40560:119::o;40684:483::-;;40915:6;40904:9;40897:25;40958:6;40953:2;40942:9;40938:18;40931:34;41013:42;41005:6;41001:55;40996:2;40985:9;40981:18;40974:83;41093:3;41088:2;41077:9;41073:18;41066:31;41114:47;41156:3;41145:9;41141:19;41133:6;41114:47;:::i;41172:319::-;41374:25;;;41430:2;41415:18;;41408:34;;;;41473:2;41458:18;;41451:34;41362:2;41347:18;;41329:162::o;41496:585::-;41777:25;;;41833:2;41818:18;;41811:34;;;;41876:2;41861:18;;41854:34;;;;41907:10;41953:15;;;41948:2;41933:18;;41926:43;42006:15;;;42000:3;41985:19;;41978:44;42059:15;42053:3;42038:19;;42031:44;41764:3;41749:19;;41731:350::o;42086:592::-;;;42229:11;42216:25;42319:66;42308:8;42292:14;42288:29;42284:102;42264:18;42260:127;42250:2;;42404:4;42398;42391:18;42250:2;42434:33;;42486:20;;;-1:-1:-1;42529:18:1;42518:30;;42515:2;;;42564:4;42558;42551:18;42515:2;42600:4;42588:17;;-1:-1:-1;42631:14:1;42627:27;;;42617:38;;42614:2;;;42668:1;42665;42658:12;42683:242;42753:2;42747:9;42783:17;;;42830:18;42815:34;;42851:22;;;42812:62;42809:2;;;42877:9;42809:2;42904;42897:22;42727:198;;-1:-1:-1;42727:198:1:o;42930:183::-;;43029:18;43021:6;43018:30;43015:2;;;43051:9;43015:2;-1:-1:-1;43102:4:1;43083:17;;;43079:28;;43005:108::o;43118:258::-;43190:1;43200:113;43214:6;43211:1;43208:13;43200:113;;;43290:11;;;43284:18;43271:11;;;43264:39;43236:2;43229:10;43200:113;;;43331:6;43328:1;43325:13;43322:2;;;-1:-1:-1;;43366:1:1;43348:16;;43341:27;43171:205::o;43381:156::-;43469:42;43462:5;43458:54;43451:5;43448:65;43438:2;;43527:1;43524;43517:12;43438:2;43428:109;:::o;43542:120::-;43630:5;43623:13;43616:21;43609:5;43606:32;43596:2;;43652:1;43649;43642:12;43667:123;43754:10;43747:5;43743:22;43736:5;43733:33;43723:2;;43780:1;43777;43770:12
Swarm Source
ipfs://3504e2f987379d590f55402ae272c2c2cddd1e941dc23c4e2e51b67a84d9f2cf
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.