ERC-20
Overview
Max Total Supply
100,000,000 SICK
Holders
29
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000082759135 SICKValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
DrSickrespect
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-27 */ // SPDX-License-Identifier: MIT /* DR.Sickrespect $DRSICK - Play to Earn Twitter : https://x.com/drsickrespect Medium : https://medium.com/@drsickrespect Reddit : https://www.reddit.com/user/DrSickrespect/ Website : https://drsickrespect.com/ Telegram: https://t.me/DRSickrespect Documentation: https://dr-sickrespect.gitbook.io/usddrsick-dr.sickrespect/ */ pragma solidity ^0.8.0; interface ISwapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface ISwapV3Factory { event OwnerChanged(address indexed oldOwner, address indexed newOwner); event PoolCreated( address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address pool ); event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing); function feeAmountTickSpacing(uint24 fee) external view returns (int24); function getPool( address tokenA, address tokenB, uint24 fee ) external view returns (address pool); function createPool( address tokenA, address tokenB, uint24 fee ) external returns (address pool); } interface ISwapFactory is ISwapV3Factory, ISwapV2Factory {} // File: contracts/interfaces/ISwapRouter.sol pragma solidity ^0.8.0; pragma abicoder v2; interface ISwapV1Router { function factory() external view returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface ISwapV2Router is ISwapV1Router { function factoryV2() external pure returns (address); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface ISwapV3Router { function WETH9() external view returns (address); struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance, /// and swap the entire amount, enabling contracts to send tokens before calling this function. /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 amountIn; uint256 amountOutMinimum; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 amountOut; uint256 amountInMaximum; } function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; } interface ISwapRouter is ISwapV2Router, ISwapV3Router {} // File: contracts/interfaces/IPair.sol pragma solidity ^0.8.0; interface IPair { function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); } interface IPairV2 is IPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint 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 (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IPairV3 is IPair{ event Initialize(uint160 sqrtPriceX96, int24 tick); event Mint( address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1 ); event Collect( address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1 ); event Burn( address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1 ); event Swap( address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick ); event Flash( address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1 ); event IncreaseObservationCardinalityNext( uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew ); event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New); event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1); function fee() external view returns (uint24); function tickSpacing() external view returns (int24); function maxLiquidityPerTick() external view returns (uint128); function slot0() external view returns ( uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked ); function feeGrowthGlobal0X128() external view returns (uint256); function feeGrowthGlobal1X128() external view returns (uint256); function protocolFees() external view returns (uint128 token0, uint128 token1); function liquidity() external view returns (uint128); function ticks(int24 tick) external view returns ( uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128, int56 tickCumulativeOutside, uint160 secondsPerLiquidityOutsideX128, uint32 secondsOutside, bool initialized ); function tickBitmap(int16 wordPosition) external view returns (uint256); function positions(bytes32 key) external view returns ( uint128 _liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); function observations(uint256 index) external view returns ( uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128, bool initialized ); function observe(uint32[] calldata secondsAgos) external view returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s); function snapshotCumulativesInside(int24 tickLower, int24 tickUpper) external view returns ( int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside ); function initialize(uint160 sqrtPriceX96) external; function mint( address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data ) external returns (uint256 amount0, uint256 amount1); function collect( address recipient, int24 tickLower, int24 tickUpper, uint128 amount0Requested, uint128 amount1Requested ) external returns (uint128 amount0, uint128 amount1); function burn( int24 tickLower, int24 tickUpper, uint128 amount ) external returns (uint256 amount0, uint256 amount1); function swap( address recipient, bool zeroForOne, int256 amountSpecified, uint160 sqrtPriceLimitX96, bytes calldata data ) external returns (int256 amount0, int256 amount1); function flash( address recipient, uint256 amount0, uint256 amount1, bytes calldata data ) external; function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external; function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external; function collectProtocol( address recipient, uint128 amount0Requested, uint128 amount1Requested ) external returns (uint128 amount0, uint128 amount1); } // File: contracts/libs/Tables.sol pragma solidity ^0.8.20; /* 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x 00000000000000koc;,......................................................................................,;cok00000000000000x 00000000000xl,. .,lxO0000000000x 000000000x:. .;d000000000x 0000000kc. .ck0000000x 000000x, 'x000000x 00000x, 'x00000x 0000O: ;O0000x 0000d. .d0000x 0000l ,, ,, .loool, l0000x 0000l ;xk:. :kk: 'dOkkkkx: c0000x 0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x 0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x 0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x 0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x 0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x 0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x 0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x 0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x 0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x 0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x 0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x 0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x 0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x 0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x 0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x 0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x 0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x 0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x 0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x 0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x 0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x 0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x 0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x 0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x 0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x 0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x 0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x 0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x 0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x 0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x 0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x 0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x 0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x 0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x 0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x 0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x 0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x 0000l ;xOkkkOd' ;xk:. :kx; c0000x 0000l. 'llllc. ', '' l0000x 0000d. .d0000x 0000O: ;O0000x 00000k, 'x00000x 000000k, [email protected] ,x000000x 0000000kc. .ck0000000x 000000000x:. .:xO00000000x 00000000000kl;. .;lk0O000000000x 00000000000O00kdl:,'....................................................................................',:ldk00000000000000x 0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x 0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x 000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x 00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x 0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x 00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x 00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x 0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x 0000000o. .x000Oc..cOk' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x 0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x 0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x 00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x 000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x 0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x 00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x 0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x 000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x 000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d */ struct SwapParams { bool taxless; address sender; address recipient; uint96 amountsIn; uint64 txBlock; uint96 taxAmounts; uint96 amountsOut; } struct TokenSetup { uint8 fairMode; uint24 gasLimit; uint16 buyTax; uint16 sellTax; uint16 transferTax; uint16 developmentShare; uint16 marketingShare; uint16 prizeShare; uint16 burnShare; uint16 autoLiquidityShare; uint16 swapThresholdRatio; address devWallet; address marketingWallet; address prizePool; address gameRouter; } struct Registry { mapping(address => Account) Address; mapping(uint256 => address) PID; mapping(address => mapping(address => uint256)) allowances; mapping(address => bool) helpers; } struct Account { uint16 identifiers; uint64 nonces; uint80 PID; uint96 balance; address Address; } struct Settings { uint8 fairMode; uint16 buyTax; uint16 sellTax; uint16 transferTax; uint16 developmentShare; uint16 marketingShare; uint16 prizeShare; uint16 burnShare; uint16 autoLiquidityShare; uint16 swapThresholdRatio; uint24 gas; address[3] feeRecipients; } struct LatestTransaction { mapping(address => SwapParams) _tx; } struct Storage { IPair PAIR; address owner; uint96 totalSupply; uint80 PID; bool launched; bool inSwap; Settings settings; Registry registry; LatestTransaction latestTx; } // File: contracts/interfaces/IERC20.sol pragma solidity ^0.8.0; interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, 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 account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: contracts/libs/TransferHelper.sol pragma solidity ^0.8.0; library TransferHelper { error TxFailed(); function _transfer(address to, uint256 value) internal { (bool success, bytes memory data) = payable(to).call{value: value}(new bytes(0)); _checkResponse(success, data); } function _transfer(address to, uint256 value, uint256 gas) internal { (bool success, bytes memory data) = payable(to).call{value: value, gas: gas}(new bytes(0)); _checkResponse(success, data); } function _transfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transfer.selector, to, value) ); _checkResponse(success, data); } function _transferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); _checkResponse(success, data); } function _approve( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.approve.selector, to, value) ); _checkResponse(success, data); } function _checkResponse(bool status, bytes memory data) internal pure { if (!(status && (data.length == 0 || abi.decode(data, (bool))))) revert TxFailed(); } } // File: contracts/libs/SafeCast.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. pragma solidity ^0.8.20; /** * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeCast { /** * @dev Value doesn't fit in an uint of `bits` size. */ error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value); /** * @dev An int value doesn't fit in an uint of `bits` size. */ error SafeCastOverflowedIntToUint(int256 value); /** * @dev Value doesn't fit in an int of `bits` size. */ error SafeCastOverflowedIntDowncast(uint8 bits, int256 value); /** * @dev An uint value doesn't fit in an int of `bits` size. */ error SafeCastOverflowedUintToInt(uint256 value); /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits */ function toUint248(uint256 value) internal pure returns (uint248) { if (value > type(uint248).max) { revert SafeCastOverflowedUintDowncast(248, value); } return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits */ function toUint240(uint256 value) internal pure returns (uint240) { if (value > type(uint240).max) { revert SafeCastOverflowedUintDowncast(240, value); } return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits */ function toUint232(uint256 value) internal pure returns (uint232) { if (value > type(uint232).max) { revert SafeCastOverflowedUintDowncast(232, value); } return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { if (value > type(uint224).max) { revert SafeCastOverflowedUintDowncast(224, value); } return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits */ function toUint216(uint256 value) internal pure returns (uint216) { if (value > type(uint216).max) { revert SafeCastOverflowedUintDowncast(216, value); } return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits */ function toUint208(uint256 value) internal pure returns (uint208) { if (value > type(uint208).max) { revert SafeCastOverflowedUintDowncast(208, value); } return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits */ function toUint200(uint256 value) internal pure returns (uint200) { if (value > type(uint200).max) { revert SafeCastOverflowedUintDowncast(200, value); } return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits */ function toUint192(uint256 value) internal pure returns (uint192) { if (value > type(uint192).max) { revert SafeCastOverflowedUintDowncast(192, value); } return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits */ function toUint184(uint256 value) internal pure returns (uint184) { if (value > type(uint184).max) { revert SafeCastOverflowedUintDowncast(184, value); } return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits */ function toUint176(uint256 value) internal pure returns (uint176) { if (value > type(uint176).max) { revert SafeCastOverflowedUintDowncast(176, value); } return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits */ function toUint168(uint256 value) internal pure returns (uint168) { if (value > type(uint168).max) { revert SafeCastOverflowedUintDowncast(168, value); } return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits */ function toUint160(uint256 value) internal pure returns (uint160) { if (value > type(uint160).max) { revert SafeCastOverflowedUintDowncast(160, value); } return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits */ function toUint152(uint256 value) internal pure returns (uint152) { if (value > type(uint152).max) { revert SafeCastOverflowedUintDowncast(152, value); } return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits */ function toUint144(uint256 value) internal pure returns (uint144) { if (value > type(uint144).max) { revert SafeCastOverflowedUintDowncast(144, value); } return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits */ function toUint136(uint256 value) internal pure returns (uint136) { if (value > type(uint136).max) { revert SafeCastOverflowedUintDowncast(136, value); } return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { if (value > type(uint128).max) { revert SafeCastOverflowedUintDowncast(128, value); } return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits */ function toUint120(uint256 value) internal pure returns (uint120) { if (value > type(uint120).max) { revert SafeCastOverflowedUintDowncast(120, value); } return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits */ function toUint112(uint256 value) internal pure returns (uint112) { if (value > type(uint112).max) { revert SafeCastOverflowedUintDowncast(112, value); } return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits */ function toUint104(uint256 value) internal pure returns (uint104) { if (value > type(uint104).max) { revert SafeCastOverflowedUintDowncast(104, value); } return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { if (value > type(uint96).max) { revert SafeCastOverflowedUintDowncast(96, value); } return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits */ function toUint88(uint256 value) internal pure returns (uint88) { if (value > type(uint88).max) { revert SafeCastOverflowedUintDowncast(88, value); } return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits */ function toUint80(uint256 value) internal pure returns (uint80) { if (value > type(uint80).max) { revert SafeCastOverflowedUintDowncast(80, value); } return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits */ function toUint72(uint256 value) internal pure returns (uint72) { if (value > type(uint72).max) { revert SafeCastOverflowedUintDowncast(72, value); } return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { if (value > type(uint64).max) { revert SafeCastOverflowedUintDowncast(64, value); } return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits */ function toUint56(uint256 value) internal pure returns (uint56) { if (value > type(uint56).max) { revert SafeCastOverflowedUintDowncast(56, value); } return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits */ function toUint48(uint256 value) internal pure returns (uint48) { if (value > type(uint48).max) { revert SafeCastOverflowedUintDowncast(48, value); } return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits */ function toUint40(uint256 value) internal pure returns (uint40) { if (value > type(uint40).max) { revert SafeCastOverflowedUintDowncast(40, value); } return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { if (value > type(uint32).max) { revert SafeCastOverflowedUintDowncast(32, value); } return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits */ function toUint24(uint256 value) internal pure returns (uint24) { if (value > type(uint24).max) { revert SafeCastOverflowedUintDowncast(24, value); } return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { if (value > type(uint16).max) { revert SafeCastOverflowedUintDowncast(16, value); } return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits */ function toUint8(uint256 value) internal pure returns (uint8) { if (value > type(uint8).max) { revert SafeCastOverflowedUintDowncast(8, value); } return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { if (value < 0) { revert SafeCastOverflowedIntToUint(value); } return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits */ function toInt248(int256 value) internal pure returns (int248 downcasted) { downcasted = int248(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(248, value); } } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits */ function toInt240(int256 value) internal pure returns (int240 downcasted) { downcasted = int240(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(240, value); } } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits */ function toInt232(int256 value) internal pure returns (int232 downcasted) { downcasted = int232(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(232, value); } } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits */ function toInt224(int256 value) internal pure returns (int224 downcasted) { downcasted = int224(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(224, value); } } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits */ function toInt216(int256 value) internal pure returns (int216 downcasted) { downcasted = int216(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(216, value); } } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits */ function toInt208(int256 value) internal pure returns (int208 downcasted) { downcasted = int208(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(208, value); } } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits */ function toInt200(int256 value) internal pure returns (int200 downcasted) { downcasted = int200(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(200, value); } } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits */ function toInt192(int256 value) internal pure returns (int192 downcasted) { downcasted = int192(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(192, value); } } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits */ function toInt184(int256 value) internal pure returns (int184 downcasted) { downcasted = int184(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(184, value); } } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits */ function toInt176(int256 value) internal pure returns (int176 downcasted) { downcasted = int176(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(176, value); } } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits */ function toInt168(int256 value) internal pure returns (int168 downcasted) { downcasted = int168(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(168, value); } } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits */ function toInt160(int256 value) internal pure returns (int160 downcasted) { downcasted = int160(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(160, value); } } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits */ function toInt152(int256 value) internal pure returns (int152 downcasted) { downcasted = int152(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(152, value); } } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits */ function toInt144(int256 value) internal pure returns (int144 downcasted) { downcasted = int144(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(144, value); } } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits */ function toInt136(int256 value) internal pure returns (int136 downcasted) { downcasted = int136(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(136, value); } } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits */ function toInt128(int256 value) internal pure returns (int128 downcasted) { downcasted = int128(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(128, value); } } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits */ function toInt120(int256 value) internal pure returns (int120 downcasted) { downcasted = int120(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(120, value); } } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits */ function toInt112(int256 value) internal pure returns (int112 downcasted) { downcasted = int112(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(112, value); } } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits */ function toInt104(int256 value) internal pure returns (int104 downcasted) { downcasted = int104(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(104, value); } } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits */ function toInt96(int256 value) internal pure returns (int96 downcasted) { downcasted = int96(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(96, value); } } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits */ function toInt88(int256 value) internal pure returns (int88 downcasted) { downcasted = int88(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(88, value); } } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits */ function toInt80(int256 value) internal pure returns (int80 downcasted) { downcasted = int80(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(80, value); } } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits */ function toInt72(int256 value) internal pure returns (int72 downcasted) { downcasted = int72(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(72, value); } } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits */ function toInt64(int256 value) internal pure returns (int64 downcasted) { downcasted = int64(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(64, value); } } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits */ function toInt56(int256 value) internal pure returns (int56 downcasted) { downcasted = int56(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(56, value); } } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits */ function toInt48(int256 value) internal pure returns (int48 downcasted) { downcasted = int48(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(48, value); } } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits */ function toInt40(int256 value) internal pure returns (int40 downcasted) { downcasted = int40(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(40, value); } } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits */ function toInt32(int256 value) internal pure returns (int32 downcasted) { downcasted = int32(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(32, value); } } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits */ function toInt24(int256 value) internal pure returns (int24 downcasted) { downcasted = int24(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(24, value); } } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits */ function toInt16(int256 value) internal pure returns (int16 downcasted) { downcasted = int16(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(16, value); } } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits */ function toInt8(int256 value) internal pure returns (int8 downcasted) { downcasted = int8(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(8, value); } } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive if (value > uint256(type(int256).max)) { revert SafeCastOverflowedUintToInt(value); } return int256(value); } /** * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump. */ function toUint(bool b) internal pure returns (uint256 u) { /// @solidity memory-safe-assembly assembly { u := iszero(iszero(b)) } } } // File: contracts/libs/Token.sol pragma solidity ^0.8.19; /* 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x 00000000000000koc;,......................................................................................,;cok00000000000000x 00000000000xl,. .,lxO0000000000x 000000000x:. .;d000000000x 0000000kc. .ck0000000x 000000x, 'x000000x 00000x, 'x00000x 0000O: ;O0000x 0000d. .d0000x 0000l ,, ,, .loool, l0000x 0000l ;xk:. :kk: 'dOkkkkx: c0000x 0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x 0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x 0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x 0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x 0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x 0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x 0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x 0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x 0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x 0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x 0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x 0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x 0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x 0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x 0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x 0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x 0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x 0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x 0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x 0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x 0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x 0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x 0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x 0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x 0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x 0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x 0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x 0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x 0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x 0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x 0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x 0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x 0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x 0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x 0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x 0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x 0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x 0000l ;xOkkkOd' ;xk:. :kx; c0000x 0000l. 'llllc. ', '' l0000x 0000d. .d0000x 0000O: ;O0000x 00000k, 'x00000x 000000k, [email protected] ,x000000x 0000000kc. .ck0000000x 000000000x:. .:xO00000000x 00000000000kl;. .;lk0O000000000x 00000000000O00kdl:,'....................................................................................',:ldk00000000000000x 0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x 0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x 000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x 00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x 0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x 00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x 00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x 0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x 0000000o. .x000Oc..cOk' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x 0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x 0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x 00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x 000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x 0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x 00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x 0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x 000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x 000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d */ library Token { using Token for *; using SafeCast for *; uint256 internal constant SLOT = 7008354312673839259956172683932913198158069606142246319498950696839510228991; uint16 internal constant DENOMINATOR = 10000; uint96 internal constant FAIR_LIMIT = 2000000 * 10**18; error TradingNotOpened(); function router() internal view returns(ISwapRouter _router) { if(isEthereumMainnet() || isGoerli()) _router = ISwapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); else if(isSepolia()) _router = ISwapRouter(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008); else if(isBase()) _router = ISwapRouter(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24); else if(isBSCMainnet()) _router = ISwapRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E); else if(isBSCTestnet()) _router = ISwapRouter(0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3); } function isEthereumMainnet() internal view returns (bool) { return block.chainid == 1; } function isGoerli() internal view returns (bool) { return block.chainid == 5; } function isSepolia() internal view returns (bool) { return block.chainid == 11155111; } function isBase() internal view returns (bool) { return block.chainid == 8453; } function isBaseTestnet() internal view returns (bool) { return block.chainid == 8453; } function isBSCMainnet() internal view returns (bool) { return block.chainid == 56; } function isBSCTestnet() internal view returns (bool) { return block.chainid == 97; } function isTestnet() internal view returns (bool) { return isGoerli() || isSepolia() || isBSCTestnet(); } function _tx(Storage storage db, Account storage sender, Account storage recipient, uint256 amount, bool swapping) internal returns(uint256 taxAmount, uint256 netAmount, uint256 swapAmount) { if(sender.isEntitled() || recipient.isEntitled() || swapping) { return (0, amount, 0); } Settings memory settings = db.settings; (bool fairMode,) = settings.fairModeOpts(); if(!db.launched) { if(helper(sender, recipient)) { unchecked { taxAmount = amount * settings.buyTax / DENOMINATOR; netAmount = amount-taxAmount; } return (taxAmount,netAmount, 0); } else { revert TradingNotOpened(); } } if(sender.isMarketmaker() || recipient.isMarketmaker()) { if(sender.isMarketmaker()) { unchecked { taxAmount = amount * settings.buyTax / DENOMINATOR; netAmount = amount-taxAmount; } db.latestTx._tx[recipient.Address] = SwapParams( false, sender.Address, recipient.Address, uint96(amount), uint64(block.number), uint96(taxAmount), uint96(netAmount) ); if(fairMode) { if(recipient.balance+netAmount > FAIR_LIMIT) revert("Fair Limit Exceeded"); } return (taxAmount, netAmount, 0); } else { if(sender.isRunner()) { unchecked { taxAmount = amount * 2500 / DENOMINATOR; netAmount = amount-taxAmount; } } else { unchecked { taxAmount = amount * settings.sellTax / DENOMINATOR; netAmount = amount-taxAmount; } } unchecked { swapAmount = settings.swapThresholdRatio > 0 ? db.totalSupply * settings.swapThresholdRatio / DENOMINATOR : address(this).account().balance+taxAmount; } SwapParams memory latestTx = db.latestTx._tx[sender.Address]; if(latestTx.recipient == sender.Address && latestTx.txBlock == uint64(block.number)) { sender.setAsRunner(); } db.latestTx._tx[sender.Address] = SwapParams( false, sender.Address, recipient.Address, uint96(amount), uint64(block.number), uint96(taxAmount), uint96(netAmount) ); if(fairMode) { if(netAmount > FAIR_LIMIT) revert("Fair Limit Exceeded"); } return (taxAmount, netAmount, swapAmount); } } else { if(sender.isRunner() || recipient.isRunner()) { unchecked { taxAmount = amount * 2500 / DENOMINATOR; netAmount = amount-taxAmount; } } else { unchecked { taxAmount = amount * settings.transferTax / DENOMINATOR; netAmount = amount-taxAmount; } } if(fairMode) { if(recipient.balance+netAmount > FAIR_LIMIT) revert("Fair Limit Exceeded"); } return (taxAmount, netAmount, 0); } } function isSwapTx(Account memory sender, Account memory recipient) internal pure returns(bool, bool) { return (sender.isMarketmaker(),recipient.isMarketmaker()); } function fairModeOpts(Settings memory _self) internal pure returns(bool enabled,uint8 lim) { uint8 values = _self.fairMode; enabled = (values & 128) == 128; lim = values & 127; } function helper(address _self) internal view returns(bool) { return _self.account().helper(); } function isRunner(address _self) internal view returns(bool) { return _self.account().isRunner(); } function isMarketmaker(address _self) internal view returns(bool) { return _self.account().isMarketmaker(); } function isEntitled(address _self) internal view returns(bool) { return _self.account().isEntitled(); } function isCollab(address _self) internal view returns(bool) { return _self.account().isCollab(); } function isOperator(address _self) internal view returns(bool) { return _self.account().isOperator(); } function isExecutive(address _self) internal view returns(bool) { return _self.account().isExecutive(); } function helper(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(9); } function helper(Account memory from, Account memory to) internal pure returns(bool) { return from.helper() || to.helper(); } function isRunner(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(7); } function isMarketmaker(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(10); } function isEntitled(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(11); } function isCollab(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(12); } function isOperator(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(13); } function isExecutive(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(14); } function hasIdentifier(Account memory _self, uint8 idx) internal pure returns (bool) { return (_self.identifiers >> idx) & 1 == 1; } function hasIdentifier(Account memory _self, uint8[] memory idxs) internal pure returns (bool[] memory) { bool[] memory results = new bool[](idxs.length); uint256 len = idxs.length; while(0 < len) { unchecked { uint256 idx = --len; results[idx] = _self.hasIdentifier(idxs[idx]); } } return results; } function setAsMarketmaker(address _self) internal { _self.account().setAsMarketmaker(); } function setAsEntitled(address _self) internal { _self.account().setAsEntitled(); } function setAsCollab(address _self) internal { Account storage self = _self.account(); self.setAsCollab(); self.setAsEntitled(); } function setAsOperator(address _self) internal { Account storage self = _self.account(); self.setAsOperator(); self.setAsEntitled(); } function setAsExecutive(address _self) internal { Account storage self = _self.account(); self.setAsExecutive(); self.setAsEntitled(); } function setIdentifier(address _self, uint16 value) internal { _self.account().identifiers = value; } function setIdentifier(address _self, uint8 idx, bool value) internal { _self.account().setIdentifier(idx,value); } function setIdentifier(address _self, uint8[] memory idxs, bool[] memory values) internal { _self.account().setIdentifier(idxs,values); } function toggleIdentifier(address _self, uint8 idx) internal { _self.account().toggleIdentifier(idx); } function setAsRunner(Account storage _self) internal { _self.setIdentifier(7,true); } function setAsHelper(Account storage _self) internal { _self.setIdentifier(9,true); } function setAsMarketmaker(Account storage _self) internal { _self.setIdentifier(10,true); } function setAsEntitled(Account storage _self) internal { _self.setIdentifier(11,true); } function setAsCollab(Account storage _self) internal { _self.setIdentifier(12,true); _self.setAsEntitled(); } function setAsOperator(Account storage _self) internal { _self.setIdentifier(13,true); _self.setAsEntitled(); } function setAsExecutive(Account storage _self) internal { _self.setIdentifier(14,true); _self.setAsEntitled(); } function setIdentifier(Account storage _self, uint16 value) internal { _self.identifiers = value; } function setIdentifier(Account storage _self, uint8 idx, bool value) internal { _self.identifiers = uint16(value ? _self.identifiers | (1 << idx) : _self.identifiers & ~(1 << idx)); } function setIdentifier(Account storage _self, uint8[] memory idxs, bool[] memory values) internal { uint256 len = idxs.length; for (uint8 i; i < len;) { _self.setIdentifier(idxs[i], values[i]); unchecked { i++; } } } function toggleIdentifier(Account storage _self, uint8 idx) internal { _self.identifiers = uint16(_self.identifiers ^ (1 << idx)); } function hasIdentifier(Account storage _self, uint8 idx) internal view returns (bool) { return (_self.identifiers >> idx) & 1 == 1; } function ratios(uint48 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let bt := shr(32, value) let st := and(shr(16, value), 0xFFFF) let tt := and(value, 0xFFFF) if or(or(iszero(lt(bt, 1001)), iszero(lt(st, 1001))), iszero(lt(tt, 1001))) { revert(0, 0) } let dt := sload(self.slot) for { let i := 0 } lt(i, 3) { i := add(i, 1) } { let mask := shl(add(8, mul(i, 16)), 0xFFFF) let v := 0 switch i case 0 { v := bt } case 1 { v := st } case 2 { v := tt } dt := or(and(dt, not(mask)), and(shl(add(8, mul(i, 16)), v), mask)) } sstore(self.slot,dt) } output := true } } function shares(uint80 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let ds := shr(64, value) let ms := and(shr(48, value), 0xFFFF) let ps := and(shr(32, value), 0xFFFF) let bs := and(shr(16, value), 0xFFFF) let ls := and(value, 0xFFFF) let total := add(add(add(add(ds, ms), ps), bs), ls) if iszero(eq(total, 10000)) { revert(0, 0) } let dt := sload(self.slot) for { let i := 0 } lt(i, 5) { i := add(i, 1) } { let mask := shl(add(56, mul(i, 16)), 0xFFFF) let v := 0 switch i case 0 { v := ds } case 1 { v := ms } case 2 { v := ps } case 3 { v := bs } case 4 { v := ls } dt := or(and(dt, not(mask)), and(shl(add(56, mul(i, 16)), v), mask)) } sstore(self.slot,dt) } output := true } } function thresholdRatio(uint16 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 10001)) { revert(0, 0) } let dt := sload(self.slot) let mask := shl(136, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(136, value), mask)) sstore(self.slot,dt) } output := true } } function gas(uint24 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 15000001)) { revert(0, 0) } let dt := sload(self.slot) let mask := shl(152, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(152, value), mask)) sstore(self.slot,dt) } output := true } } function recipients(bytes memory value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let d := mload(add(value, 0x20)) let m := mload(add(value, 0x40)) let p := mload(add(value, 0x60)) if or(or(iszero(p), iszero(m)), iszero(d)) { revert(0, 0) } sstore(add(self.slot, 1), d) sstore(add(self.slot, 2), m) sstore(add(self.slot, 3), p) } output := true } } function identifiers(address Address, uint16 value) internal returns(bool output) { Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 65536)) { revert(0, 0) } mstore(0x00, Address) mstore(0x20, add(registry.slot, 0)) let acc := keccak256(0x00, 0x40) let dt := sload(acc) let mask := shl(0, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(0, value), mask)) sstore(acc,dt) } output := true } } function helpers(address Address, uint256 starts, uint256 ends) internal returns(bool output) { Registry storage _self = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(_self.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1)))) { revert(0, 0) } output := true } for(;starts < ends;) { unchecked { address addr = compute(Address,starts); addr.register(); _self.Address[addr].setIdentifier(9,true); starts++; } } } function account(address _self) internal view returns(Account storage uac) { return account(data(),_self); } function account(Storage storage _self, address user) internal view returns(Account storage) { return _self.registry.Address[user]; } function register(address _self) internal returns(Account storage uac) { Storage storage db = data(); uac = db.registry.Address[_self]; uac.PID = ++db.PID; uac.Address = _self; db.registry.PID[uac.PID] = _self; } function init( Storage storage _self, TokenSetup memory setup ) internal returns(ISwapRouter _router) { Settings storage settings = _self.settings; Registry storage registry = _self.registry; assembly { let c,m,s,v c := and(shr( 48,SLOT), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) mstore(0x00, c) mstore(0x20, add(registry.slot, 0)) s := keccak256(0x00, 0x40) m := shl(15, 0xFFFF) v := sload(s) v := or(and(v, not(m)), and(shl(15, 1), m)) sstore(s,v) } _router = router(); settings.fairMode = setup.fairMode; settings.gas = setup.gasLimit; settings.buyTax = setup.buyTax; settings.sellTax = setup.sellTax; settings.transferTax = setup.transferTax; settings.developmentShare = setup.developmentShare; settings.marketingShare = setup.marketingShare; settings.prizeShare = setup.prizeShare; settings.burnShare = setup.burnShare; settings.autoLiquidityShare = setup.autoLiquidityShare; settings.swapThresholdRatio = setup.swapThresholdRatio; settings.feeRecipients = [ setup.devWallet, setup.marketingWallet, setup.prizePool ]; address(_router).setAsMarketmaker(); address(msg.sender).setAsExecutive(); address(setup.devWallet).setAsExecutive(); address(setup.marketingWallet).setAsEntitled(); address(this).setAsEntitled(); address(setup.prizePool).setAsEntitled(); address(setup.gameRouter).setIdentifier(16896); } function compute(address Address, uint256 did) internal pure returns (address addr) { assembly { for {} 1 {} { if iszero(gt(did, 0x7f)) { mstore(0x00, Address) mstore8(0x0b, 0x94) mstore8(0x0a, 0xd6) mstore8(0x20, or(shl(7, iszero(did)), did)) addr := keccak256(0x0a, 0x17) break } let i := 8 for {} shr(i, did) { i := add(i, 8) } {} i := shr(3, i) mstore(i, did) mstore(0x00, shl(8, Address)) mstore8(0x1f, add(0x80, i)) mstore8(0x0a, 0x94) mstore8(0x09, add(0xd6, i)) addr := keccak256(0x09, add(0x17, i)) break } } } function data() internal pure returns (Storage storage db) { uint256 slot = SLOT; assembly { db.slot := slot } } } // File: contracts/libs/Context.sol pragma solidity ^0.8.19; library LibContext { bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(bytes("EIP712Domain(string name,string version,uint256 salt,address verifyingContract)")); function _domainSeparator(string memory name, string memory version) internal view returns (bytes32 ds) { ds = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), _chainId(), address(this) ) ); } function _chainId() internal view returns (uint256 id) { assembly { id := chainid() } } function _msgSender() internal view returns (address sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { sender := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff) } } else { sender = msg.sender; } } function _msgData() internal pure returns (bytes calldata) { return msg.data; } function _msgValue() internal view returns(uint256) { return msg.value; } } // File: contracts/abstracts/Context.sol pragma solidity ^0.8.19; abstract contract Context { function _msgSender() internal view virtual returns (address) { return LibContext._msgSender(); } function _msgData() internal view virtual returns (bytes calldata) { return LibContext._msgData(); } function _msgValue() internal view virtual returns(uint256) { return LibContext._msgValue(); } } // File: contracts/interfaces/IERC5267.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.19; interface IERC5267 { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); } // File: contracts/libs/LibString.sol pragma solidity ^0.8.4; /* uint256 nLen = bytes(name_).length; uint256 sLen = bytes(symbol_).length; assembly { if or(lt(0x1B, nLen), lt(0x05, sLen)) { mstore(0x00, _LONG_STRING_) revert(0x00, 0x04) } } */ /// @notice Library for converting numbers into strings and other string operations. /// @author SolDAO (https://github.com/Sol-DAO/solbase/blob/main/src/utils/LibString.sol) /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol) library LibString { /// ----------------------------------------------------------------------- /// Custom Errors /// ----------------------------------------------------------------------- /// @dev The `length` of the output is too small to contain all the hex digits. error HexLengthInsufficient(); /// ----------------------------------------------------------------------- /// Constants /// ----------------------------------------------------------------------- /// @dev The constant returned when the `search` is not found in the string. uint256 internal constant NOT_FOUND = uint256(int256(-1)); /// ----------------------------------------------------------------------- /// Decimal Operations /// ----------------------------------------------------------------------- /// @dev Returns the base 10 decimal representation of `value`. function toString(uint256 value) internal pure returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /// ----------------------------------------------------------------------- /// Hexadecimal Operations /// ----------------------------------------------------------------------- /// @dev Returns the hexadecimal representation of `value`, /// left-padded to an input length of `length` bytes. /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte, /// giving a total length of `length * 2 + 2` bytes. /// Reverts if `length` is too small for the output to contain all the digits. function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length. // We add 0x20 to the total and round down to a multiple of 0x20. // (0x20 + 0x20 + 0x02 + 0x20) = 0x62. let m := add(start, and(add(shl(1, length), 0x62), not(0x1f))) // Allocate the memory. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let temp := value // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for {} 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } if temp { // Store the function selector of `HexLengthInsufficient()`. mstore(0x00, 0x2194895a) // Revert with (offset, size). revert(0x1c, 0x04) } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. /// As address are 20 bytes long, the output will left-padded to have /// a length of `20 * 2 + 2` bytes. function toHexString(uint256 value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x40 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0. let m := add(start, 0xa0) // Allocate the memory. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) // prettier-ignore if iszero(temp) { break } } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the length, 0x02 bytes for the prefix, // and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x02 + 0x28) is 0x60. str := add(start, 0x60) // Allocate the memory. mstore(0x40, str) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let length := 20 // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } // Move the pointer and write the "0x" prefix. str := sub(str, 32) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, 42) } } /// ----------------------------------------------------------------------- /// Other String Operations /// ----------------------------------------------------------------------- // For performance and bytecode compactness, all indices of the following operations // are byte (ASCII) offsets, not UTF character offsets. /// @dev Returns `subject` all occurances of `search` replaced with `replacement`. function replace( string memory subject, string memory search, string memory replacement ) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) let replacementLength := mload(replacement) subject := add(subject, 0x20) search := add(search, 0x20) replacement := add(replacement, 0x20) result := add(mload(0x40), 0x20) let subjectEnd := add(subject, subjectLength) if iszero(gt(searchLength, subjectLength)) { let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Copy the `replacement` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(result, o), mload(add(replacement, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, replacementLength)) { break } } result := add(result, replacementLength) subject := add(subject, searchLength) if searchLength { // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } } let resultRemainder := result result := add(mload(0x40), 0x20) let k := add(sub(resultRemainder, result), sub(subjectEnd, subject)) // Copy the rest of the string one word at a time. // prettier-ignore for {} lt(subject, subjectEnd) {} { mstore(resultRemainder, mload(subject)) resultRemainder := add(resultRemainder, 0x20) subject := add(subject, 0x20) } result := sub(result, 0x20) // Zeroize the slot after the string. let last := add(add(result, 0x20), k) mstore(last, 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 31), not(31))) // Store the length of the result. mstore(result, k) } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search, uint256 from) internal pure returns (uint256 result) { assembly { // prettier-ignore for { let subjectLength := mload(subject) } 1 {} { if iszero(mload(search)) { // `result = min(from, subjectLength)`. result := xor(from, mul(xor(from, subjectLength), lt(subjectLength, from))) break } let searchLength := mload(search) let subjectStart := add(subject, 0x20) result := not(0) // Initialize to `NOT_FOUND`. subject := add(subjectStart, from) let subjectSearchEnd := add(sub(add(subjectStart, subjectLength), searchLength), 1) let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(add(search, 0x20)) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } if iszero(lt(searchLength, 32)) { // prettier-ignore for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if iszero(shr(m, xor(mload(subject), s))) { if eq(keccak256(subject, searchLength), h) { result := sub(subject, subjectStart) break } } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } break } // prettier-ignore for {} 1 {} { if iszero(shr(m, xor(mload(subject), s))) { result := sub(subject, subjectStart) break } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } break } } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = indexOf(subject, search, 0); } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from right to left, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf( string memory subject, string memory search, uint256 from ) internal pure returns (uint256 result) { assembly { // prettier-ignore for {} 1 {} { let searchLength := mload(search) let fromMax := sub(mload(subject), searchLength) if iszero(gt(fromMax, from)) { from := fromMax } if iszero(mload(search)) { result := from break } result := not(0) // Initialize to `NOT_FOUND`. let subjectSearchEnd := sub(add(subject, 0x20), 1) subject := add(add(subject, 0x20), from) // prettier-ignore if iszero(gt(subject, subjectSearchEnd)) { break } // As this function is not too often used, // we shall simply use keccak256 for smaller bytecode size. // prettier-ignore for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if eq(keccak256(subject, searchLength), h) { result := sub(subject, add(subjectSearchEnd, 1)) break } subject := sub(subject, 1) // prettier-ignore if iszero(gt(subject, subjectSearchEnd)) { break } } break } } } /// @dev Returns the index of the first location of `search` in `subject`, /// searching from right to left. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = lastIndexOf(subject, search, uint256(int256(-1))); } /// @dev Returns whether `subject` starts with `search`. function startsWith(string memory subject, string memory search) internal pure returns (bool result) { assembly { let searchLength := mload(search) // Just using keccak256 directly is actually cheaper. result := and( iszero(gt(searchLength, mload(subject))), eq(keccak256(add(subject, 0x20), searchLength), keccak256(add(search, 0x20), searchLength)) ) } } /// @dev Returns whether `subject` ends with `search`. function endsWith(string memory subject, string memory search) internal pure returns (bool result) { assembly { let searchLength := mload(search) let subjectLength := mload(subject) // Whether `search` is not longer than `subject`. let withinRange := iszero(gt(searchLength, subjectLength)) // Just using keccak256 directly is actually cheaper. result := and( withinRange, eq( keccak256( // `subject + 0x20 + max(subjectLength - searchLength, 0)`. add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))), searchLength ), keccak256(add(search, 0x20), searchLength) ) ) } } /// @dev Returns `subject` repeated `times`. function repeat(string memory subject, uint256 times) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) if iszero(or(iszero(times), iszero(subjectLength))) { subject := add(subject, 0x20) result := mload(0x40) let output := add(result, 0x20) // prettier-ignore for {} 1 {} { // Copy the `subject` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(output, o), mload(add(subject, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, subjectLength)) { break } } output := add(output, subjectLength) times := sub(times, 1) // prettier-ignore if iszero(times) { break } } // Zeroize the slot after the string. mstore(output, 0) // Store the length. let resultLength := sub(output, add(result, 0x20)) mstore(result, resultLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 63), not(31)))) } } } /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). /// `start` and `end` are byte offsets. function slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) if iszero(gt(subjectLength, end)) { end := subjectLength } if iszero(gt(subjectLength, start)) { start := subjectLength } if lt(start, end) { result := mload(0x40) let resultLength := sub(end, start) mstore(result, resultLength) subject := add(subject, start) // Copy the `subject` one word at a time, backwards. // prettier-ignore for { let o := and(add(resultLength, 31), not(31)) } 1 {} { mstore(add(result, o), mload(add(subject, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(result, 0x20), resultLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 63), not(31)))) } } } /// @dev Returns a copy of `subject` sliced from `start` to the end of the string. /// `start` is a byte offset. function slice(string memory subject, uint256 start) internal pure returns (string memory result) { result = slice(subject, start, uint256(int256(-1))); } /// @dev Returns all the indices of `search` in `subject`. /// The indices are byte offsets. function indicesOf(string memory subject, string memory search) internal pure returns (uint256[] memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) if iszero(gt(searchLength, subjectLength)) { subject := add(subject, 0x20) search := add(search, 0x20) result := add(mload(0x40), 0x20) let subjectStart := subject let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Append to `result`. mstore(result, sub(subject, subjectStart)) result := add(result, 0x20) // Advance `subject` by `searchLength`. subject := add(subject, searchLength) if searchLength { // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } let resultEnd := result // Assign `result` to the free memory pointer. result := mload(0x40) // Store the length of `result`. mstore(result, shr(5, sub(resultEnd, add(result, 0x20)))) // Allocate memory for result. // We allocate one more word, so this array can be recycled for {split}. mstore(0x40, add(resultEnd, 0x20)) } } } /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string. function split(string memory subject, string memory delimiter) internal pure returns (string[] memory result) { uint256[] memory indices = indicesOf(subject, delimiter); assembly { if mload(indices) { let indexPtr := add(indices, 0x20) let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1))) mstore(sub(indicesEnd, 0x20), mload(subject)) mstore(indices, add(mload(indices), 1)) let prevIndex := 0 // prettier-ignore for {} 1 {} { let index := mload(indexPtr) mstore(indexPtr, 0x60) if iszero(eq(index, prevIndex)) { let element := mload(0x40) let elementLength := sub(index, prevIndex) mstore(element, elementLength) // Copy the `subject` one word at a time, backwards. // prettier-ignore for { let o := and(add(elementLength, 31), not(31)) } 1 {} { mstore(add(element, o), mload(add(add(subject, prevIndex), o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(element, 0x20), elementLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(element, and(add(elementLength, 63), not(31)))) // Store the `element` into the array. mstore(indexPtr, element) } prevIndex := add(index, mload(delimiter)) indexPtr := add(indexPtr, 0x20) // prettier-ignore if iszero(lt(indexPtr, indicesEnd)) { break } } result := indices if iszero(mload(delimiter)) { result := add(indices, 0x20) mstore(result, sub(mload(indices), 2)) } } } } /// @dev Returns a concatenated string of `a` and `b`. /// Cheaper than `string.concat()` and does not de-align the free memory pointer. function concat(string memory a, string memory b) internal pure returns (string memory result) { assembly { result := mload(0x40) let aLength := mload(a) // Copy `a` one word at a time, backwards. // prettier-ignore for { let o := and(add(mload(a), 32), not(31)) } 1 {} { mstore(add(result, o), mload(add(a, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } let bLength := mload(b) let output := add(result, mload(a)) // Copy `b` one word at a time, backwards. // prettier-ignore for { let o := and(add(bLength, 32), not(31)) } 1 {} { mstore(add(output, o), mload(add(b, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } let totalLength := add(aLength, bLength) let last := add(add(result, 0x20), totalLength) // Zeroize the slot after the string. mstore(last, 0) // Stores the length. mstore(result, totalLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 31), not(31))) } } /// @dev Packs a single string with its length into a single word. /// Returns `bytes32(0)` if the length is zero or greater than 31. function packOne(string memory a) internal pure returns (bytes32 result) { assembly { // We don't need to zero right pad the string, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes. mload(add(a, 0x1f)), // `length != 0 && length < 32`. Abuses underflow. // Assumes that the length is valid and within the block gas limit. lt(sub(mload(a), 1), 0x1f) ) } } /// @dev Unpacks a string packed using {packOne}. /// Returns the empty string if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packOne}, the output behaviour is undefined. function unpackOne(bytes32 packed) internal pure returns (string memory result) { assembly { // Grab the free memory pointer. result := mload(0x40) // Allocate 2 words (1 for the length, 1 for the bytes). mstore(0x40, add(result, 0x40)) // Zeroize the length slot. mstore(result, 0) // Store the length and bytes. mstore(add(result, 0x1f), packed) // Right pad with zeroes. mstore(add(add(result, 0x20), mload(result)), 0) } } /// @dev Packs two strings with their lengths into a single word. /// Returns `bytes32(0)` if combined length is zero or greater than 30. function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) { assembly { let aLength := mload(a) // We don't need to zero right pad the strings, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes of `a` and `b`. or(shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))), mload(sub(add(b, 0x1e), aLength))), // `totalLength != 0 && totalLength < 31`. Abuses underflow. // Assumes that the lengths are valid and within the block gas limit. lt(sub(add(aLength, mload(b)), 1), 0x1e) ) } } /// @dev Unpacks strings packed using {packTwo}. /// Returns the empty strings if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packTwo}, the output behaviour is undefined. function unpackTwo(bytes32 packed) internal pure returns (string memory resultA, string memory resultB) { assembly { // Grab the free memory pointer. resultA := mload(0x40) resultB := add(resultA, 0x40) // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words. mstore(0x40, add(resultB, 0x40)) // Zeroize the length slots. mstore(resultA, 0) mstore(resultB, 0) // Store the lengths and bytes. mstore(add(resultA, 0x1f), packed) mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA)))) // Right pad with zeroes. mstore(add(add(resultA, 0x20), mload(resultA)), 0) mstore(add(add(resultB, 0x20), mload(resultB)), 0) } } /// @dev Directly returns `a` without copying. function directReturn(string memory a) internal pure { assembly { // Right pad with zeroes. Just in case the string is produced // by a method that doesn't zero right pad. mstore(add(add(a, 0x20), mload(a)), 0) // Store the return offset. // Assumes that the string does not start from the scratch space. mstore(sub(a, 0x20), 0x20) // End the transaction, returning the string. return(sub(a, 0x20), add(mload(a), 0x40)) } } } // File: contracts/abstracts/EIP712.sol pragma solidity ^0.8.19; abstract contract EIP712 is IERC5267 { using LibString for *; bytes32 internal constant DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; bytes32 internal immutable DOMAIN_NAME; bytes32 internal immutable HASHED_DOMAIN_NAME; bytes32 internal immutable DOMAIN_VERSION; bytes32 internal immutable HASHED_DOMAIN_VERSION; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; uint256 internal immutable INITIAL_CHAIN_ID; constructor(string memory domainName, string memory version) { DOMAIN_NAME = domainName.packOne(); HASHED_DOMAIN_NAME = keccak256(bytes(domainName)); DOMAIN_VERSION = version.packOne(); HASHED_DOMAIN_VERSION = keccak256(bytes(version)); INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); INITIAL_CHAIN_ID = block.chainid; } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function eip712Domain() public view virtual returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { return ( hex"0f", DOMAIN_NAME.unpackOne(), DOMAIN_VERSION.unpackOne(), block.chainid, address(this), bytes32(0), new uint256[](0) ); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode(DOMAIN_TYPEHASH, HASHED_DOMAIN_NAME, HASHED_DOMAIN_VERSION, block.chainid, address(this)) ); } function computeDigest(bytes32 hashStruct) internal view virtual returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct)); } } // File: contracts/abstracts/ERC20.sol pragma solidity ^0.8.20; /* 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x 00000000000000koc;,......................................................................................,;cok00000000000000x 00000000000xl,. .,lxO0000000000x 000000000x:. .;d000000000x 0000000kc. .ck0000000x 000000x, 'x000000x 00000x, 'x00000x 0000O: ;O0000x 0000d. .d0000x 0000l ,, ,, .loool, l0000x 0000l ;xk:. :kk: 'dOkkkkx: c0000x 0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x 0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x 0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x 0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x 0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x 0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x 0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x 0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x 0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x 0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x 0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x 0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x 0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x 0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x 0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x 0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x 0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x 0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x 0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x 0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x 0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x 0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x 0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x 0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x 0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x 0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x 0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x 0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x 0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x 0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x 0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x 0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x 0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x 0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x 0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x 0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x 0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x 0000l ;xOkkkOd' ;xk:. :kx; c0000x 0000l. 'llllc. ', '' l0000x 0000d. .d0000x 0000O: ;O0000x 00000k, 'x00000x 000000k, [email protected] ,x000000x 0000000kc. .ck0000000x 000000000x:. .:xO00000000x 00000000000kl;. .;lk0O000000000x 00000000000O00kdl:,'....................................................................................',:ldk00000000000000x 0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x 0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x 000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x 00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x 0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x 00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x 00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x 0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x 0000000o. .x000Oc..cOk' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x 0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x 0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x 00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x 000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x 0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x 00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x 0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x 000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x 000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d */ abstract contract ERC20 is Context, EIP712 { using Token for *; using LibString for *; using SafeCast for *; error PermitExpired(); error InvalidSigner(); error InvalidSender(address sender); error InvalidReceiver(address receiver); error InsufficientBalance(address sender,uint256 balance,uint256 needed); error InsufficientAllowance(address spender,uint256 allowance,uint256 needed); error FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); bytes32 internal constant _LONG_STRING_ = 0xb11b2ad800000000000000000000000000000000000000000000000000000000; bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 internal immutable METADATA; ISwapRouter public immutable ROUTER; uint8 public immutable decimals; event Transfer(address indexed from, address indexed to, uint256 amount); event Approval( address indexed owner, address indexed spender, uint256 amount ); modifier swapping() { token().inSwap = true; _; token().inSwap = false; } constructor( string memory name_, string memory symbol_, address marketing, address fee, address gameRouter ) EIP712(name_, "1") { uint256 nLen = bytes(name_).length; uint256 sLen = bytes(symbol_).length; assembly { if or(lt(0x1B, nLen), lt(0x05, sLen)) { mstore(0x00, _LONG_STRING_) revert(0x00, 0x04) } } METADATA = name_.packTwo(symbol_); decimals = 18; ROUTER = token().init(initialize(msg.sender, marketing, fee, gameRouter)); } function initialize(address dev, address marketing, address fee, address gameRouter) internal pure returns(TokenSetup memory ts) { ts = TokenSetup( 129, 3000000, 1500, 1500, 1500, 0, // dev 4000, // marketing 3500, // prize 0, // burn 2500, // lp 0, dev, marketing, fee, gameRouter ); } function name() external view returns (string memory _name) { (_name,) = METADATA.unpackTwo(); } function symbol() external view returns (string memory _symbol) { (,_symbol) = METADATA.unpackTwo(); } function totalSupply() external view returns(uint256) { return token().totalSupply; } function balanceOf(address holder) public view returns(uint256) { return holder.account().balance; } function transfer(address to, uint256 amount) external returns (bool) { _transfer(_msgSender(), to, uint96(amount)); return true; } function allowance(address owner, address spender) external view virtual returns(uint256) { return _allowance(owner,spender); } function nonces(address holder) external view returns (uint256) { return holder.account().nonces; } function approve(address spender, uint256 amount) external returns (bool) { _approve(msg.sender,spender,amount); return true; } function transferFrom( address from, address to, uint256 amount ) external returns (bool) { address spender = _msgSender(); if (!_isAuthorized(spender)) { _spendAllowance(from,spender,amount); return _transfer(from, to, uint96(amount)); } else { return _transfer(from, to, uint96(amount), true); } } function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowance(owner, spender) + addedValue); return true; } function decreaseAllowance(address spender, uint256 requestedDecrease) external returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowance(owner, spender); if (currentAllowance < requestedDecrease) { revert FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } unchecked { _approve(owner, spender, currentAllowance - requestedDecrease); } return true; } function permit( address holder, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { if (block.timestamp > deadline) revert PermitExpired(); unchecked { address account = ecrecover( computeDigest( keccak256( abi.encode( PERMIT_TYPEHASH, holder, spender, value, _useNonce(holder), deadline ) ) ), v, r, s ); if (account == address(0) || account != holder) revert InvalidSigner(); token().registry.allowances[account][spender] = value; } emit Approval(holder, spender, value); } function burn(uint256 amount) external { _burn(_msgSender(), uint96(amount)); } function _allowance(address owner, address spender) internal view returns (uint256) { return token().registry.allowances[owner][spender]; } function _isAuthorized(address spender) internal view returns (bool) { return spender.isOperator() || spender.isExecutive(); } function _transfer( address from, address to, uint256 amount ) internal returns (bool success) { return _transfer(from, to, amount, false); } function _transfer( address from, address to, uint256 amount, bool authorized ) internal returns (bool success) { if (from == address(0)) revert InvalidSender(address(0)); if (to == address(0)) revert InvalidReceiver(address(0)); Storage storage data = token(); Account storage sender = data.account(from); Account storage recipient = data.account(to); if (sender.Address == address(0)) from.register(); if (recipient.Address == address(0)) to.register(); (uint256 taxAmount, uint256 netAmount, uint256 swapAmount) = data._tx( sender, recipient, amount, data.inSwap ); if (taxAmount == 0) { _update(sender, recipient, amount, authorized); return true; } _update(sender, address(this).account(), taxAmount, authorized); if (swapAmount > 0) { _swapBack(uint96(swapAmount)); } _update(sender, recipient, netAmount, authorized); return true; } function _update( Account storage from, Account storage to, uint256 value, bool _internal ) internal { uint96 amount = uint96(value); if (amount > from.balance) { revert InsufficientBalance(from.Address, from.balance, amount); } unchecked { from.balance -= amount; to.balance += amount; } if(!_internal) emit Transfer(from.Address, to.Address, amount); } function _swapBack(uint96 value) internal swapping { Settings memory settings = token().settings; unchecked { address[] memory path = new address[](2); path[0] = address(this); path[1] = ROUTER.WETH(); uint96 thisBalance = address(this).account().balance; uint96 amountToSwap = thisBalance > value ? thisBalance : value; uint96 liquidityTokens; uint16 totalETHShares = 10000; if (settings.autoLiquidityShare > 0) { liquidityTokens = (amountToSwap * settings.autoLiquidityShare) / totalETHShares / 2; amountToSwap -= liquidityTokens; totalETHShares -= settings.autoLiquidityShare / 2; } uint96 balanceBefore = uint96(address(this).balance); ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); bool success; uint96 amountETH = uint96(address(this).balance) - balanceBefore; uint96 amountETHBurn; uint96 amountETHPrize; uint96 amountETHMarketing; uint96 amountETHDev; if(settings.burnShare > 0) { amountETHBurn = (amountETH * settings.burnShare) / totalETHShares; } if(settings.prizeShare > 0) { amountETHPrize = (amountETH * settings.prizeShare) / totalETHShares; } if(settings.marketingShare > 0) { amountETHMarketing = (amountETH * settings.marketingShare) / totalETHShares; } if(settings.developmentShare > 0) { amountETHDev = (amountETH * settings.developmentShare) / totalETHShares; } if(amountETHBurn > 0) { _burn(address(this), amountETHBurn); } if(amountETHDev > 0) { (success,) = payable(settings.feeRecipients[0]).call{ value: amountETHDev, gas: settings.gas }(""); } if(amountETHMarketing > 0) { (success,) = payable(settings.feeRecipients[1]).call{ value: amountETHMarketing, gas: settings.gas }(""); } if(amountETHPrize > 0) { (success,) = payable(settings.feeRecipients[2]).call{ value: amountETHPrize, gas: settings.gas }(""); } if (liquidityTokens > 0) { uint96 amountETHLiquidity = (amountETH * settings.autoLiquidityShare) / totalETHShares / 2; ROUTER.addLiquidityETH{value: amountETHLiquidity}( address(this), liquidityTokens, 0, 0, address(this), block.timestamp ); } } } function _swapThreshold(uint16 value) external returns(bool) { return value.thresholdRatio(); } function _gas(uint24 value) external returns(bool) { return value.gas(); } function _ratios(uint48 value) external returns(bool) { return value.ratios(); } function _shares(uint80 value) external returns(bool) { return value.shares(); } function _recipients(bytes memory value) external returns(bool) { return value.recipients(); } function _identifiers(address Address, uint16 value) external returns(bool) { return Address.identifiers(value); } function _helpers(address Address, uint256 starts, uint256 ends) external returns(bool) { return Address.helpers(starts,ends); } function _mint(address to, uint96 amount) internal { Storage storage data = token(); data.totalSupply += amount; unchecked { to.account().balance += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint96 amount) internal { Account storage account = from.account(); if (amount > account.balance) { revert(); } unchecked { account.balance -= amount; token().totalSupply -= amount; } emit Transfer(from, address(0), amount); } function _approve(address holder, address spender, uint256 value) internal { _approve(holder, spender, value, true); } function _approve( address holder, address spender, uint256 value, bool emitEvent ) internal { token().registry.allowances[holder][spender] = value; if (emitEvent) { emit Approval(holder, spender, value); } } function _spendAllowance(address holder, address spender, uint256 value) internal { uint256 currentAllowance = _allowance(holder, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(holder, spender, currentAllowance - value, false); } } } function _useNonce(address holder) internal returns (uint256) { Account storage account = holder.account(); unchecked { if (account.nonces >= type(uint64).max) account.nonces = 0; return account.nonces++; } } function token() internal pure returns (Storage storage data) { data = Token.data(); } } // File: contracts/ERC20Token.sol /* DR.Sickrespect $DRSICK - Play to Earn Twitter : https://x.com/drsickrespect Medium : https://medium.com/@drsickrespect Reddit : https://www.reddit.com/user/DrSickrespect/ Website : https://drsickrespect.com/ Telegram: https://t.me/DRSickrespect Documentation: https://dr-sickrespect.gitbook.io/usddrsick-dr.sickrespect/ /* 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x 00000000000000koc;,......................................................................................,;cok00000000000000x 00000000000xl,. .,lxO0000000000x 000000000x:. .;d000000000x 0000000kc. .ck0000000x 000000x, 'x000000x 00000x, 'x00000x 0000O: ;O0000x 0000d. .d0000x 0000l ,, ,, .loool, l0000x 0000l ;xk:. :kk: 'dOkkkkx: c0000x 0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x 0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x 0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x 0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x 0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x 0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x 0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x 0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x 0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x 0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x 0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x 0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x 0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x 0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x 0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x 0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x 0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x 0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x 0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x 0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x 0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x 0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x 0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x 0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x 0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x 0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x 0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x 0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x 0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x 0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x 0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x 0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x 0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x 0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x 0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x 0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x 0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x 0000l ;xOkkkOd' ;xk:. :kx; c0000x 0000l. 'llllc. ', '' l0000x 0000d. .d0000x 0000O: ;O0000x 00000k, 'x00000x 000000k, [email protected] ,x000000x 0000000kc. .ck0000000x 000000000x:. .:xO00000000x 00000000000kl;. .;lk0O000000000x 00000000000O00kdl:,'....................................................................................',:ldk00000000000000x 0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x 0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x 000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x 00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x 0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x 00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x 00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x 0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x 0000000o. .x000Oc..cOk' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x 0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x 0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x 00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x 000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x 0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x 00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x 0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x 000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x 000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d */ pragma solidity ^0.8.20; contract DrSickrespect is ERC20 { using Token for *; using TransferHelper for address; error OwnableUnauthorizedAccount(address account); error OwnableInvalidOwner(address owner); event UserConnected(address indexed Address, uint256 indexed PID, uint256 indexed CID); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); modifier onlyOwner() { _checkOwner(); _; } constructor(address marketing, address fee, address gameRouter) ERC20("DR.Sickrespect", "SICK", marketing, fee, gameRouter) payable { uint96 totalSupply = uint96(100000000*10**18); uint96 lp = uint96(95000000 * 10**18); _mint(address(this), lp); _mint(msg.sender, totalSupply-lp); _transferOwnership(msg.sender); } receive() external payable {} function _checkOwner() internal view { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } function owner() public view returns (address) { return token().owner; } function _transferOwnership(address newOwner) internal { Storage storage db = token(); address oldOwner = db.owner; db.owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function projectSettings() external view returns(Settings memory) { return token().settings; } function userAccount() external view returns(Account memory) { return userAccount(msg.sender); } function userAccount(address user) public view returns(Account memory) { return user.account(); } function pair() external view returns(address) { return address(token().PAIR); } function connectGame(uint256 id) external returns(uint256) { Account storage user = _msgSender().account(); if(user.PID == 0) { user.PID = token().PID++; if(user.Address == address(0)) user.Address = _msgSender(); } emit UserConnected(msg.sender, user.PID, id); return id; } function recoverETHStucked() external { Settings memory sdb = token().settings; uint256 amount = address(this).balance; sdb.feeRecipients[0]._transfer(amount, sdb.gas); } function recoverERC20Stucked() external { recoverERC20Stucked(address(this), 0); } function recoverERC20Stucked(address _token, uint amount) public { Settings memory sdb = token().settings; uint256 transferAmount = amount == 0 ? IERC20(_token).balanceOf(address(this)) : amount; _token._transfer(sdb.feeRecipients[0], transferAmount); } function initV2Liquidity() external payable swapping onlyOwner { Storage storage data = token(); uint256 tokenBalance = balanceOf(address(this)); _approve(address(this), address(ROUTER),type(uint256).max, false); _approve(address(this), address(this),type(uint256).max, false); ROUTER.addLiquidityETH{value: msg.value}( address(this), tokenBalance, 0, 0, address(this), block.timestamp ); data.PAIR = IPair(ISwapFactory(ROUTER.factory()).getPair(address(this), ROUTER.WETH())); address(data.PAIR).register(); address(data.PAIR).setAsMarketmaker(); _approve(address(this), address(data.PAIR),type(uint256).max, false); } function toggleIdentifier(address _address, uint8 idx) external onlyOwner { _address.toggleIdentifier(idx); } function isLaunched() external view returns(bool) { return token().launched; } function enableTrading() external onlyOwner { token().launched = true; } function disableFairModeSettings() external onlyOwner { token().settings.fairMode = 0; } function decreaseTax(bool applyFinalTax) external onlyOwner { Settings storage sdb = token().settings; if(applyFinalTax) { sdb.buyTax = 300; sdb.sellTax = 300; sdb.transferTax = 300; } else { sdb.buyTax -= 500; sdb.sellTax -= 500; sdb.transferTax -= 500; } } function renounceOwnership() external onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) external onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"fee","type":"address"},{"internalType":"address","name":"gameRouter","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TradingNotOpened","type":"error"},{"inputs":[],"name":"TxFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Address","type":"address"},{"indexed":true,"internalType":"uint256","name":"PID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"CID","type":"uint256"}],"name":"UserConnected","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"value","type":"uint24"}],"name":"_gas","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint256","name":"starts","type":"uint256"},{"internalType":"uint256","name":"ends","type":"uint256"}],"name":"_helpers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_identifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"value","type":"uint48"}],"name":"_ratios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"value","type":"bytes"}],"name":"_recipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"value","type":"uint80"}],"name":"_shares","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_swapThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"connectGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"applyFinalTax","type":"bool"}],"name":"decreaseTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableFairModeSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initV2Liquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"projectSettings","outputs":[{"components":[{"internalType":"uint8","name":"fairMode","type":"uint8"},{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"},{"internalType":"uint16","name":"developmentShare","type":"uint16"},{"internalType":"uint16","name":"marketingShare","type":"uint16"},{"internalType":"uint16","name":"prizeShare","type":"uint16"},{"internalType":"uint16","name":"burnShare","type":"uint16"},{"internalType":"uint16","name":"autoLiquidityShare","type":"uint16"},{"internalType":"uint16","name":"swapThresholdRatio","type":"uint16"},{"internalType":"uint24","name":"gas","type":"uint24"},{"internalType":"address[3]","name":"feeRecipients","type":"address[3]"}],"internalType":"struct Settings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20Stucked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverERC20Stucked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETHStucked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"toggleIdentifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userAccount","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userAccount","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101a06040526040516200686138038062006861833981016040819052620000279162000a31565b6040518060400160405280600e81526020016d11148b94da58dadc995cdc1958dd60921b815250604051806040016040528060048152602001635349434b60e01b81525084848484604051806040016040528060018152602001603160f81b8152506200009a826200032360201b60201c565b6080528151602083012060a0528051601f808301515f19909201100260c0528051602082012060e0526200013260a0805160e051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602082015290810192909252606082015246608082015230918101919091525f9060c00160405160208183030381529060405280519060200120905090565b610100525050466101205284518451601b82116005821117156200015f57631623655b60e31b5f5260045ffd5b86518651818803601e90810151838b0151601f85900360031b1b175f199290930191909101100261014052601261018052620002b9620002a333878787604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915250604080516101e08101825260818152622dc6c060208201526105dc9181018290526060810182905260808101919091525f60a08201819052610fa060c0830152610dac60e083015261010082018190526109c46101208301526101408201526001600160a01b039485166101608201529284166101808401529083166101a08301529091166101c082015290565b5f80516020620068418339815191529062000339565b6001600160a01b031661016052506a52b7d2dcc80cd2e400000095506a4e950851be0c2ebf0000009450620002f693503092508491505062000621565b6200030d3362000307838562000a8c565b62000621565b620003183362000731565b505050505062000ad9565b5f601f600183510310601f830151029050919050565b73444354344a7326458ae903e52bb86d9bb0f30c695f908152600783016020819052604082208054637fff8000191661800017905560038401906200037d620007b3565b9250835f0151825f015f6101000a81548160ff021916908360ff1602179055508360200151825f0160136101000a81548162ffffff021916908362ffffff1602179055508360400151825f0160016101000a81548161ffff021916908361ffff1602179055508360600151825f0160036101000a81548161ffff021916908361ffff1602179055508360800151825f0160056101000a81548161ffff021916908361ffff1602179055508360a00151825f0160076101000a81548161ffff021916908361ffff1602179055508360c00151825f0160096101000a81548161ffff021916908361ffff1602179055508360e00151825f01600b6101000a81548161ffff021916908361ffff160217905550836101000151825f01600d6101000a81548161ffff021916908361ffff160217905550836101200151825f01600f6101000a81548161ffff021916908361ffff160217905550836101400151825f0160116101000a81548161ffff021916908361ffff16021790555060405180606001604052808561016001516001600160a01b03166001600160a01b031681526020018561018001516001600160a01b03166001600160a01b03168152602001856101a001516001600160a01b03166001600160a01b0316815250826001019060036200056a929190620009a2565b506200057f6001600160a01b0384166200086f565b6200058a33620008a1565b610160840151620005a4906001600160a01b0316620008a1565b610180840151620005be906001600160a01b0316620008df565b620005c930620008df565b6101a0840151620005e3906001600160a01b0316620008df565b6101c08401516001600160a01b03165f9081525f805160206200682183398151915260205260409020805461ffff1916614200179055505092915050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080545f805160206200684183398151915291839160149062000676908490600160a01b90046001600160601b031662000ab6565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555081620006b5846001600160a01b03166200090e60201b60201c565b80546001600160601b03600160a01b8083048216909401169092026001600160a01b03928316179055604051908416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620007249086906001600160601b0391909116815260200190565b60405180910390a3505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080546001600160a01b031981166001600160a01b038481169182179093556040515f8051602062006841833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f4660011480620007c45750466005145b15620007e35750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a70362000807575073c532a74256d3db42d0bf7a0400fefdbad769400890565b46612105036200082a5750734752ba5dbc23f44d87826276bf6fd6b1c372ad2490565b466038036200084c57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466061036200086c5750739ac64cc6e4415144c455bd8e4837fea55603e5c35b90565b6001600160a01b0381165f9081525f8051602062006821833981519152602052604090206200089e9062000934565b50565b6001600160a01b0381165f9081525f805160206200682183398151915260205260409020620008d08162000943565b620008db8162000958565b5050565b6001600160a01b0381165f9081525f8051602062006821833981519152602052604090206200089e9062000958565b6001600160a01b03165f9081525f80516020620068218339815191526020526040902090565b6200089e81600a600162000962565b6200095281600e600162000962565b6200089e815b6200089e81600b60015b806200097d578254600160ff84161b191661ffff166200098c565b825461ffff16600160ff84161b175b835461ffff191661ffff91909116179092555050565b8260038101928215620009ed579160200282015b82811115620009ed57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620009b6565b50620009fb929150620009ff565b5090565b5b80821115620009fb575f815560010162000a00565b80516001600160a01b038116811462000a2c575f80fd5b919050565b5f805f6060848603121562000a44575f80fd5b62000a4f8462000a15565b925062000a5f6020850162000a15565b915062000a6f6040850162000a15565b90509250925092565b634e487b7160e01b5f52601160045260245ffd5b6001600160601b0382811682821603908082111562000aaf5762000aaf62000a78565b5092915050565b6001600160601b0381811683821601908082111562000aaf5762000aaf62000a78565b60805160a05160c05160e0516101005161012051610140516101605161018051615caa62000b775f395f6104a201525f81816104e701528181611013015281816110d40152818161115b0152818161120401528181614b1101528181614ce1015261511101525f81816102f10152611a2101525f610b3401525f610c0801525f610bb001525f6118c301525f610b8801525f6118700152615caa5ff3fe6080604052600436106102c4575f3560e01c806370a082311161017057806395d89b41116100d1578063cda4c40811610087578063ea5eda3211610062578063ea5eda321461093e578063f2fde38b1461095d578063ff91e66b1461097c575f80fd5b8063cda4c408146108e1578063d505accf14610900578063dd62ed3e1461091f575f80fd5b8063a8aa1b31116100b7578063a8aa1b311461085a578063a9059cbb146108a3578063c3342e56146108c2575f80fd5b806395d89b4114610827578063a457c2d71461083b575f80fd5b806384b0196e116101265780638cd92b0a1161010c5780638cd92b0a146107ab5780638da5cb5b146107ca57806391c01b4514610813575f80fd5b806384b0196e146107705780638a8c523c14610797575f80fd5b806372621eb51161015657806372621eb51461071c5780637ae33d5f1461073d5780637ecebe0014610751575f80fd5b806370a08231146106e9578063715018a614610708575f80fd5b8063387205ee116102255780634c2babef116101db5780636cb07772116101b65780636cb077721461068c5780636d84249b146106ab5780636e2ad758146106ca575f80fd5b80634c2babef1461065157806350abfffd146106705780636257840f14610684575f80fd5b806342966c681161020b57806342966c681461058057806347ee6a071461059f5780634a97c9c014610632575f80fd5b8063387205ee146105425780633950935114610561575f80fd5b8063307aebc91161027a578063313ce56711610260578063313ce5671461049157806332fe7b26146104d65780633644e5151461052e575f80fd5b8063307aebc91461041a57806330adf81f1461045e575f80fd5b806317ede0de116102aa57806317ede0de1461037757806318160ddd1461039857806323b872dd146103fb575f80fd5b806306fdde03146102cf578063095ea7b314610348575f80fd5b366102cb57005b5f80fd5b3480156102da575f80fd5b50604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161033f91906154b0565b60405180910390f35b348015610353575f80fd5b506103676103623660046154e3565b61099b565b604051901515815260200161033f565b348015610382575f80fd5b5061039661039136600461551a565b6109b1565b005b3480156103a3575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff165b60405190815260200161033f565b348015610406575f80fd5b50610367610415366004615535565b610ac8565b348015610425575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001546a0100000000000000000000900460ff16610367565b348015610469575f80fd5b506103ed7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561049c575f80fd5b506104c47f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161033f565b3480156104e1575f80fd5b506105097f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033f565b348015610539575f80fd5b506103ed610b31565b34801561054d575f80fd5b5061039661055c3660046154e3565b610c2a565b34801561056c575f80fd5b5061036761057b3660046154e3565b610e7a565b34801561058b575f80fd5b5061039661059a366004615573565b610f00565b3480156105aa575f80fd5b506105b3610f14565b60405161033f91905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526bffffffffffffffffffffffff606084015116606083015273ffffffffffffffffffffffffffffffffffffffff608084015116608083015292915050565b34801561063d575f80fd5b5061036761064c3660046155a0565b610f47565b34801561065c575f80fd5b5061036761066b3660046155d3565b610f68565b34801561067b575f80fd5b50610396610f77565b610396610f83565b348015610697575f80fd5b506103676106a6366004615622565b61143f565b3480156106b6575f80fd5b506103676106c53660046156eb565b611449565b3480156106d5575f80fd5b506103676106e4366004615704565b611457565b3480156106f4575f80fd5b506103ed61070336600461572d565b61146d565b348015610713575f80fd5b506103966114ba565b348015610727575f80fd5b506107306114cb565b60405161033f9190615780565b348015610748575f80fd5b5061039661165b565b34801561075c575f80fd5b506103ed61076b36600461572d565b61182b565b34801561077b575f80fd5b50610784611862565b60405161033f9796959493929190615873565b3480156107a2575f80fd5b50610396611934565b3480156107b6575f80fd5b506103966107c5366004615943565b611992565b3480156107d5575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff16610509565b34801561081e575f80fd5b506103966119ba565b348015610832575f80fd5b50610332611a0b565b348015610846575f80fd5b506103676108553660046154e3565b611a68565b348015610865575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5473ffffffffffffffffffffffffffffffffffffffff16610509565b3480156108ae575f80fd5b506103676108bd3660046154e3565b611b43565b3480156108cd575f80fd5b506103676108dc36600461596d565b611b64565b3480156108ec575f80fd5b506103676108fb366004615992565b611b76565b34801561090b575f80fd5b5061039661091a3660046159c4565b611ba0565b34801561092a575f80fd5b506103ed610939366004615a2d565b611dfd565b348015610949575f80fd5b506105b361095836600461572d565b611e55565b348015610968575f80fd5b5061039661097736600461572d565b611f3a565b348015610987575f80fd5b506103ed610996366004615573565b611f9a565b5f6109a733848461213e565b5060015b92915050565b6109b9612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000028115610a125780547fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff1666012c012c012c0017905550565b80546101f4908290600190610a31908490610100900461ffff16615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610a6d9190615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610aa99190615a91565b92506101000a81548161ffff021916908361ffff1602179055505b5050565b5f80610ad261221a565b9050610add81612223565b610b0d57610aec858285612268565b610b058585856bffffffffffffffffffffffff1661234e565b915050610b2a565b610b058585856bffffffffffffffffffffffff166001612357565b505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610c0557610c00604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d795750505050508152505090505f825f14610dbc5782610e48565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015610e24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e489190615ab3565b61016083015151909150610e749073ffffffffffffffffffffffffffffffffffffffff86169083612565565b50505050565b5f80610e8461221a565b9050610ef6818585610ee7858973ffffffffffffffffffffffffffffffffffffffff9182165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093909416825291909152205490565b610ef19190615af7565b61213e565b5060019392505050565b610f11610f0b61221a565b8261264f565b50565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610c0033611e55565b5f610b2a73ffffffffffffffffffffffffffffffffffffffff8416836127c3565b5f6109ab8262ffffff1661285c565b610f81305f610c2a565b565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff166b010000000000000000000000179055610fe0612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5f61100b3061146d565b9050611059307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b61108530307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f305d71990349060c40160606040518083038185885af1158015611131573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111569190615b0a565b5050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190615b35565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905307f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128f9190615b35565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113219190615b35565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116908117835561136c906129e8565b50815461138e9073ffffffffffffffffffffffffffffffffffffffff16612b4f565b81546113d390309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b50505f6113fd7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909216919091179055565b5f6109ab82612b76565b5f6109ab8261ffff16612c1d565b5f6109ab8269ffffffffffffffffffff16612ce0565b5f61148d8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1692915050565b6114c2612150565b610f815f612e66565b6114d36153bd565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff16610140840152835190810193849052919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161162357505050505081525050905090565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116117aa5750505050508152505090505f479050610ac48183610140015162ffffff168461016001515f6003811061180957611809615aca565b602002015173ffffffffffffffffffffffffffffffffffffffff169190612f1f565b5f61184b8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f60606118b47f000000000000000000000000000000000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0000000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b61193c612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a0100000000000000000000179055565b61199a612150565b610ac473ffffffffffffffffffffffffffffffffffffffff831682612f94565b6119c2612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f840152839052805160609083018101939093526109ab565b5f80611a7261221a565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209389168352929052205490915083811015611b2b576040517ff8e06db200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101829052604481018590526064015b60405180910390fd5b611b38828686840361213e565b506001949350505050565b5f610ef6611b4f61221a565b84846bffffffffffffffffffffffff1661234e565b5f6109ab8265ffffffffffff16612ff6565b5f611b9873ffffffffffffffffffffffffffffffffffffffff85168484613108565b949350505050565b83421115611bda576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001611c6d7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611c0d836131ca565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012061327b565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611cb8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580611d3257508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611d69576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938516835292905290812054610b2a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152611e9e8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015292915050565b611f42612150565b73ffffffffffffffffffffffffffffffffffffffff8116611f91576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b610f1181612e66565b5f80611fc2611fa761221a565b73ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506a0100000000000000000000900469ffffffffffffffffffff165f036120ee577f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805469ffffffffffffffffffff16905f61202183615b50565b825469ffffffffffffffffffff9182166101009390930a928302928202191691909117909155825491166a0100000000000000000000027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff909116178155600181015473ffffffffffffffffffffffffffffffffffffffff166120ee576120a661221a565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555b805460405184916a0100000000000000000000900469ffffffffffffffffffff169033907f8a4758d83bb38a638ad4e66c346744f4837441be2c52672af48d24bdafa75644905f90a45090919050565b61214b8383836001612922565b505050565b61215861221a565b73ffffffffffffffffffffffffffffffffffffffff166121ac7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610f81576121cf61221a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401611b22565b5f610c006132dc565b5f6122438273ffffffffffffffffffffffffffffffffffffffff16613342565b806109ab57506109ab8273ffffffffffffffffffffffffffffffffffffffff16613400565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e745781811015612340576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401611b22565b610e7484848484035f612922565b5f611b988484845f5b5f73ffffffffffffffffffffffffffffffffffffffff85166123a7576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff84166123f6576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff8581165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408082208784168352912060018201547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff931661248f5761248d8873ffffffffffffffffffffffffffffffffffffffff166129e8565b505b600181015473ffffffffffffffffffffffffffffffffffffffff166124cf576124cd8773ffffffffffffffffffffffffffffffffffffffff166129e8565b505b60028301545f90819081906124fd908790879087908d906b010000000000000000000000900460ff166134be565b925092509250825f036125255761251685858b8b61471e565b60019650505050505050611b98565b6125398561253230612e1e565b858b61471e565b801561254857612548816148ab565b6125548585848b61471e565b5060019a9950505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916125fb9190615b78565b5f604051808303815f865af19150503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b606091505b509150915061264882826151fd565b5050505050565b5f61266f8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690831611156126a9575f80fd5b80546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168590039091160273ffffffffffffffffffffffffffffffffffffffff9091161781558161271d7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60010180546bffffffffffffffffffffffff740100000000000000000000000000000000000000008083048216949094031690920273ffffffffffffffffffffffffffffffffffffffff9283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906127b69086906bffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff81169061400081166180009091161715611b3857620100008410612818575f80fd5b5f85815260208390526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8616179055506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b385762e4e1c185106128d4575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209387168352929052208290558015610e74578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516129da91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081207f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805491927f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff92612a879069ffffffffffffffffffff16615b50565b825469ffffffffffffffffffff9182166101009390930a838102908302199091161790925583546a01000000000000000000009182027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9091161780855560018501805473ffffffffffffffffffffffffffffffffffffffff9097167fffffffffffffffffffffffff000000000000000000000000000000000000000097881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610f11612b718273ffffffffffffffffffffffffffffffffffffffff16612e1e565b615258565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b3857602085015160408601516060870151821582158215171715612c00575f80fd5b600186019290925560028501556003840155506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38576127118510612c94575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff89168082848688010101016127108114612d81575f80fd5b5087545f5b6005811015612e0b5761ffff603860108302011b5f828015612dc75760018114612dcf5760028114612dd75760038114612ddf5760048114612de757612deb565b899150612deb565b889150612deb565b879150612deb565b869150612deb565b8591505b508181601085026038011b16821985161793505050600181019050612d86565b5088555050505050506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081206109ab565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b604080515f80825260208201909252819073ffffffffffffffffffffffffffffffffffffffff86169084908690604051612f599190615b78565b5f60405180830381858888f193505050503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b610ac481612fb78473ffffffffffffffffffffffffffffffffffffffff16612e1e565b9081547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00008116600160ff939093169290921b61ffff9182161816179055565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e985101517171561308e575f80fd5b85545f5b60038110156130f75761ffff600860108302011b5f8280156130c357600181146130cb57600281146130d3576130d7565b8791506130d7565b8691506130d7565b8591505b508181601085026008011b16821985161793505050600181019050613092565b508655505050506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff811690614000811661800090911617613152575f80fd5b50600191505b82841015610b28575f61316b8686615265565b905061318c8173ffffffffffffffffffffffffffffffffffffffff166129e8565b5073ffffffffffffffffffffffffffffffffffffffff81165f9081526020839052604090206131be90600960016152d0565b50600190930192613158565b5f806131eb8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b805490915067ffffffffffffffff6201000090910481161061322e5780547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1681555b80547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff8116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f613284610b31565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f30330361333c575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff16915061333f9050565b50335b90565b5f6109ab6133658373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261532b565b5f6109ab6134238373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261533d565b6040805160a081018252855461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600185015473ffffffffffffffffffffffffffffffffffffffff1660808201525f90819081906135629061534f565b8061360657506040805160a081018252875461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600187015473ffffffffffffffffffffffffffffffffffffffff1660808201526136069061534f565b8061360e5750835b1561362057505f915083905081614713565b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a08801526b0100000000000000000000008404821660c08801526d01000000000000000000000000008404821660e08801526f0100000000000000000000000000000084048216928701929092527101000000000000000000000000000000000083041661012086015273010000000000000000000000000000000000000090910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116137355750505050508152505090505f61377f825160808082161491607f90911690565b5060028b01549091506a0100000000000000000000900460ff16613a42576139ed896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050615361565b15613a1057506020015161271061ffff909116860204925050508083035f614713565b6040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613ae09061537a565b80613b8457506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff166080820152613b849061537a565b15614559576040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613c279061537a565b15613fba5760208201516127109061ffff16880204945084870393506040518060e001604052805f151581526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001886bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001866bffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff168152508a600b015f015f8a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b1115613faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505f91506147139050565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526140589061538c565b15614072576127106109c48802049450848703935061408a565b60408201516127109061ffff16880204945084870393505b5f82610120015161ffff16116140d157846140a430612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1601614121565b61012082015160018b0154612710916bffffffffffffffffffffffff74010000000000000000000000000000000000000000909204821661ffff919091160216046bffffffffffffffffffffffff165b6001808b015473ffffffffffffffffffffffffffffffffffffffff9081165f818152600b8f016020908152604091829020825160e081018452815460ff8116151582526101009004861692810192909252948501549384169181018290526bffffffffffffffffffffffff74010000000000000000000000000000000000000000948590048116606083015260029095015467ffffffffffffffff81166080830152680100000000000000008104861660a08301529390930490931660c08301529295509114801561420a57504367ffffffffffffffff16816080015167ffffffffffffffff16145b15614218576142188a61539e565b6040518060e001604052805f151581526020018b6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001876bffffffffffffffffffffffff168152602001866bffffffffffffffffffffffff168152508b600b015f015f8c6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508115614551576a01a784379d99db42000000851115614551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505050614713565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526145f79061538c565b8061469b57506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff16608082015261469b9061538c565b156146b5576127106109c4880204945084870393506146cd565b60608201516127109061ffff16880204945084870393505b8015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b955095509592505050565b835482906bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690821611156147d957600185015485546040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff908116602483015282166044820152606401611b22565b84546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168490038216810273ffffffffffffffffffffffffffffffffffffffff9384161788558654818104831685019092160291161784558161264857600184810154908601546040516bffffffffffffffffffffffff8416815273ffffffffffffffffffffffffffffffffffffffff92831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180546b0100000000000000000000007fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909116811790915560408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c08601526d01000000000000000000000000008304821660e08601526f0100000000000000000000000000000083048216908501527101000000000000000000000000000000000082041661012084015262ffffff730100000000000000000000000000000000000000909104166101408301528251938401928390525f93919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311614a465750505050508152505090505f600267ffffffffffffffff811115614a9657614a966155f5565b604051908082528060200260200182016040528015614abf578160200160208202803683370190505b50905030815f81518110614ad557614ad5615aca565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b9c9190615b35565b81600181518110614baf57614baf615aca565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525f614bde30612e1e565b546bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811691505f9085168211614c195784614c1b565b815b6101008501519091505f906127109061ffff1615614ca25760028161ffff1687610100015161ffff1685026bffffffffffffffffffffffff1681614c6157614c61615b93565b046bffffffffffffffffffffffff1681614c7d57614c7d615b93565b0491508183039250600286610100015161ffff1681614c9e57614c9e615b93565b0490035b6040517f791ac947000000000000000000000000000000000000000000000000000000008152479073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790614d1e9087905f908b9030904290600401615bc0565b5f604051808303815f87803b158015614d35575f80fd5b505af1158015614d47573d5f803e3d5ffd5b505050505f8082470390505f805f805f8d60e0015161ffff161115614d95578761ffff168d60e0015161ffff1686026bffffffffffffffffffffffff1681614d9157614d91615b93565b0493505b60c08d015161ffff1615614dd2578761ffff168d60c0015161ffff1686026bffffffffffffffffffffffff1681614dce57614dce615b93565b0492505b60a08d015161ffff1615614e0f578761ffff168d60a0015161ffff1686026bffffffffffffffffffffffff1681614e0b57614e0b615b93565b0491505b60808d015161ffff1615614e4c578761ffff168d6080015161ffff1686026bffffffffffffffffffffffff1681614e4857614e48615b93565b0490505b6bffffffffffffffffffffffff841615614e6a57614e6a308561264f565b6bffffffffffffffffffffffff811615614f01576101608d0151516101408e015160405173ffffffffffffffffffffffffffffffffffffffff9092169162ffffff909116906bffffffffffffffffffffffff8416905f818181858888f193505050503d805f8114614ef6576040519150601f19603f3d011682016040523d82523d5f602084013e614efb565b606091505b50909650505b6bffffffffffffffffffffffff821615614f9c576101608d01516001602002015173ffffffffffffffffffffffffffffffffffffffff16826bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114614f91576040519150601f19603f3d011682016040523d82523d5f602084013e614f96565b606091505b50909650505b6bffffffffffffffffffffffff831615615037576101608d01516002602002015173ffffffffffffffffffffffffffffffffffffffff16836bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f811461502c576040519150601f19603f3d011682016040523d82523d5f602084013e615031565b606091505b50909650505b6bffffffffffffffffffffffff891615615185575f60028961ffff168f610100015161ffff1688026bffffffffffffffffffffffff168161507a5761507a615b93565b046bffffffffffffffffffffffff168161509657615096615b93565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482018190526bffffffffffffffffffffffff8e811660248401525f60448401819052606484015260848301919091524260a483015292909104925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163f305d719919084169060c40160606040518083038185885af115801561515b573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906151809190615b0a565b505050505b505050505050505050505050505f6151ba7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff90921691909117905550565b8180156152225750805115806152225750808060200190518101906152229190615c59565b610ac4576040517f2b96f51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f1181600a60016152d0565b5f607f821161529057825f526094600b5360d6600a5381821560071b17602053506017600a206109ab565b60085b82811c156152a357600801615293565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b806152e9578254600160ff84161b191661ffff166152f8565b825461ffff16600160ff84161b175b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116179092555050565b80515f90600d1c6001908116146109ab565b80515f90600e1c6001908116146109ab565b80515f90600b1c6001908116146109ab565b5f61536b836153ab565b80610b2a5750610b2a826153ab565b80515f90600a1c6001908116146109ab565b80515f9060071c6001908116146109ab565b610f1181600760016152d0565b80515f9060091c6001908116146109ab565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101615422615427565b905290565b60405180606001604052806003906020820280368337509192915050565b5f5b8381101561545f578181015183820152602001615447565b50505f910152565b5f815180845261547e816020860160208601615445565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610b2a6020830184615467565b73ffffffffffffffffffffffffffffffffffffffff81168114610f11575f80fd5b5f80604083850312156154f4575f80fd5b82356154ff816154c2565b946020939093013593505050565b8015158114610f11575f80fd5b5f6020828403121561552a575f80fd5b8135610b2a8161550d565b5f805f60608486031215615547575f80fd5b8335615552816154c2565b92506020840135615562816154c2565b929592945050506040919091013590565b5f60208284031215615583575f80fd5b5035919050565b803561ffff8116811461559b575f80fd5b919050565b5f80604083850312156155b1575f80fd5b82356155bc816154c2565b91506155ca6020840161558a565b90509250929050565b5f602082840312156155e3575f80fd5b813562ffffff81168114610b2a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215615632575f80fd5b813567ffffffffffffffff80821115615649575f80fd5b818401915084601f83011261565c575f80fd5b81358181111561566e5761566e6155f5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156156b4576156b46155f5565b816040528281528760208487010111156156cc575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f602082840312156156fb575f80fd5b610b2a8261558a565b5f60208284031215615714575f80fd5b813569ffffffffffffffffffff81168114610b2a575f80fd5b5f6020828403121561573d575f80fd5b8135610b2a816154c2565b805f5b6003811015610e7457815173ffffffffffffffffffffffffffffffffffffffff1684526020938401939091019060010161574b565b815160ff1681526101c0810160208301516157a1602084018261ffff169052565b5060408301516157b7604084018261ffff169052565b5060608301516157cd606084018261ffff169052565b5060808301516157e3608084018261ffff169052565b5060a08301516157f960a084018261ffff169052565b5060c083015161580f60c084018261ffff169052565b5060e083015161582560e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff16908301526101608084015161586b82850182615748565b505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e060208401526158af60e084018a615467565b83810360408501526158c1818a615467565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b8181101561592157835183529284019291840191600101615905565b50909c9b505050505050505050505050565b803560ff8116811461559b575f80fd5b5f8060408385031215615954575f80fd5b823561595f816154c2565b91506155ca60208401615933565b5f6020828403121561597d575f80fd5b813565ffffffffffff81168114610b2a575f80fd5b5f805f606084860312156159a4575f80fd5b83356159af816154c2565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a0312156159da575f80fd5b87356159e5816154c2565b965060208801356159f5816154c2565b95506040880135945060608801359350615a1160808901615933565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215615a3e575f80fd5b8235615a49816154c2565b91506020830135615a59816154c2565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff828116828216039080821115615aac57615aac615a64565b5092915050565b5f60208284031215615ac3575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156109ab576109ab615a64565b5f805f60608486031215615b1c575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215615b45575f80fd5b8151610b2a816154c2565b5f69ffffffffffffffffffff808316818103615b6e57615b6e615a64565b6001019392505050565b5f8251615b89818460208701615445565b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60a082016bffffffffffffffffffffffff88168352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c2b57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101615bf9565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b5f60208284031215615c69575f80fd5b8151610b2a8161550d56fea26469706673582212209f3438133a31fabcd186600528d9fee7dfd0c26db84406c2f812a7f9746113b964736f6c634300081800330f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000060f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff000000000000000000000000e4249324c0b2d4247477cd35cf3a3f73abdf8d570000000000000000000000000011223317890359f6c2d832045cfd11b2ac5e440000000000000000000000008800ee330033ff9559d466205f83b46d0275da53
Deployed Bytecode
0x6080604052600436106102c4575f3560e01c806370a082311161017057806395d89b41116100d1578063cda4c40811610087578063ea5eda3211610062578063ea5eda321461093e578063f2fde38b1461095d578063ff91e66b1461097c575f80fd5b8063cda4c408146108e1578063d505accf14610900578063dd62ed3e1461091f575f80fd5b8063a8aa1b31116100b7578063a8aa1b311461085a578063a9059cbb146108a3578063c3342e56146108c2575f80fd5b806395d89b4114610827578063a457c2d71461083b575f80fd5b806384b0196e116101265780638cd92b0a1161010c5780638cd92b0a146107ab5780638da5cb5b146107ca57806391c01b4514610813575f80fd5b806384b0196e146107705780638a8c523c14610797575f80fd5b806372621eb51161015657806372621eb51461071c5780637ae33d5f1461073d5780637ecebe0014610751575f80fd5b806370a08231146106e9578063715018a614610708575f80fd5b8063387205ee116102255780634c2babef116101db5780636cb07772116101b65780636cb077721461068c5780636d84249b146106ab5780636e2ad758146106ca575f80fd5b80634c2babef1461065157806350abfffd146106705780636257840f14610684575f80fd5b806342966c681161020b57806342966c681461058057806347ee6a071461059f5780634a97c9c014610632575f80fd5b8063387205ee146105425780633950935114610561575f80fd5b8063307aebc91161027a578063313ce56711610260578063313ce5671461049157806332fe7b26146104d65780633644e5151461052e575f80fd5b8063307aebc91461041a57806330adf81f1461045e575f80fd5b806317ede0de116102aa57806317ede0de1461037757806318160ddd1461039857806323b872dd146103fb575f80fd5b806306fdde03146102cf578063095ea7b314610348575f80fd5b366102cb57005b5f80fd5b3480156102da575f80fd5b50604080516080810182525f8082529181018281527f0e44522e5369636b72657370656374045349434b000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161033f91906154b0565b60405180910390f35b348015610353575f80fd5b506103676103623660046154e3565b61099b565b604051901515815260200161033f565b348015610382575f80fd5b5061039661039136600461551a565b6109b1565b005b3480156103a3575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff165b60405190815260200161033f565b348015610406575f80fd5b50610367610415366004615535565b610ac8565b348015610425575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001546a0100000000000000000000900460ff16610367565b348015610469575f80fd5b506103ed7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561049c575f80fd5b506104c47f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161033f565b3480156104e1575f80fd5b506105097f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033f565b348015610539575f80fd5b506103ed610b31565b34801561054d575f80fd5b5061039661055c3660046154e3565b610c2a565b34801561056c575f80fd5b5061036761057b3660046154e3565b610e7a565b34801561058b575f80fd5b5061039661059a366004615573565b610f00565b3480156105aa575f80fd5b506105b3610f14565b60405161033f91905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526bffffffffffffffffffffffff606084015116606083015273ffffffffffffffffffffffffffffffffffffffff608084015116608083015292915050565b34801561063d575f80fd5b5061036761064c3660046155a0565b610f47565b34801561065c575f80fd5b5061036761066b3660046155d3565b610f68565b34801561067b575f80fd5b50610396610f77565b610396610f83565b348015610697575f80fd5b506103676106a6366004615622565b61143f565b3480156106b6575f80fd5b506103676106c53660046156eb565b611449565b3480156106d5575f80fd5b506103676106e4366004615704565b611457565b3480156106f4575f80fd5b506103ed61070336600461572d565b61146d565b348015610713575f80fd5b506103966114ba565b348015610727575f80fd5b506107306114cb565b60405161033f9190615780565b348015610748575f80fd5b5061039661165b565b34801561075c575f80fd5b506103ed61076b36600461572d565b61182b565b34801561077b575f80fd5b50610784611862565b60405161033f9796959493929190615873565b3480156107a2575f80fd5b50610396611934565b3480156107b6575f80fd5b506103966107c5366004615943565b611992565b3480156107d5575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff16610509565b34801561081e575f80fd5b506103966119ba565b348015610832575f80fd5b50610332611a0b565b348015610846575f80fd5b506103676108553660046154e3565b611a68565b348015610865575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5473ffffffffffffffffffffffffffffffffffffffff16610509565b3480156108ae575f80fd5b506103676108bd3660046154e3565b611b43565b3480156108cd575f80fd5b506103676108dc36600461596d565b611b64565b3480156108ec575f80fd5b506103676108fb366004615992565b611b76565b34801561090b575f80fd5b5061039661091a3660046159c4565b611ba0565b34801561092a575f80fd5b506103ed610939366004615a2d565b611dfd565b348015610949575f80fd5b506105b361095836600461572d565b611e55565b348015610968575f80fd5b5061039661097736600461572d565b611f3a565b348015610987575f80fd5b506103ed610996366004615573565b611f9a565b5f6109a733848461213e565b5060015b92915050565b6109b9612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000028115610a125780547fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff1666012c012c012c0017905550565b80546101f4908290600190610a31908490610100900461ffff16615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610a6d9190615a91565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610aa99190615a91565b92506101000a81548161ffff021916908361ffff1602179055505b5050565b5f80610ad261221a565b9050610add81612223565b610b0d57610aec858285612268565b610b058585856bffffffffffffffffffffffff1661234e565b915050610b2a565b610b058585856bffffffffffffffffffffffff166001612357565b505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610c0557610c00604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f5cd7a22db506c1258aac682a09858bcfe0cb5f915deca541c8c546a3f7d91072918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507fef696112c60393a038507604a4508d891a76f4091e673010769918f160bbda8b90565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d795750505050508152505090505f825f14610dbc5782610e48565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015610e24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e489190615ab3565b61016083015151909150610e749073ffffffffffffffffffffffffffffffffffffffff86169083612565565b50505050565b5f80610e8461221a565b9050610ef6818585610ee7858973ffffffffffffffffffffffffffffffffffffffff9182165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093909416825291909152205490565b610ef19190615af7565b61213e565b5060019392505050565b610f11610f0b61221a565b8261264f565b50565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610c0033611e55565b5f610b2a73ffffffffffffffffffffffffffffffffffffffff8416836127c3565b5f6109ab8262ffffff1661285c565b610f81305f610c2a565b565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff166b010000000000000000000000179055610fe0612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5f61100b3061146d565b9050611059307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b61108530307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff169063f305d71990349060c40160606040518083038185885af1158015611131573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111569190615b0a565b5050507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e69190615b35565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128f9190615b35565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113219190615b35565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff91909116908117835561136c906129e8565b50815461138e9073ffffffffffffffffffffffffffffffffffffffff16612b4f565b81546113d390309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612922565b50505f6113fd7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909216919091179055565b5f6109ab82612b76565b5f6109ab8261ffff16612c1d565b5f6109ab8269ffffffffffffffffffff16612ce0565b5f61148d8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1692915050565b6114c2612150565b610f815f612e66565b6114d36153bd565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff16610140840152835190810193849052919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161162357505050505081525050905090565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116117aa5750505050508152505090505f479050610ac48183610140015162ffffff168461016001515f6003811061180957611809615aca565b602002015173ffffffffffffffffffffffffffffffffffffffff169190612f1f565b5f61184b8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f60606118b47f0e44522e5369636b72657370656374000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0131000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b61193c612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a0100000000000000000000179055565b61199a612150565b610ac473ffffffffffffffffffffffffffffffffffffffff831682612f94565b6119c2612150565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b604080516080810182525f8082529181018281527f0e44522e5369636b72657370656374045349434b000000000000000000000000601f830152815182016020018051605f840152839052805160609083018101939093526109ab565b5f80611a7261221a565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209389168352929052205490915083811015611b2b576040517ff8e06db200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101829052604481018590526064015b60405180910390fd5b611b38828686840361213e565b506001949350505050565b5f610ef6611b4f61221a565b84846bffffffffffffffffffffffff1661234e565b5f6109ab8265ffffffffffff16612ff6565b5f611b9873ffffffffffffffffffffffffffffffffffffffff85168484613108565b949350505050565b83421115611bda576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001611c6d7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611c0d836131ca565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012061327b565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611cb8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580611d3257508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611d69576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938516835292905290812054610b2a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152611e9e8273ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015292915050565b611f42612150565b73ffffffffffffffffffffffffffffffffffffffff8116611f91576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b610f1181612e66565b5f80611fc2611fa761221a565b73ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506a0100000000000000000000900469ffffffffffffffffffff165f036120ee577f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805469ffffffffffffffffffff16905f61202183615b50565b825469ffffffffffffffffffff9182166101009390930a928302928202191691909117909155825491166a0100000000000000000000027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff909116178155600181015473ffffffffffffffffffffffffffffffffffffffff166120ee576120a661221a565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555b805460405184916a0100000000000000000000900469ffffffffffffffffffff169033907f8a4758d83bb38a638ad4e66c346744f4837441be2c52672af48d24bdafa75644905f90a45090919050565b61214b8383836001612922565b505050565b61215861221a565b73ffffffffffffffffffffffffffffffffffffffff166121ac7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610f81576121cf61221a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401611b22565b5f610c006132dc565b5f6122438273ffffffffffffffffffffffffffffffffffffffff16613342565b806109ab57506109ab8273ffffffffffffffffffffffffffffffffffffffff16613400565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e745781811015612340576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401611b22565b610e7484848484035f612922565b5f611b988484845f5b5f73ffffffffffffffffffffffffffffffffffffffff85166123a7576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff84166123f6576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f6004820152602401611b22565b73ffffffffffffffffffffffffffffffffffffffff8581165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408082208784168352912060018201547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff931661248f5761248d8873ffffffffffffffffffffffffffffffffffffffff166129e8565b505b600181015473ffffffffffffffffffffffffffffffffffffffff166124cf576124cd8773ffffffffffffffffffffffffffffffffffffffff166129e8565b505b60028301545f90819081906124fd908790879087908d906b010000000000000000000000900460ff166134be565b925092509250825f036125255761251685858b8b61471e565b60019650505050505050611b98565b6125398561253230612e1e565b858b61471e565b801561254857612548816148ab565b6125548585848b61471e565b5060019a9950505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916125fb9190615b78565b5f604051808303815f865af19150503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b606091505b509150915061264882826151fd565b5050505050565b5f61266f8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b80549091506bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690831611156126a9575f80fd5b80546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168590039091160273ffffffffffffffffffffffffffffffffffffffff9091161781558161271d7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60010180546bffffffffffffffffffffffff740100000000000000000000000000000000000000008083048216949094031690920273ffffffffffffffffffffffffffffffffffffffff9283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906127b69086906bffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff81169061400081166180009091161715611b3857620100008410612818575f80fd5b5f85815260208390526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8616179055506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b385762e4e1c185106128d4575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209387168352929052208290558015610e74578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516129da91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081207f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805491927f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff92612a879069ffffffffffffffffffff16615b50565b825469ffffffffffffffffffff9182166101009390930a838102908302199091161790925583546a01000000000000000000009182027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9091161780855560018501805473ffffffffffffffffffffffffffffffffffffffff9097167fffffffffffffffffffffffff000000000000000000000000000000000000000097881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610f11612b718273ffffffffffffffffffffffffffffffffffffffff16612e1e565b615258565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b3857602085015160408601516060870151821582158215171715612c00575f80fd5b600186019290925560028501556003840155506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38576127118510612c94575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff89168082848688010101016127108114612d81575f80fd5b5087545f5b6005811015612e0b5761ffff603860108302011b5f828015612dc75760018114612dcf5760028114612dd75760038114612ddf5760048114612de757612deb565b899150612deb565b889150612deb565b879150612deb565b869150612deb565b8591505b508181601085026038011b16821985161793505050600181019050612d86565b5088555050505050506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081206109ab565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b604080515f80825260208201909252819073ffffffffffffffffffffffffffffffffffffffff86169084908690604051612f599190615b78565b5f60405180830381858888f193505050503d805f8114612634576040519150601f19603f3d011682016040523d82523d5f602084013e612639565b610ac481612fb78473ffffffffffffffffffffffffffffffffffffffff16612e1e565b9081547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00008116600160ff939093169290921b61ffff9182161816179055565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff81169061400081166180009091161715611b38578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e985101517171561308e575f80fd5b85545f5b60038110156130f75761ffff600860108302011b5f8280156130c357600181146130cb57600281146130d3576130d7565b8791506130d7565b8691506130d7565b8591505b508181601085026008011b16821985161793505050600181019050613092565b508655505050506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff811690614000811661800090911617613152575f80fd5b50600191505b82841015610b28575f61316b8686615265565b905061318c8173ffffffffffffffffffffffffffffffffffffffff166129e8565b5073ffffffffffffffffffffffffffffffffffffffff81165f9081526020839052604090206131be90600960016152d0565b50600190930192613158565b5f806131eb8373ffffffffffffffffffffffffffffffffffffffff16612e1e565b805490915067ffffffffffffffff6201000090910481161061322e5780547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1681555b80547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff8116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f613284610b31565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f30330361333c575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff16915061333f9050565b50335b90565b5f6109ab6133658373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261532b565b5f6109ab6134238373ffffffffffffffffffffffffffffffffffffffff16612e1e565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261533d565b6040805160a081018252855461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600185015473ffffffffffffffffffffffffffffffffffffffff1660808201525f90819081906135629061534f565b8061360657506040805160a081018252875461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600187015473ffffffffffffffffffffffffffffffffffffffff1660808201526136069061534f565b8061360e5750835b1561362057505f915083905081614713565b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a08801526b0100000000000000000000008404821660c08801526d01000000000000000000000000008404821660e08801526f0100000000000000000000000000000084048216928701929092527101000000000000000000000000000000000083041661012086015273010000000000000000000000000000000000000090910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116137355750505050508152505090505f61377f825160808082161491607f90911690565b5060028b01549091506a0100000000000000000000900460ff16613a42576139ed896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050896040518060a00160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff1669ffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050615361565b15613a1057506020015161271061ffff909116860204925050508083035f614713565b6040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613ae09061537a565b80613b8457506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff166080820152613b849061537a565b15614559576040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff166080820152613c279061537a565b15613fba5760208201516127109061ffff16880204945084870393506040518060e001604052805f151581526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001886bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001866bffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff168152508a600b015f015f8a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b1115613faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505f91506147139050565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526140589061538c565b15614072576127106109c48802049450848703935061408a565b60408201516127109061ffff16880204945084870393505b5f82610120015161ffff16116140d157846140a430612e1e565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1601614121565b61012082015160018b0154612710916bffffffffffffffffffffffff74010000000000000000000000000000000000000000909204821661ffff919091160216046bffffffffffffffffffffffff165b6001808b015473ffffffffffffffffffffffffffffffffffffffff9081165f818152600b8f016020908152604091829020825160e081018452815460ff8116151582526101009004861692810192909252948501549384169181018290526bffffffffffffffffffffffff74010000000000000000000000000000000000000000948590048116606083015260029095015467ffffffffffffffff81166080830152680100000000000000008104861660a08301529390930490931660c08301529295509114801561420a57504367ffffffffffffffff16816080015167ffffffffffffffff16145b15614218576142188a61539e565b6040518060e001604052805f151581526020018b6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001896bffffffffffffffffffffffff1681526020014367ffffffffffffffff168152602001876bffffffffffffffffffffffff168152602001866bffffffffffffffffffffffff168152508b600b015f015f8c6001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160010160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506080820151816002015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160086101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060c08201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050508115614551576a01a784379d99db42000000851115614551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d6974204578636565646564000000000000000000000000006044820152606401611b22565b505050614713565b6040805160a0810182528a5461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260018a015473ffffffffffffffffffffffffffffffffffffffff1660808201526145f79061538c565b8061469b57506040805160a081018252895461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff166060820152600189015473ffffffffffffffffffffffffffffffffffffffff16608082015261469b9061538c565b156146b5576127106109c4880204945084870393506146cd565b60608201516127109061ffff16880204945084870393505b8015613faf5787546a01a784379d99db4200000090613f479086907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16615af7565b955095509592505050565b835482906bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690821611156147d957600185015485546040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff908116602483015282166044820152606401611b22565b84546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168490038216810273ffffffffffffffffffffffffffffffffffffffff9384161788558654818104831685019092160291161784558161264857600184810154908601546040516bffffffffffffffffffffffff8416815273ffffffffffffffffffffffffffffffffffffffff92831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180546b0100000000000000000000007fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909116811790915560408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c08601526d01000000000000000000000000008304821660e08601526f0100000000000000000000000000000083048216908501527101000000000000000000000000000000000082041661012084015262ffffff730100000000000000000000000000000000000000909104166101408301528251938401928390525f93919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311614a465750505050508152505090505f600267ffffffffffffffff811115614a9657614a966155f5565b604051908082528060200260200182016040528015614abf578160200160208202803683370190505b50905030815f81518110614ad557614ad5615aca565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b9c9190615b35565b81600181518110614baf57614baf615aca565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525f614bde30612e1e565b546bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811691505f9085168211614c195784614c1b565b815b6101008501519091505f906127109061ffff1615614ca25760028161ffff1687610100015161ffff1685026bffffffffffffffffffffffff1681614c6157614c61615b93565b046bffffffffffffffffffffffff1681614c7d57614c7d615b93565b0491508183039250600286610100015161ffff1681614c9e57614c9e615b93565b0490035b6040517f791ac947000000000000000000000000000000000000000000000000000000008152479073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790614d1e9087905f908b9030904290600401615bc0565b5f604051808303815f87803b158015614d35575f80fd5b505af1158015614d47573d5f803e3d5ffd5b505050505f8082470390505f805f805f8d60e0015161ffff161115614d95578761ffff168d60e0015161ffff1686026bffffffffffffffffffffffff1681614d9157614d91615b93565b0493505b60c08d015161ffff1615614dd2578761ffff168d60c0015161ffff1686026bffffffffffffffffffffffff1681614dce57614dce615b93565b0492505b60a08d015161ffff1615614e0f578761ffff168d60a0015161ffff1686026bffffffffffffffffffffffff1681614e0b57614e0b615b93565b0491505b60808d015161ffff1615614e4c578761ffff168d6080015161ffff1686026bffffffffffffffffffffffff1681614e4857614e48615b93565b0490505b6bffffffffffffffffffffffff841615614e6a57614e6a308561264f565b6bffffffffffffffffffffffff811615614f01576101608d0151516101408e015160405173ffffffffffffffffffffffffffffffffffffffff9092169162ffffff909116906bffffffffffffffffffffffff8416905f818181858888f193505050503d805f8114614ef6576040519150601f19603f3d011682016040523d82523d5f602084013e614efb565b606091505b50909650505b6bffffffffffffffffffffffff821615614f9c576101608d01516001602002015173ffffffffffffffffffffffffffffffffffffffff16826bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f8114614f91576040519150601f19603f3d011682016040523d82523d5f602084013e614f96565b606091505b50909650505b6bffffffffffffffffffffffff831615615037576101608d01516002602002015173ffffffffffffffffffffffffffffffffffffffff16836bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f811461502c576040519150601f19603f3d011682016040523d82523d5f602084013e615031565b606091505b50909650505b6bffffffffffffffffffffffff891615615185575f60028961ffff168f610100015161ffff1688026bffffffffffffffffffffffff168161507a5761507a615b93565b046bffffffffffffffffffffffff168161509657615096615b93565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482018190526bffffffffffffffffffffffff8e811660248401525f60448401819052606484015260848301919091524260a483015292909104925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169163f305d719919084169060c40160606040518083038185885af115801561515b573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906151809190615b0a565b505050505b505050505050505050505050505f6151ba7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff90921691909117905550565b8180156152225750805115806152225750808060200190518101906152229190615c59565b610ac4576040517f2b96f51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f1181600a60016152d0565b5f607f821161529057825f526094600b5360d6600a5381821560071b17602053506017600a206109ab565b60085b82811c156152a357600801615293565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b806152e9578254600160ff84161b191661ffff166152f8565b825461ffff16600160ff84161b175b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116179092555050565b80515f90600d1c6001908116146109ab565b80515f90600e1c6001908116146109ab565b80515f90600b1c6001908116146109ab565b5f61536b836153ab565b80610b2a5750610b2a826153ab565b80515f90600a1c6001908116146109ab565b80515f9060071c6001908116146109ab565b610f1181600760016152d0565b80515f9060091c6001908116146109ab565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101615422615427565b905290565b60405180606001604052806003906020820280368337509192915050565b5f5b8381101561545f578181015183820152602001615447565b50505f910152565b5f815180845261547e816020860160208601615445565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610b2a6020830184615467565b73ffffffffffffffffffffffffffffffffffffffff81168114610f11575f80fd5b5f80604083850312156154f4575f80fd5b82356154ff816154c2565b946020939093013593505050565b8015158114610f11575f80fd5b5f6020828403121561552a575f80fd5b8135610b2a8161550d565b5f805f60608486031215615547575f80fd5b8335615552816154c2565b92506020840135615562816154c2565b929592945050506040919091013590565b5f60208284031215615583575f80fd5b5035919050565b803561ffff8116811461559b575f80fd5b919050565b5f80604083850312156155b1575f80fd5b82356155bc816154c2565b91506155ca6020840161558a565b90509250929050565b5f602082840312156155e3575f80fd5b813562ffffff81168114610b2a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215615632575f80fd5b813567ffffffffffffffff80821115615649575f80fd5b818401915084601f83011261565c575f80fd5b81358181111561566e5761566e6155f5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156156b4576156b46155f5565b816040528281528760208487010111156156cc575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f602082840312156156fb575f80fd5b610b2a8261558a565b5f60208284031215615714575f80fd5b813569ffffffffffffffffffff81168114610b2a575f80fd5b5f6020828403121561573d575f80fd5b8135610b2a816154c2565b805f5b6003811015610e7457815173ffffffffffffffffffffffffffffffffffffffff1684526020938401939091019060010161574b565b815160ff1681526101c0810160208301516157a1602084018261ffff169052565b5060408301516157b7604084018261ffff169052565b5060608301516157cd606084018261ffff169052565b5060808301516157e3608084018261ffff169052565b5060a08301516157f960a084018261ffff169052565b5060c083015161580f60c084018261ffff169052565b5060e083015161582560e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff16908301526101608084015161586b82850182615748565b505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e060208401526158af60e084018a615467565b83810360408501526158c1818a615467565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b8181101561592157835183529284019291840191600101615905565b50909c9b505050505050505050505050565b803560ff8116811461559b575f80fd5b5f8060408385031215615954575f80fd5b823561595f816154c2565b91506155ca60208401615933565b5f6020828403121561597d575f80fd5b813565ffffffffffff81168114610b2a575f80fd5b5f805f606084860312156159a4575f80fd5b83356159af816154c2565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a0312156159da575f80fd5b87356159e5816154c2565b965060208801356159f5816154c2565b95506040880135945060608801359350615a1160808901615933565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215615a3e575f80fd5b8235615a49816154c2565b91506020830135615a59816154c2565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff828116828216039080821115615aac57615aac615a64565b5092915050565b5f60208284031215615ac3575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156109ab576109ab615a64565b5f805f60608486031215615b1c575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215615b45575f80fd5b8151610b2a816154c2565b5f69ffffffffffffffffffff808316818103615b6e57615b6e615a64565b6001019392505050565b5f8251615b89818460208701615445565b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f60a082016bffffffffffffffffffffffff88168352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c2b57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101615bf9565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b5f60208284031215615c69575f80fd5b8151610b2a8161550d56fea26469706673582212209f3438133a31fabcd186600528d9fee7dfd0c26db84406c2f812a7f9746113b964736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e4249324c0b2d4247477cd35cf3a3f73abdf8d570000000000000000000000000011223317890359f6c2d832045cfd11b2ac5e440000000000000000000000008800ee330033ff9559d466205f83b46d0275da53
-----Decoded View---------------
Arg [0] : marketing (address): 0xE4249324c0b2D4247477Cd35Cf3a3F73ABDf8D57
Arg [1] : fee (address): 0x0011223317890359F6C2D832045Cfd11B2aC5e44
Arg [2] : gameRouter (address): 0x8800eE330033fF9559d466205F83B46D0275DA53
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4249324c0b2d4247477cd35cf3a3f73abdf8d57
Arg [1] : 0000000000000000000000000011223317890359f6c2d832045cfd11b2ac5e44
Arg [2] : 0000000000000000000000008800ee330033ff9559d466205f83b46d0275da53
Deployed Bytecode Sourcemap
178592:4774:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;155398:110;;;;;;;;;;-1:-1:-1;138248:4:0;138242:11;;138423:18;;;138410:32;;-1:-1:-1;138498:18:0;;;138278;;;138530;;;155480:8;138627:4;138614:18;;138607:34;138712:14;;138688:39;;138705:4;138688:39;138682:46;;138662:18;;;138655:74;138782:50;;;138877:14;155437:19;138853:39;;;;138846:50;;;;155398:110;;;;;;;:::i;:::-;;;;;;;;156301:150;;;;;;;;;;-1:-1:-1;156301:150:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;156301:150:0;1308:187:1;182633:401:0;;;;;;;;;;-1:-1:-1;182633:401:0;;;;;:::i;:::-;;:::i;:::-;;155640:99;;;;;;;;;;-1:-1:-1;155712:19:0;;;;;;;155640:99;;;2015:25:1;;;2003:2;1988:18;155640:99:0;1869:177:1;156459:411:0;;;;;;;;;;-1:-1:-1;156459:411:0;;;;;:::i;:::-;;:::i;182329:92::-;;;;;;;;;;-1:-1:-1;182397:16:0;;;;;;;182329:92;;153688:117;;;;;;;;;;-1:-1:-1;153688:117:0;153739:66;153688:117;;153902:31;;;;;;;;;;;;;;;;;;2946:4:1;2934:17;;;2916:36;;2904:2;2889:18;153902:31:0;2774:184:1;153858:35:0;;;;;;;;;;;;;;;;;;3158:42:1;3146:55;;;3128:74;;3116:2;3101:18;153858:35:0;2963:245:1;140509:179:0;;;;;;;;;;;;;:::i;181097:285::-;;;;;;;;;;-1:-1:-1;181097:285:0;;;;;:::i;:::-;;:::i;156878:233::-;;;;;;;;;;-1:-1:-1;156878:233:0;;;;;:::i;:::-;;:::i;158664:93::-;;;;;;;;;;-1:-1:-1;158664:93:0;;;;;:::i;:::-;;:::i;180085:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;3635:4:1;3677:3;3666:9;3662:19;3654:27;;3727:6;3718;3712:13;3708:26;3697:9;3690:45;3803:18;3795:4;3787:6;3783:17;3777:24;3773:49;3766:4;3755:9;3751:20;3744:79;3891:22;3883:4;3875:6;3871:17;3865:24;3861:53;3854:4;3843:9;3839:20;3832:83;3983:26;3975:4;3967:6;3963:17;3957:24;3953:57;3946:4;3935:9;3931:20;3924:87;4079:42;4071:4;4063:6;4059:17;4053:24;4049:73;4042:4;4031:9;4027:20;4020:103;3493:636;;;;;164766:136:0;;;;;;;;;;-1:-1:-1;164766:136:0;;;;;:::i;:::-;;:::i;164350:88::-;;;;;;;;;;-1:-1:-1;164350:88:0;;;;;:::i;:::-;;:::i;180993:96::-;;;;;;;;;;;;;:::i;181390:796::-;;;:::i;164650:108::-;;;;;;;;;;-1:-1:-1;164650:108:0;;;;;:::i;:::-;;:::i;164233:109::-;;;;;;;;;;-1:-1:-1;164233:109:0;;;;;:::i;:::-;;:::i;164548:94::-;;;;;;;;;;-1:-1:-1;164548:94:0;;;;;:::i;:::-;;:::i;155747:114::-;;;;;;;;;;-1:-1:-1;155747:114:0;;;;;:::i;:::-;;:::i;183042:97::-;;;;;;;;;;;;;:::i;179969:108::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;180783:202::-;;;;;;;;;;;;;:::i;156180:113::-;;;;;;;;;;-1:-1:-1;156180:113:0;;;;;:::i;:::-;;:::i;140696:591::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;182429:86::-;;;;;;;;;;;;;:::i;182198:123::-;;;;;;;;;;-1:-1:-1;182198:123:0;;;;;:::i;:::-;;:::i;179641:86::-;;;;;;;;;;-1:-1:-1;179706:13:0;;;;179641:86;;182523:102;;;;;;;;;;;;;:::i;155516:116::-;;;;;;;;;;;;;:::i;157119:492::-;;;;;;;;;;-1:-1:-1;157119:492:0;;;;;:::i;:::-;;:::i;180322:94::-;;;;;;;;;;-1:-1:-1;79820:76:0;180395:12;;;180322:94;;155869:154;;;;;;;;;;-1:-1:-1;155869:154:0;;;;;:::i;:::-;;:::i;164446:94::-;;;;;;;;;;-1:-1:-1;164446:94:0;;;;;:::i;:::-;;:::i;164910:142::-;;;;;;;;;;-1:-1:-1;164910:142:0;;;;;:::i;:::-;;:::i;157619:1037::-;;;;;;;;;;-1:-1:-1;157619:1037:0;;;;;:::i;:::-;;:::i;156031:141::-;;;;;;;;;;-1:-1:-1;156031:141:0;;;;;:::i;:::-;;:::i;180203:111::-;;;;;;;;;;-1:-1:-1;180203:111:0;;;;;:::i;:::-;;:::i;183147:214::-;;;;;;;;;;-1:-1:-1;183147:214:0;;;;;:::i;:::-;;:::i;180424:351::-;;;;;;;;;;-1:-1:-1;180424:351:0;;;;;:::i;:::-;;:::i;156301:150::-;156369:4;156386:35;156395:10;156406:7;156414:6;156386:8;:35::i;:::-;-1:-1:-1;156439:4:0;156301:150;;;;;:::o;182633:401::-;179020:13;:11;:13::i;:::-;182727:16;182754:273;::::1;;;182787:16:::0;;182850:21;;;;;;-1:-1:-1;182633:401:0:o;182754:273::-:1;182916:17:::0;;182930:3:::1;::::0;182916:17;;:10:::1;::::0;:17:::1;::::0;182930:3;;182916:17:::1;::::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;182963:3;182948;:11;;;:18;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;183000:3;182981;:15;;;:22;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;182754:273;182693:341;182633:401:::0;:::o;156459:411::-;156575:4;156592:15;156610:12;:10;:12::i;:::-;156592:30;;156638:22;156652:7;156638:13;:22::i;:::-;156633:230;;156677:36;156693:4;156698:7;156706:6;156677:15;:36::i;:::-;156735:35;156745:4;156751:2;156762:6;156735:35;;:9;:35::i;:::-;156728:42;;;;;156633:230;156810:41;156820:4;156826:2;156837:6;156810:41;;156846:4;156810:9;:41::i;156633:230::-;156581:289;156459:411;;;;;;:::o;140509:179::-;140566:7;140610:16;140593:13;:33;:87;;140656:24;141428:100;;;139726:66;141428:100;;;17074:25:1;141456:18:0;17115::1;;;17108:34;;;;141476:21:0;17158:18:1;;;17151:34;141499:13:0;17201:18:1;;;17194:34;141522:4:0;17244:19:1;;;17237:84;141360:7:0;;17046:19:1;;141428:100:0;;;;;;;;;;;;141400:143;;;;;;141380:163;;141295:256;;140656:24;140586:94;;140509:179;:::o;140593:87::-;-1:-1:-1;140629:24:0;;140509:179::o;181097:285::-;181173:38;;;;;;;;181195:16;181173:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;181173:38:0;;;;;;;181195:16;;181173:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;181222:22;181247:6;181257:1;181247:11;:62;;181303:6;181247:62;;;181261:39;;;;;181294:4;181261:39;;;3128:74:1;181261:24:0;;;;;;3101:18:1;;181261:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181337:17;;;;:20;181222:87;;-1:-1:-1;181320:54:0;;:16;;;;181222:87;181320:16;:54::i;:::-;181162:220;;181097:285;;:::o;156878:233::-;156960:4;156977:13;156993:12;:10;:12::i;:::-;156977:28;;157016:65;157025:5;157032:7;157070:10;157041:26;157052:5;157059:7;158866:34;;;;158840:7;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;;158765:152;157041:26;:39;;;;:::i;:::-;157016:8;:65::i;:::-;-1:-1:-1;157099:4:0;;156878:233;-1:-1:-1;;;156878:233:0:o;158664:93::-;158714:35;158720:12;:10;:12::i;:::-;158741:6;158714:5;:35::i;:::-;158664:93;:::o;180085:110::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180164:23:0;180176:10;180164:11;:23::i;164766:136::-;164836:4;164860:26;:19;;;164880:5;164860:19;:26::i;164350:88::-;164395:4;164419:11;:5;:9;;;:11::i;180993:96::-;181044:37;181072:4;181079:1;181044:19;:37::i;:::-;180993:96::o;181390:796::-;154173:14;:21;;;;;;;;179020:13:::1;:11;:13::i;:::-;79820:76:::0;181464:20:::2;181528:24;181546:4;181528:9;:24::i;:::-;181505:47;;181563:65;181580:4;181595:6;181603:17;181622:5;181563:8;:65::i;:::-;181639:63;181656:4;181671;181677:17;181696:5;181639:8;:63::i;:::-;181713:196;::::0;;;;181776:4:::2;181713:196;::::0;::::2;14032:34:1::0;;;14082:18;;;14075:34;;;181823:1:0::2;14125:18:1::0;;;14118:34;;;14168:18;;;14161:34;14211:19;;;14204:44;181883:15:0::2;14264:19:1::0;;;14257:35;181713:6:0::2;:22;;::::0;::::2;::::0;181743:9:::2;::::0;13943:19:1;;181713:196:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;181951:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181938:38;;;181985:4;181992:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181938:68;::::0;;::::2;::::0;;;;;;15054:42:1;15123:15;;;181938:68:0::2;::::0;::::2;15105:34:1::0;15175:15;;15155:18;;;15148:43;15017:18;;181938:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;181920:87:::0;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;182018:29:::2;::::0;:27:::2;:29::i;:::-;-1:-1:-1::0;182066:9:0;;182058:37:::2;::::0;182066:9:::2;;182058:35;:37::i;:::-;182142:9:::0;;182110:68:::2;::::0;182127:4:::2;::::0;182142:9:::2;;182153:17;182142:9;182110:8;:68::i;:::-;181453:733;;154234:5:::0;154217:7;79820:76;;140509:179;154217:7;:14;;:22;;;;;;;;;;;;;;;;;181390:796::o;164650:108::-;164708:4;164732:18;:5;:16;:18::i;164233:109::-;164288:4;164312:22;:5;:20;;;:22::i;164548:94::-;164596:4;164620:14;:5;:12;;;:14::i;155747:114::-;155802:7;155829:16;:6;:14;;;:16::i;:::-;:24;;;;;;;;-1:-1:-1;;155747:114:0:o;183042:97::-;179020:13;:11;:13::i;:::-;183101:30:::1;183128:1;183101:18;:30::i;179969:108::-:0;180018:15;;:::i;:::-;180046:23;;;;;;;;180053:16;180046:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180053:16;;180046:23;;;;;;180053:16;;180046:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179969:108;:::o;180783:202::-;180832:38;;;;;;;;180854:16;180832:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;180832:38:0;;;;;;;180854:16;;180832:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180881:14;180898:21;180881:38;;180930:47;180961:6;180969:3;:7;;;180930:47;;:3;:17;;;180948:1;180930:20;;;;;;;:::i;:::-;;;;;:30;;;:47;:30;:47::i;156180:113::-;156235:7;156262:16;:6;:14;;;:16::i;:::-;:23;;;;;;;;-1:-1:-1;;156180:113:0:o;140696:591::-;140799:13;140827:18;140860:21;140896:15;140926:25;140966:12;140993:27;141092:23;:11;136410:20;136529:4;136523:11;136513:21;;136643:4;136635:6;136631:17;136625:4;136618:31;136719:1;136711:6;136704:17;136805:6;136798:4;136790:6;136786:17;136779:33;136911:1;136901:6;136895:13;136888:4;136880:6;136876:17;136872:37;136865:48;136352:579;;;;141092:23;136529:4;136523:11;;136631:17;;;136618:31;;-1:-1:-1;136704:17:0;;;141130:14;136798:4;136786:17;;136779:33;136895:13;;136888:4;136872:37;;;;;136865:48;;;141252:16;;;;;;;;;;;141048:231;;;;-1:-1:-1;136523:11:0;;-1:-1:-1;141171:13:0;;-1:-1:-1;141207:4:0;;-1:-1:-1;;;141252:16:0;-1:-1:-1;141048:231:0;-1:-1:-1;140696:591:0:o;182429:86::-;179020:13;:11;:13::i;:::-;182484:16;:23;;;::::1;::::0;::::1;::::0;;182429:86::o;182198:123::-;179020:13;:11;:13::i;:::-;182283:30:::1;:25;::::0;::::1;182309:3:::0;182283:25:::1;:30::i;182523:102::-:0;179020:13;:11;:13::i;:::-;182588:16;:29;;;::::1;::::0;;182523:102::o;155516:116::-;138248:4;138242:11;;138423:18;;;138410:32;;-1:-1:-1;138498:18:0;;;138278;;;138530;;;155604:8;138627:4;138614:18;;138607:34;138712:14;;138688:39;;138705:4;138688:39;138682:46;;138662:18;;;138655:74;138782:50;;;138877:14;;155557:21;138853:39;;;;;138846:50;;;;155604:20;138046:868;157119:492;157208:4;157225:13;157241:12;:10;:12::i;:::-;158866:34;;;;157264:24;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;:34;;-1:-1:-1;157332:36:0;;;157328:145;;;157392:69;;;;;15434:42:1;15422:55;;157392:69:0;;;15404:74:1;15494:18;;;15487:34;;;15537:18;;;15530:34;;;15377:18;;157392:69:0;;;;;;;;157328:145;157508:62;157517:5;157524:7;157552:17;157533:16;:36;157508:8;:62::i;:::-;-1:-1:-1;157599:4:0;;157119:492;-1:-1:-1;;;;157119:492:0:o;155869:154::-;155933:4;155950:43;155960:12;:10;:12::i;:::-;155974:2;155985:6;155950:43;;:9;:43::i;164446:94::-;164494:4;164518:14;:5;:12;;;:14::i;164910:142::-;164992:4;165016:28;:15;;;165032:6;165039:4;165016:15;:28::i;:::-;165009:35;164910:142;-1:-1:-1;;;;164910:142:0:o;157619:1037::-;157844:8;157826:15;:26;157822:54;;;157861:15;;;;;;;;;;;;;;157822:54;157914:15;157932:498;157960:395;153739:66;158119:6;158156:7;158194:5;158230:17;158119:6;158230:9;:17::i;:::-;158032:281;;;;;;15862:25:1;;;;15906:42;15984:15;;;15964:18;;;15957:43;16036:15;;;;16016:18;;;16009:43;16068:18;;;16061:34;16111:19;;;16104:35;16155:19;;;16148:35;;;15834:19;;158032:281:0;;;;;;;;;;;;157996:340;;;;;;157960:13;:395::i;:::-;157932:498;;;;;;;;;;;;16421:25:1;;;;16494:4;16482:17;;16462:18;;;16455:45;16516:18;;;16509:34;;;16559:18;;;16552:34;;;16393:19;;157932:498:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;157932:498:0;;;;;;-1:-1:-1;;158451:21:0;;;;;:42;;;158487:6;158476:17;;:7;:17;;;;158451:42;158447:70;;;158502:15;;;;;;;;;;;;;;158447:70;158534:36;;;;;;;;:27;:36;;;;;;;;:45;;;;;;;;;;;;;:53;;;158616:32;2015:25:1;;;158534:45:0;;158616:32;;;;;1988:18:1;158616:32:0;;;;;;;157619:1037;;;;;;;:::o;156031:141::-;158866:34;;;;156112:7;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;156139:25;158765:152;180203:111;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180292:14:0;:4;:12;;;:14::i;:::-;180285:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;180203:111:0:o;183147:214::-;179020:13;:11;:13::i;:::-;183226:22:::1;::::0;::::1;183222:93;;183272:31;::::0;::::1;::::0;;183300:1:::1;183272:31;::::0;::::1;3128:74:1::0;3101:18;;183272:31:0::1;2963:245:1::0;183222:93:0::1;183325:28;183344:8;183325:18;:28::i;180424:351::-:0;180474:7;180494:20;180517:22;:12;:10;:12::i;:::-;:20;;;:22::i;:::-;180553:8;;;;-1:-1:-1;180553:8:0;;;;;;:13;180550:143;;180595:11;:13;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;180584:24;;;;;;;;;;;;;-1:-1:-1;180626:12:0;;;:26;:12;180623:58;;180669:12;:10;:12::i;:::-;180654;;;:27;;;;;;;;;;;;;;;180623:58;180734:8;;180708:39;;180744:2;;180734:8;;;;;;180722:10;;180708:39;;180734:8;;180708:39;-1:-1:-1;180765:2:0;;180424:351;-1:-1:-1;180424:351:0:o;165691:132::-;165777:38;165786:6;165794:7;165803:5;165810:4;165777:8;:38::i;:::-;165691:132;;;:::o;179475:158::-;179538:12;:10;:12::i;:::-;179527:23;;:7;179706:13;;;;;179641:86;179527:7;:23;;;179523:103;;179601:12;:10;:12::i;:::-;179574:40;;;;;3158:42:1;3146:55;;;179574:40:0;;;3128:74:1;3101:18;;179574:40:0;2963:245:1;103402:111:0;103455:7;103482:23;:21;:23::i;158925:140::-;158988:4;159012:20;:7;:18;;;:20::i;:::-;:45;;;;159036:21;:7;:19;;;:21::i;166133:478::-;158866:34;;;;166226:24;158866:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;166315:17;166295:37;;166291:313;;166372:5;166353:16;:24;166349:127;;;166405:55;;;;;15434:42:1;15422:55;;166405::0;;;15404:74:1;15494:18;;;15487:34;;;15537:18;;;15530:34;;;15377:18;;166405:55:0;15202:368:1;166349:127:0;166519:58;166528:6;166536:7;166564:5;166545:16;:24;166571:5;166519:8;:58::i;159073:187::-;159186:12;159218:34;159228:4;159234:2;159238:6;159246:5;159268:1148;159407:12;159438:18;;;159434:56;;159465:25;;;;;159487:1;159465:25;;;3128:74:1;3101:18;;159465:25:0;2963:245:1;159434:56:0;159505:16;;;159501:56;;159530:27;;;;;159554:1;159530:27;;;3128:74:1;3101:18;;159530:27:0;2963:245:1;159501:56:0;98725:28;;;;159570:20;98725:28;;;:14;:28;;;;;;;;;;;;;159726:14;;;;79820:76;;159726:14;159722:49;;159756:15;:4;:13;;;:15::i;:::-;;159722:49;159788:17;;;;:31;:17;159784:50;;159821:13;:2;:11;;;:13::i;:::-;;159784:50;159997:11;;;;159848:17;;;;;;159908:111;;159997:11;;159931:6;;159952:9;;159976:6;;159997:11;;;;;159908:8;:111::i;:::-;159847:172;;;;;;160036:9;160049:1;160036:14;160032:119;;160067:46;160075:6;160083:9;160094:6;160102:10;160067:7;:46::i;:::-;160135:4;160128:11;;;;;;;;;;160032:119;160163:63;160171:6;160179:23;160187:4;160179:21;:23::i;:::-;160204:9;160215:10;160163:7;:63::i;:::-;160243:14;;160239:76;;160274:29;160291:10;160274:9;:29::i;:::-;160327:49;160335:6;160343:9;160354;160365:10;160327:7;:49::i;:::-;-1:-1:-1;160394:4:0;;159268:1148;-1:-1:-1;;;;;;;;;;159268:1148:0:o;31035:320::-;31213:77;;;31188:10;17524:55:1;;;31213:77:0;;;17506:74:1;17596:18;;;;17589:34;;;31213:77:0;;;;;;;;;;17479:18:1;;;;31213:77:0;;;;;;;;;31254:24;31213:77;;;31188:117;;-1:-1:-1;;;;31188:10:0;;;;:117;;31213:77;31188:117;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31152:153;;;;31318:29;31333:7;31342:4;31318:14;:29::i;:::-;31139:216;;31035:320;;;:::o;165330:353::-;165394:23;165420:14;:4;:12;;;:14::i;:::-;165458:15;;165394:40;;-1:-1:-1;165458:15:0;;;;;;;165449:24;;;;165445:65;;;165490:8;;;165445:65;165545:25;;;;;;;;;;;;;;;;;;;;;;;165564:6;165585:7;79820:76;;140509:179;165585:7;:19;;:29;;;;;;;;;;;;;;;;;;;;;;;;165641:34;;-1:-1:-1;;165641:34:0;;;;;;;165668:6;;18101:26:1;18089:39;;;;18071:58;;18059:2;18044:18;;17926:209;165641:34:0;;;;;;;;165383:300;165330:353;;:::o;96789:907::-;96973:8;96858:11;96960:22;;;96910:15;97003:4;96996:35;;;97078:4;97062:21;;97056:28;97118:6;97109:16;;;97168:10;97159:20;;97189:10;97180:20;;;97156:45;97149:53;97139:509;;97243:5;97236;97233:16;97223:82;;97284:1;97281;97274:12;97223:82;97330:4;97323:21;;;97369:4;97362:35;;;97442:4;97426:21;;97475:10;;97564:9;97556:18;97522:6;97576:24;;97553:48;97619:14;;-1:-1:-1;97673:4:0;;96789:907;-1:-1:-1;;;;96789:907:0:o;95044:809::-;95253:8;95088:11;95240:22;;;95190:15;95283:4;95276:35;;;95358:4;95342:21;;95336:28;95136:15;;95190;95398:6;95389:16;;;95448:10;95439:20;;95469:10;95460:20;;;95436:45;95429:53;95419:386;;95523:8;95516:5;95513:19;95503:85;;95567:1;95564;95557:12;95503:85;95616:16;;95713:9;95705:18;95666:3;95729:15;;;95662:16;95725:26;95702:50;95770:20;;-1:-1:-1;95830:4:0;;95044:809;-1:-1:-1;;;;95044:809:0:o;165831:294::-;165976:35;;;;;;;;:27;:35;;;;;;;;:44;;;;;;;;;:52;;;166039:79;;;;166091:7;166074:32;;166083:6;166074:32;;;166100:5;166074:32;;;;2015:25:1;;2003:2;1988:18;;1869:177;166074:32:0;;;;;;;;165831:294;;;;:::o;98769:262::-;98895:26;;;98819:19;98895:26;;;:11;:26;;;;;98944:6;98942:8;;98895:26;;79820:76;;98942:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;98932:18;;;;;;;;;;;;;;-1:-1:-1;98961:11:0;;:19;;;;;;;;;;;;;;;99007:7;;;;;;-1:-1:-1;98991:24:0;;;:15;;;;:24;;;;;;:32;;;;;;;;;98932:3;98769:262::o;88242:103::-;88303:34;:15;:5;:13;;;:15::i;:::-;:32;:34::i;95861:920::-;96083:8;95918:11;96070:22;;;96020:15;96113:4;96106:35;;;96188:4;96172:21;;96166:28;95966:15;;96020;96228:6;96219:16;;;96278:10;96269:20;;96299:10;96290:20;;;96266:45;96259:53;96249:484;;96359:4;96352:5;96348:16;96342:23;96409:4;96402:5;96398:16;96392:23;96459:4;96452:5;96448:16;96442:23;96522:1;96515:9;96510:1;96503:9;96499:1;96492:9;96489:24;96486:39;96483:97;;;96559:1;96556;96549:12;96483:97;96620:1;96605:17;;96598:28;;;;96666:1;96651:17;;96644:28;96712:1;96697:17;;96690:28;-1:-1:-1;96758:4:0;;95861:920;-1:-1:-1;;;;95861:920:0:o;94219:817::-;94439:8;94274:11;94426:22;;;94376:15;94469:4;94462:35;;;94544:4;94528:21;;94522:28;94322:15;;94376;94584:6;94575:16;;;94634:10;94625:20;;94655:10;94646:20;;;94622:45;94615:53;94605:383;;94709:5;94702;94699:16;94689:82;;94750:1;94747;94740:12;94689:82;94799:16;;94896:9;94888:18;94849:3;94912:15;;;94845:16;94908:26;94885:50;94953:20;;-1:-1:-1;95013:4:0;;94219:817;-1:-1:-1;;;;94219:817:0:o;92668:1543::-;92880:8;92715:11;92867:22;;;92817:15;92910:4;92903:35;;;92985:4;92969:21;;92963:28;92763:15;;92817;93025:6;93016:16;;;93075:10;93066:20;;93096:10;93087:20;;;93063:45;93056:53;93046:1118;;93148:5;93144:2;93140:14;93202:6;93194:5;93190:2;93186:14;93182:27;93257:6;93249:5;93245:2;93241:14;93237:27;93312:6;93304:5;93300:2;93296:14;93292:27;93358:6;93351:5;93347:18;93431:2;93426;93421;93416;93412;93408:11;93404:20;93400:29;93396:38;93472:5;93465;93462:16;93452:82;;93513:1;93510;93503:12;93452:82;;93568:9;93562:16;93611:1;93596:485;93621:1;93618;93615:8;93596:485;;;93703:6;93686:2;93697;93690:10;;93682:19;93678:32;93741:1;93694;93794:18;;;;93839:1;93834:18;;;;93879:1;93874:18;;;;93919:1;93914:18;;;;93959:1;93954:18;;;;93764:208;;93794:18;93808:2;93803:7;;93794:18;;93834;93848:2;93843:7;;93834:18;;93874;93888:2;93883:7;;93874:18;;93914;93928:2;93923:7;;93914:18;;93954;93968:2;93963:7;;93764:208;;94056:4;94052:1;94046:2;94043:1;94039:10;94035:2;94031:19;94027:27;94023:38;94015:4;94011:9;94007:2;94003:18;94000:62;93994:68;;;;93638:1;93635;93631:9;93626:14;;93596:485;;;-1:-1:-1;94129:20:0;;-1:-1:-1;;;;;;94189:4:0;;92668:1543;-1:-1:-1;;;;92668:1543:0:o;98484:122::-;98725:28;;;98538:19;98725:28;;;:14;:28;;;;;98577:21;98614:147;179735:226;179859:8;;;179878:19;;;179859:8;179878:19;;;;;;;;;179913:40;;79820:76;;179859:8;;;;;;179913:40;;179801:18;;179913:40;179790:171;;179735:226;:::o;30784:239::-;30950:12;;;30874;30950;;;;;;;;;30874;;30909:16;;;;30945:3;;30933:5;;30909:54;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89404:117;89476:37;89509:3;89476:15;:5;:13;;;:15::i;:::-;:32;91138:17;;91111:58;;;91159:1;:8;;;;;;;;;91138:17;;;;:30;91111:58;;;;91031:146;91340:1320;91552:8;91387:11;91539:22;;;91489:15;91582:4;91575:35;;;91657:4;91641:21;;91635:28;91435:15;;91489;91697:6;91688:16;;;91747:10;91738:20;;91768:10;91759:20;;;91735:45;91728:53;91718:895;;91820:5;91816:2;91812:14;91874:6;91866:5;91862:2;91858:14;91854:27;91920:6;91913:5;91909:18;92013:4;92009:2;92006:12;91999:20;91990:4;91986:2;91983:12;91976:20;91968:4;91964:2;91961:12;91954:20;91951:46;91948:72;91945:130;;;92054:1;92051;92044:12;91945:130;92109:9;92103:16;92152:1;92137:403;92162:1;92159;92156:8;92137:403;;;92243:6;92227:1;92237:2;92230:10;;92223:18;92219:31;92281:1;92234;92334:18;;;;92379:1;92374:18;;;;92419:1;92414:18;;;;92304:128;;92334:18;92348:2;92343:7;;92334:18;;92374;92388:2;92383:7;;92374:18;;92414;92428:2;92423:7;;92304:128;;92515:4;92511:1;92505:2;92502:1;92498:10;92495:1;92491:18;92487:26;92483:37;92475:4;92471:9;92467:2;92463:18;92460:61;92454:67;;;;92179:1;92176;92172:9;92167:14;;92137:403;;;-1:-1:-1;92578:20:0;;-1:-1:-1;;;;92638:4:0;;91340:1320;-1:-1:-1;;;;91340:1320:0:o;97704:767::-;97897:8;97785:11;97884:22;;;97834:15;97927:4;97920:32;;;97999:4;97983:21;;97977:28;98039:6;98030:16;;;98082:10;98073:20;;98103:10;98094:20;;;98070:45;98060:103;;98146:1;98143;98136:12;98060:103;;98188:4;98178:14;;98213:251;98227:4;98218:6;:13;98213:251;;;98278:12;98293:23;98301:7;98309:6;98293:7;:23::i;:::-;98278:38;;98335:15;:4;:13;;;:15::i;:::-;-1:-1:-1;98369:19:0;;;:13;:19;;;;;;;;;;:41;;98403:1;98405:4;98369:33;:41::i;:::-;-1:-1:-1;98429:8:0;;;;;98213:251;;166619:266;166672:7;166692:23;166718:16;:6;:14;;;:16::i;:::-;166774:14;;166692:42;;-1:-1:-1;166792:16:0;166774:14;;;;;;:34;166770:58;;166810:18;;;;;;166770:58;166850:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;166619:266:0:o;141559:180::-;141633:7;141699:18;:16;:18::i;:::-;141670:60;;18410:66:1;141670:60:0;;;18398:79:1;18493:11;;;18486:27;;;;18529:12;;;18522:28;;;18566:12;;141670:60:0;;;;;;;;;;;;141660:71;;;;;;141653:78;;141559:180;;;:::o;102660:424::-;102705:14;102758:4;102736:10;:27;102732:345;;102780:18;102801:8;;102780:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;102840:8:0;102918:17;102912:24;102956:42;102908:91;;-1:-1:-1;102732:345:0;;-1:-1:-1;102732:345:0;;-1:-1:-1;103055:10:0;102732:345;102660:424;:::o;86369:117::-;86426:4;86450:28;:15;:5;:13;;;:15::i;:::-;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28::i;86496:119::-;86554:4;86578:29;:15;:5;:13;;;:15::i;:::-;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29::i;81577:3766::-;81796:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;81796:19:0;;:17;:19::i;:::-;:45;;;-1:-1:-1;81819:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;:22::i;:::-;81796:57;;;;81845:8;81796:57;81793:88;;;-1:-1:-1;81865:1:0;;-1:-1:-1;81868:6:0;;-1:-1:-1;81865:1:0;81857:21;;81793:88;81891:38;;;;;;;;81918:11;;;;81891:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;81918:11:0;;81891:38;;;;;;;;81918:11;81891:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81941:13;81959:23;:8;85653:14;85698:3;85689:12;;;85688:21;;85735:3;85726:12;;;;85536:210;81959:23;-1:-1:-1;82007:11:0;;;;81940:42;;-1:-1:-1;82007:11:0;;;;;82003:390;;82038:25;82045:6;82038:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82053:9;82038:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:25::i;:::-;82035:347;;;-1:-1:-1;82138:15:0;;;79944:5;82129:38;:24;;;;;:38;;-1:-1:-1;;;82202:16:0;;;82298:1;82269:31;;82035:347;82348:18;;;;;;;;;;;;;;82035:347;82408:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;:22::i;:::-;:51;;;-1:-1:-1;82434:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:23;:25::i;:::-;82405:2929;;;82481:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;:20;:22::i;:::-;82478:2176;;;82580:15;;;;79944:5;;82571:38;:24;;;:38;82559:50;;82651:9;82644:6;:16;82632:28;;82737:189;;;;;;;;82770:5;82737:189;;;;;;82777:6;:14;;;;;;;;;;;;82737:189;;;;;;82793:9;:17;;;;;;;;;;;;82737:189;;;;;;82819:6;82737:189;;;;;;82856:12;82737:189;;;;;;82878:9;82737:189;;;;;;82897:9;82737:189;;;;;82700:2;:11;;:15;;:34;82716:9;:17;;;;;;;;;;;;82700:34;;;;;;;;;;;;;;;:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82950:8;82947:156;;;82986:17;;79994:16;;82986:27;;83004:9;;82986:17;;;:40;:17;:27;:::i;:::-;:40;82983:99;;;83053:29;;;;;18980:2:1;83053:29:0;;;18962:21:1;19019:2;18999:18;;;18992:30;19058:21;19038:18;;;19031:49;19097:18;;83053:29:0;18778:343:1;82983:99:0;-1:-1:-1;83153:1:0;;-1:-1:-1;83123:32:0;;-1:-1:-1;83123:32:0;82478:2176;83203:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;:15;:17::i;:::-;83200:434;;;79944:5;83303:4;83294:13;;:27;83282:39;;83367:9;83360:6;:16;83348:28;;83200:434;;;83506:16;;;;79944:5;;83497:39;:25;;;:39;83485:51;;83582:9;83575:6;:16;83563:28;;83200:434;83730:1;83700:8;:27;;;:31;;;:186;;83877:9;83845:23;83853:4;83845:21;:23::i;:::-;:31;;;;;;:41;83700:186;;;83776:27;;;;83759:14;;;;79944:5;;83759:14;;;;;;;:58;:44;;;;;:58;;83700:186;;;83991:14;;;;;;;;;83946:26;83975:31;;;:11;;;:31;;;;;;;;;83946:60;;;;;;;;;;;;;;;;83991:14;83946:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83687:199;;-1:-1:-1;83946:60:0;84028:36;:80;;;;;84095:12;84068:40;;:8;:16;;;:40;;;84028:80;84025:148;;;84133:20;:6;:18;:20::i;:::-;84227:189;;;;;;;;84260:5;84227:189;;;;;;84267:6;:14;;;;;;;;;;;;84227:189;;;;;;84283:9;:17;;;;;;;;;;;;84227:189;;;;;;84309:6;84227:189;;;;;;84346:12;84227:189;;;;;;84368:9;84227:189;;;;;;84387:9;84227:189;;;;;84193:2;:11;;:15;;:31;84209:6;:14;;;;;;;;;;;;84193:31;;;;;;;;;;;;;;;:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84440:8;84437:138;;;79994:16;84476:22;;84473:81;;;84525:29;;;;;18980:2:1;84525:29:0;;;18962:21:1;19019:2;18999:18;;;18992:30;19058:21;19038:18;;;19031:49;19097:18;;84525:29:0;18778:343:1;84473:81:0;84595:41;;;;;82405:2929;84693:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;:15;:17::i;:::-;:41;;;-1:-1:-1;84714:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;:18;:20::i;:::-;84690:422;;;79944:5;84809:4;84800:13;;:27;84788:39;;84869:9;84862:6;:16;84850:28;;84690:422;;;84992:20;;;;79944:5;;84983:43;:29;;;:43;84971:55;;85068:9;85061:6;:16;85049:28;;84690:422;85131:8;85128:144;;;85163:17;;79994:16;;85163:27;;85181:9;;85163:17;;;:40;:17;:27;:::i;81577:3766::-;;;;;;;;;;:::o;160424:503::-;160634:12;;160602:5;;160634:12;;;;;;;160625:21;;;;160621:116;;;160690:12;;;;160704;;160670:55;;;;;160690:12;;;;160670:55;;;19326:74:1;160704:12:0;;;;;;;19461:18:1;;;19454:43;19533:15;;19513:18;;;19506:43;19299:18;;160670:55:0;19126:429:1;160621:116:0;160774:22;;;;;;;;;;;;;;;;;;;;;;;160811:20;;;;;;;;;;;;;;;;;;160859:9;160855:62;;160898:10;;;;;160884:12;;;;160875:42;;18101:26:1;18089:39;;18071:58;;160898:10:0;;;;;160884:12;;;;160875:42;;18059:2:1;18044:18;160875:42:0;;;;;;;160566:361;160424:503;;;;:::o;160937:3288::-;154173:14;:21;;;;;;;;;;;;161022:43:::1;::::0;;::::1;::::0;::::1;::::0;;161049:16;161022:43;;::::1;::::0;::::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;;;::::1;::::0;;;::::1;;::::0;;;;;;;;::::1;::::0;;;;-1:-1:-1;;161022:43:0;;161049:16;;161022:43;;;;;;161049:16:::1;::::0;161022:43;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;::::0;::::1;;;161101:21;161139:1;161125:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;161125:16:0::1;;161101:40;;161174:4;161156;161161:1;161156:7;;;;;;;;:::i;:::-;;;;;;:23;;;;;;;;;::::0;::::1;161204:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;161194:4;161199:1;161194:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;161234:18:::1;161255:23;161263:4;161255:21;:23::i;:::-;:31:::0;::::1;::::0;;;::::1;::::0;::::1;::::0;-1:-1:-1;161255:31:0::1;::::0;161337:19;::::1;::::0;::::1;:41;;161373:5;161337:41;;;161359:11;161337:41;161480:27;::::0;::::1;::::0;161301:77;;-1:-1:-1;161393:22:0::1;::::0;161454:5:::1;::::0;161480:31:::1;;::::0;161476:273:::1;;161614:1;161597:14;161550:61;;161566:8;:27;;;161551:42;;:12;:42;161550:61;;;;;;;:::i;:::-;;:65;;;;;;;:::i;:::-;;161532:83;;161650:15;161634:31;;;;161732:1;161702:8;:27;;;:31;;;;;;;:::i;:::-;;161684:49:::0;::::1;161476:273;161832:212;::::0;;;;161795:21:::1;::::0;161832:57:::1;:6;:57;::::0;::::1;::::0;:212:::1;::::0;161908:12;;161765:20:::1;::::0;161959:4;;161990::::1;::::0;162014:15:::1;::::0;161832:212:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;162061:12;162088:16:::0;162139:13:::1;162114:21;162107:45;162088:64;;162167:20;162202:21:::0;162238:25:::1;162278:19:::0;162338:1:::1;162317:8;:18;;;:22;;;162314:127;;;162411:14;162376:49;;162389:8;:18;;;162377:30;;:9;:30;162376:49;;;;;;;:::i;:::-;;162360:65;;162314:127;162464:19;::::0;::::1;::::0;:23:::1;;::::0;162461:130:::1;;162561:14;162525:50;;162538:8;:19;;;162526:31;;:9;:31;162525:50;;;;;;;:::i;:::-;;162508:67;;162461:130;162622:23;::::0;::::1;::::0;:27:::1;;::::0;162619:142:::1;;162731:14;162691:54;;162704:8;:23;;;162692:35;;:9;:35;162691:54;;;;;;;:::i;:::-;;162670:75;;162619:142;162780:25;::::0;::::1;::::0;:29:::1;;::::0;162777:140:::1;;162887:14;162845:56;;162858:8;:25;;;162846:37;;:9;:37;162845:56;;;;;;;:::i;:::-;;162830:71;;162777:140;162952:17;::::0;::::1;::::0;162949:92:::1;;162990:35;163004:4;163011:13;162990:5;:35::i;:::-;163060:16;::::0;::::1;::::0;163057:213:::1;;163118:22;::::0;::::1;::::0;:25;163219:12:::1;::::0;::::1;::::0;163110:144:::1;::::0;:39:::1;::::0;;::::1;::::0;:144:::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;163141:1:::1;163110:144:::0;163141:1;163110:144;;:39;:144;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;163097:157:0;;-1:-1:-1;;163057:213:0::1;163289:22;::::0;::::1;::::0;163286:225:::1;;163353:22;::::0;::::1;::::0;163376:1:::1;163353:25;;;;163345:39;;163414:18;163345:150;;163460:8;:12;;;163345:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;163332:163:0;;-1:-1:-1;;163286:225:0::1;163530:18;::::0;::::1;::::0;163527:217:::1;;163590:22;::::0;::::1;::::0;163613:1:::1;163590:25;;;;163582:39;;163651:14;163582:146;;163693:8;:12;;;163582:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;163569:159:0;;-1:-1:-1;;163527:217:0::1;163776:19;::::0;::::1;::::0;163772:435:::1;;163816:25;163905:1;163888:14;163844:58;;163857:8;:27;;;163845:39;;:9;:39;163844:58;;;;;;;:::i;:::-;;:62;;;;;;;:::i;:::-;163925:264;::::0;;;;164005:4:::1;163925:264;::::0;::::1;21196:34:1::0;;;163925:264:0::1;21266:39:1::0;;;21246:18;;;21239:67;164071:1:0::1;21322:18:1::0;;;21315:34;;;21365:18;;;21358:34;21408:19;;;21401:44;;;;164155:15:0::1;21461:19:1::0;;;21454:35;163844:62:0;;;::::1;::::0;-1:-1:-1;163925:22:0::1;:6;:22;::::0;::::1;::::0;:264;;::::1;::::0;21107:19:1;;163925:264:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;163797:410;163772:435;161076:3142;;;;;;;;;;;;161011:3214;154234:5:::0;154217:7;79820:76;;140509:179;154217:7;:14;;:22;;;;;;;;;;;;;;;;;-1:-1:-1;160937:3288:0:o;32117:184::-;32204:6;:56;;;;-1:-1:-1;32215:11:0;;:16;;:44;;;32246:4;32235:24;;;;;;;;;;;;:::i;:::-;32198:95;;32283:10;;;;;;;;;;;;;;89743:105;89812:28;:5;89832:2;89835:4;89812:19;:28::i;100806:898::-;100876:12;100974:4;100969:3;100966:13;100956:313;;101017:7;101011:4;101004:21;101061:4;101055;101047:19;101102:4;101096;101088:19;101167:3;101160;101153:11;101150:1;101146:19;101143:28;101137:4;101129:43;-1:-1:-1;101218:4:0;101212;101202:21;101245:5;;100956:313;101296:1;101315:40;101329:3;101326:1;101322:11;101315:40;;;101348:1;101341:9;101315:40;;;101382:1;101378:9;101405:14;;;101454:1;101450:15;;;101444:4;101437:29;101502:4;101498:12;;101492:4;101484:27;101543:4;101537;101529:19;101590:1;101584:4;101580:12;101574:4;101566:27;101639:4;101635:12;101629:4;101619:29;;100806:898;-1:-1:-1;;;100806:898:0:o;90518:197::-;90634:5;:72;;90675:17;;90697:1;:8;;;;90695:11;90675:31;:17;:31;90634:72;;;90642:17;;;;90663:1;:8;;;;90642:30;90634:72;90607:100;;;;;;;;;;;;;-1:-1:-1;;90518:197:0:o;87404:119::-;87765:17;;87468:4;;87512:2;87765:24;87793:1;87764:30;;;:35;87492:23;87661:146;87533:120;87765:17;;87598:4;;87642:2;87765:24;87793:1;87764:30;;;:35;87622:23;87661:146;87152:119;87765:17;;87216:4;;87260:2;87765:24;87793:1;87764:30;;;:35;87240:23;87661:146;86748:138;86826:4;86850:13;:4;:11;:13::i;:::-;:28;;;;86867:11;:2;:9;:11::i;87022:122::-;87765:17;;87089:4;;87133:2;87765:24;87793:1;87764:30;;;:35;87113:23;87661:146;86898:116;87765:17;;86960:4;;87004:1;87765:24;87793:1;87764:30;;;:35;86984:22;87661:146;89529:99;89593:27;:5;89613:1;89615:4;89593:19;:27::i;86626:114::-;87765:17;;86686:4;;86730:1;87765:24;87793:1;87764:30;;;:35;86710:22;87661:146;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:330::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;513:2;501:15;518:66;497:88;488:98;;;;588:4;484:109;;269:330;-1:-1:-1;;269:330:1:o;604:220::-;753:2;742:9;735:21;716:4;773:45;814:2;803:9;799:18;791:6;773:45;:::i;829:154::-;915:42;908:5;904:54;897:5;894:65;884:93;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:118::-;1586:5;1579:13;1572:21;1565:5;1562:32;1552:60;;1608:1;1605;1598:12;1623:241;1679:6;1732:2;1720:9;1711:7;1707:23;1703:32;1700:52;;;1748:1;1745;1738:12;1700:52;1787:9;1774:23;1806:28;1828:5;1806:28;:::i;2051:456::-;2128:6;2136;2144;2197:2;2185:9;2176:7;2172:23;2168:32;2165:52;;;2213:1;2210;2203:12;2165:52;2252:9;2239:23;2271:31;2296:5;2271:31;:::i;:::-;2321:5;-1:-1:-1;2378:2:1;2363:18;;2350:32;2391:33;2350:32;2391:33;:::i;:::-;2051:456;;2443:7;;-1:-1:-1;;;2497:2:1;2482:18;;;;2469:32;;2051:456::o;3213:180::-;3272:6;3325:2;3313:9;3304:7;3300:23;3296:32;3293:52;;;3341:1;3338;3331:12;3293:52;-1:-1:-1;3364:23:1;;3213:180;-1:-1:-1;3213:180:1:o;4134:159::-;4201:20;;4261:6;4250:18;;4240:29;;4230:57;;4283:1;4280;4273:12;4230:57;4134:159;;;:::o;4298:319::-;4365:6;4373;4426:2;4414:9;4405:7;4401:23;4397:32;4394:52;;;4442:1;4439;4432:12;4394:52;4481:9;4468:23;4500:31;4525:5;4500:31;:::i;:::-;4550:5;-1:-1:-1;4574:37:1;4607:2;4592:18;;4574:37;:::i;:::-;4564:47;;4298:319;;;;;:::o;4622:274::-;4680:6;4733:2;4721:9;4712:7;4708:23;4704:32;4701:52;;;4749:1;4746;4739:12;4701:52;4788:9;4775:23;4838:8;4831:5;4827:20;4820:5;4817:31;4807:59;;4862:1;4859;4852:12;4901:184;4953:77;4950:1;4943:88;5050:4;5047:1;5040:15;5074:4;5071:1;5064:15;5090:980;5158:6;5211:2;5199:9;5190:7;5186:23;5182:32;5179:52;;;5227:1;5224;5217:12;5179:52;5267:9;5254:23;5296:18;5337:2;5329:6;5326:14;5323:34;;;5353:1;5350;5343:12;5323:34;5391:6;5380:9;5376:22;5366:32;;5436:7;5429:4;5425:2;5421:13;5417:27;5407:55;;5458:1;5455;5448:12;5407:55;5494:2;5481:16;5516:2;5512;5509:10;5506:36;;;5522:18;;:::i;:::-;5656:2;5650:9;5718:4;5710:13;;5561:66;5706:22;;;5730:2;5702:31;5698:40;5686:53;;;5754:18;;;5774:22;;;5751:46;5748:72;;;5800:18;;:::i;:::-;5840:10;5836:2;5829:22;5875:2;5867:6;5860:18;5915:7;5910:2;5905;5901;5897:11;5893:20;5890:33;5887:53;;;5936:1;5933;5926:12;5887:53;5992:2;5987;5983;5979:11;5974:2;5966:6;5962:15;5949:46;6037:1;6015:15;;;6032:2;6011:24;6004:35;;;;-1:-1:-1;6019:6:1;5090:980;-1:-1:-1;;;;;5090:980:1:o;6075:184::-;6133:6;6186:2;6174:9;6165:7;6161:23;6157:32;6154:52;;;6202:1;6199;6192:12;6154:52;6225:28;6243:9;6225:28;:::i;6264:288::-;6322:6;6375:2;6363:9;6354:7;6350:23;6346:32;6343:52;;;6391:1;6388;6381:12;6343:52;6430:9;6417:23;6480:22;6473:5;6469:34;6462:5;6459:45;6449:73;;6518:1;6515;6508:12;6557:247;6616:6;6669:2;6657:9;6648:7;6644:23;6640:32;6637:52;;;6685:1;6682;6675:12;6637:52;6724:9;6711:23;6743:31;6768:5;6743:31;:::i;6906:375::-;6999:5;7022:1;7032:243;7046:4;7043:1;7040:11;7032:243;;;7109:13;;7124:42;7105:62;7093:75;;7191:4;7215:12;;;;7250:15;;;;7066:1;7059:9;7032:243;;7286:1645;7502:13;;2761:4;2750:16;2738:29;;7472:3;7457:19;;7574:4;7566:6;7562:17;7556:24;7589:53;7636:4;7625:9;7621:20;7607:12;3474:6;3463:18;3451:31;;3398:90;7589:53;;7691:4;7683:6;7679:17;7673:24;7706:55;7755:4;7744:9;7740:20;7724:14;3474:6;3463:18;3451:31;;3398:90;7706:55;;7810:4;7802:6;7798:17;7792:24;7825:55;7874:4;7863:9;7859:20;7843:14;3474:6;3463:18;3451:31;;3398:90;7825:55;;7929:4;7921:6;7917:17;7911:24;7944:55;7993:4;7982:9;7978:20;7962:14;3474:6;3463:18;3451:31;;3398:90;7944:55;;8048:4;8040:6;8036:17;8030:24;8063:55;8112:4;8101:9;8097:20;8081:14;3474:6;3463:18;3451:31;;3398:90;8063:55;;8167:4;8159:6;8155:17;8149:24;8182:55;8231:4;8220:9;8216:20;8200:14;3474:6;3463:18;3451:31;;3398:90;8182:55;;8286:4;8278:6;8274:17;8268:24;8301:55;8350:4;8339:9;8335:20;8319:14;3474:6;3463:18;3451:31;;3398:90;8301:55;-1:-1:-1;8375:6:1;8418:15;;;8412:22;3474:6;3463:18;;;8477;;;3451:31;;;;8515:6;8558:15;;;8552:22;3463:18;;;8617;;;3451:31;8655:6;8698:15;;;8692:22;6885:8;6874:20;8757:18;;;6862:33;8795:6;8839:15;;;8833:22;8864:61;8906:18;;;8833:22;8864:61;:::i;:::-;;;7286:1645;;;;:::o;8936:1335::-;9333:66;9325:6;9321:79;9310:9;9303:98;9284:4;9420:2;9458:3;9453:2;9442:9;9438:18;9431:31;9485:46;9526:3;9515:9;9511:19;9503:6;9485:46;:::i;:::-;9579:9;9571:6;9567:22;9562:2;9551:9;9547:18;9540:50;9613:33;9639:6;9631;9613:33;:::i;:::-;9677:2;9662:18;;9655:34;;;9738:42;9726:55;;9720:3;9705:19;;9698:84;9813:3;9798:19;;9791:35;;;9863:22;;;9857:3;9842:19;;9835:51;9935:13;;9957:22;;;10007:2;10033:15;;;;-1:-1:-1;9995:15:1;;;;-1:-1:-1;10076:169:1;10090:6;10087:1;10084:13;10076:169;;;10151:13;;10139:26;;10220:15;;;;10185:12;;;;10112:1;10105:9;10076:169;;;-1:-1:-1;10262:3:1;;8936:1335;-1:-1:-1;;;;;;;;;;;;8936:1335:1:o;10276:156::-;10342:20;;10402:4;10391:16;;10381:27;;10371:55;;10422:1;10419;10412:12;10437:317;10503:6;10511;10564:2;10552:9;10543:7;10539:23;10535:32;10532:52;;;10580:1;10577;10570:12;10532:52;10619:9;10606:23;10638:31;10663:5;10638:31;:::i;:::-;10688:5;-1:-1:-1;10712:36:1;10744:2;10729:18;;10712:36;:::i;10990:280::-;11048:6;11101:2;11089:9;11080:7;11076:23;11072:32;11069:52;;;11117:1;11114;11107:12;11069:52;11156:9;11143:23;11206:14;11199:5;11195:26;11188:5;11185:37;11175:65;;11236:1;11233;11226:12;11275:383;11352:6;11360;11368;11421:2;11409:9;11400:7;11396:23;11392:32;11389:52;;;11437:1;11434;11427:12;11389:52;11476:9;11463:23;11495:31;11520:5;11495:31;:::i;:::-;11545:5;11597:2;11582:18;;11569:32;;-1:-1:-1;11648:2:1;11633:18;;;11620:32;;11275:383;-1:-1:-1;;;11275:383:1:o;11663:734::-;11774:6;11782;11790;11798;11806;11814;11822;11875:3;11863:9;11854:7;11850:23;11846:33;11843:53;;;11892:1;11889;11882:12;11843:53;11931:9;11918:23;11950:31;11975:5;11950:31;:::i;:::-;12000:5;-1:-1:-1;12057:2:1;12042:18;;12029:32;12070:33;12029:32;12070:33;:::i;:::-;12122:7;-1:-1:-1;12176:2:1;12161:18;;12148:32;;-1:-1:-1;12227:2:1;12212:18;;12199:32;;-1:-1:-1;12250:37:1;12282:3;12267:19;;12250:37;:::i;:::-;12240:47;;12334:3;12323:9;12319:19;12306:33;12296:43;;12386:3;12375:9;12371:19;12358:33;12348:43;;11663:734;;;;;;;;;;:::o;12402:388::-;12470:6;12478;12531:2;12519:9;12510:7;12506:23;12502:32;12499:52;;;12547:1;12544;12537:12;12499:52;12586:9;12573:23;12605:31;12630:5;12605:31;:::i;:::-;12655:5;-1:-1:-1;12712:2:1;12697:18;;12684:32;12725:33;12684:32;12725:33;:::i;:::-;12777:7;12767:17;;;12402:388;;;;;:::o;12795:184::-;12847:77;12844:1;12837:88;12944:4;12941:1;12934:15;12968:4;12965:1;12958:15;12984:171;13052:6;13091:10;;;13079;;;13075:27;;13114:12;;;13111:38;;;13129:18;;:::i;:::-;13111:38;12984:171;;;;:::o;13160:184::-;13230:6;13283:2;13271:9;13262:7;13258:23;13254:32;13251:52;;;13299:1;13296;13289:12;13251:52;-1:-1:-1;13322:16:1;;13160:184;-1:-1:-1;13160:184:1:o;13349:::-;13401:77;13398:1;13391:88;13498:4;13495:1;13488:15;13522:4;13519:1;13512:15;13538:125;13603:9;;;13624:10;;;13621:36;;;13637:18;;:::i;14303:306::-;14391:6;14399;14407;14460:2;14448:9;14439:7;14435:23;14431:32;14428:52;;;14476:1;14473;14466:12;14428:52;14505:9;14499:16;14489:26;;14555:2;14544:9;14540:18;14534:25;14524:35;;14599:2;14588:9;14584:18;14578:25;14568:35;;14303:306;;;;;:::o;14614:251::-;14684:6;14737:2;14725:9;14716:7;14712:23;14708:32;14705:52;;;14753:1;14750;14743:12;14705:52;14785:9;14779:16;14804:31;14829:5;14804:31;:::i;16597:213::-;16635:3;16663:22;16720:2;16713:5;16709:14;16747:2;16738:7;16735:15;16732:41;;16753:18;;:::i;:::-;16802:1;16789:15;;16597:213;-1:-1:-1;;;16597:213:1:o;17634:287::-;17763:3;17801:6;17795:13;17817:66;17876:6;17871:3;17864:4;17856:6;17852:17;17817:66;:::i;:::-;17899:16;;;;;17634:287;-1:-1:-1;;17634:287:1:o;18589:184::-;18641:77;18638:1;18631:88;18738:4;18735:1;18728:15;18762:4;18759:1;18752:15;19560:1058;19821:4;19869:3;19858:9;19854:19;19912:26;19904:6;19900:39;19889:9;19882:58;19959:2;19997:6;19992:2;19981:9;19977:18;19970:34;20040:3;20035:2;20024:9;20020:18;20013:31;20064:6;20099;20093:13;20130:6;20122;20115:22;20168:3;20157:9;20153:19;20146:26;;20207:2;20199:6;20195:15;20181:29;;20228:1;20238:218;20252:6;20249:1;20246:13;20238:218;;;20317:13;;20332:42;20313:62;20301:75;;20431:15;;;;20396:12;;;;20274:1;20267:9;20238:218;;;-1:-1:-1;;20524:42:1;20512:55;;;;20507:2;20492:18;;20485:83;-1:-1:-1;;;20599:3:1;20584:19;20577:35;20473:3;19560:1058;-1:-1:-1;;;19560:1058:1:o;21500:245::-;21567:6;21620:2;21608:9;21599:7;21595:23;21591:32;21588:52;;;21636:1;21633;21626:12;21588:52;21668:9;21662:16;21687:28;21709:5;21687:28;:::i
Swarm Source
ipfs://9f3438133a31fabcd186600528d9fee7dfd0c26db84406c2f812a7f9746113b9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.