Contract

0xb52C0eb864722C313D2c084C6FFA2A6e46850c31

Overview

S Balance

Sonic LogoSonic LogoSonic Logo12,678.407863027268500102 S

S Value

-

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy24941942025-01-04 17:54:5843 mins ago1736013298IN
0xb52C0eb8...e46850c31
35 S0.0001021.1
Buy24780482025-01-04 15:10:273 hrs ago1736003427IN
0xb52C0eb8...e46850c31
10 S0.0001021.1
Buy24756862025-01-04 14:41:103 hrs ago1736001670IN
0xb52C0eb8...e46850c31
25 S0.000102011.1
Buy24756572025-01-04 14:40:383 hrs ago1736001638IN
0xb52C0eb8...e46850c31
25 S0.000102011.1
Buy24745532025-01-04 14:26:204 hrs ago1736000780IN
0xb52C0eb8...e46850c31
15 S0.000086041.11
Buy24745182025-01-04 14:25:554 hrs ago1736000755IN
0xb52C0eb8...e46850c31
5 S0.000086021.11
Buy24627812025-01-04 11:49:296 hrs ago1735991369IN
0xb52C0eb8...e46850c31
2 S0.000082811.1
Buy24627552025-01-04 11:49:096 hrs ago1735991349IN
0xb52C0eb8...e46850c31
3 S0.000082811.1
Sell24435512025-01-04 7:05:2011 hrs ago1735974320IN
0xb52C0eb8...e46850c31
0 S0.000095581.1
Sell24317252025-01-04 3:48:2914 hrs ago1735962509IN
0xb52C0eb8...e46850c31
0 S0.000090311.1
Sell24314662025-01-04 3:43:4714 hrs ago1735962227IN
0xb52C0eb8...e46850c31
0 S0.000090331.1
Sell24082332025-01-03 22:03:0920 hrs ago1735941789IN
0xb52C0eb8...e46850c31
0 S0.000090311.1
Sell24074112025-01-03 21:52:2420 hrs ago1735941144IN
0xb52C0eb8...e46850c31
0 S0.000093961.11
Buy23733162025-01-03 16:01:3326 hrs ago1735920093IN
0xb52C0eb8...e46850c31
3 S0.000082811.1
Sell23731362025-01-03 16:00:0626 hrs ago1735920006IN
0xb52C0eb8...e46850c31
0 S0.000095551.1
Buy23724192025-01-03 15:54:4426 hrs ago1735919684IN
0xb52C0eb8...e46850c31
1.4 S0.000082811.1
Sell23723462025-01-03 15:54:0926 hrs ago1735919649IN
0xb52C0eb8...e46850c31
0 S0.000095551.1
Sell23637652025-01-03 14:26:1028 hrs ago1735914370IN
0xb52C0eb8...e46850c31
0 S0.000297553.663
Buy23636912025-01-03 14:25:0528 hrs ago1735914305IN
0xb52C0eb8...e46850c31
0.1 S0.000336343.663
Sell23512642025-01-03 11:51:3830 hrs ago1735905098IN
0xb52C0eb8...e46850c31
0 S0.000094811.12
Sell23464502025-01-03 10:36:1032 hrs ago1735900570IN
0xb52C0eb8...e46850c31
0 S0.000090331.1
Buy23422562025-01-03 9:47:3432 hrs ago1735897654IN
0xb52C0eb8...e46850c31
7 S0.000082811.1
Buy23419382025-01-03 9:44:3032 hrs ago1735897470IN
0xb52C0eb8...e46850c31
1 S0.000082811.1
Sell23417802025-01-03 9:43:0832 hrs ago1735897388IN
0xb52C0eb8...e46850c31
0 S0.000098871.1
Sell23413702025-01-03 9:39:3332 hrs ago1735897173IN
0xb52C0eb8...e46850c31
0 S0.000095541.1
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
24435512025-01-04 7:05:2011 hrs ago1735974320
0xb52C0eb8...e46850c31
1.07130889 S
24317252025-01-04 3:48:2914 hrs ago1735962509
0xb52C0eb8...e46850c31
524.64238745 S
24314662025-01-04 3:43:4714 hrs ago1735962227
0xb52C0eb8...e46850c31
902.69277831 S
24082332025-01-03 22:03:0920 hrs ago1735941789
0xb52C0eb8...e46850c31
32.017425 S
24074112025-01-03 21:52:2420 hrs ago1735941144
0xb52C0eb8...e46850c31
0.95573858 S
23731362025-01-03 16:00:0626 hrs ago1735920006
0xb52C0eb8...e46850c31
3.55310801 S
23723462025-01-03 15:54:0926 hrs ago1735919649
0xb52C0eb8...e46850c31
2.41722256 S
23637652025-01-03 14:26:1028 hrs ago1735914370
0xb52C0eb8...e46850c31
0.0970225 S
23512642025-01-03 11:51:3830 hrs ago1735905098
0xb52C0eb8...e46850c31
9.3294785 S
23464502025-01-03 10:36:1032 hrs ago1735900570
0xb52C0eb8...e46850c31
36.02546047 S
23417802025-01-03 9:43:0832 hrs ago1735897388
0xb52C0eb8...e46850c31
5.3262592 S
23413702025-01-03 9:39:3332 hrs ago1735897173
0xb52C0eb8...e46850c31
1.42168868 S
23241852025-01-03 4:59:5037 hrs ago1735880390
0xb52C0eb8...e46850c31
37.98982476 S
22677682025-01-02 15:16:182 days ago1735830978
0xb52C0eb8...e46850c31
89.55864244 S
22600262025-01-02 13:31:422 days ago1735824702
0xb52C0eb8...e46850c31
0.35545289 S
22587602025-01-02 13:13:532 days ago1735823633
0xb52C0eb8...e46850c31
4.26821624 S
22583862025-01-02 13:10:282 days ago1735823428
0xb52C0eb8...e46850c31
0.28434122 S
22551042025-01-02 12:20:212 days ago1735820421
0xb52C0eb8...e46850c31
3.84396265 S
22525042025-01-02 11:46:132 days ago1735818373
0xb52C0eb8...e46850c31
0.35500153 S
22521872025-01-02 11:41:482 days ago1735818108
0xb52C0eb8...e46850c31
2.12958945 S
22371202025-01-02 8:24:022 days ago1735806242
0xb52C0eb8...e46850c31
65.78138495 S
22370792025-01-02 8:23:362 days ago1735806216
0xb52C0eb8...e46850c31
74.25011953 S
22297312025-01-02 6:41:502 days ago1735800110
0xb52C0eb8...e46850c31
86.96734049 S
22296932025-01-02 6:40:542 days ago1735800054
0xb52C0eb8...e46850c31
98.44993046 S
22240292025-01-02 4:37:152 days ago1735792635
0xb52C0eb8...e46850c31
 Contract Creation0 S
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpookyLaunchpad

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, GNU GPLv3 license
File 1 of 10 : SpookyLaunchpad.sol
pragma solidity 0.8.18;

import { LibUtils } from "./libraries/LibUtils.sol";
import { LibTokens } from "./libraries/LibTokens.sol";
import { IwETH } from "./interfaces/IwETH.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { Token } from "./libraries/Token.sol";
import { INonfungiblePositionManager } from "./interfaces/INonFungiblePositionManager.sol";
import { Vault } from './Vault.sol';

struct Config {
    uint256 creationPrice;
	address nfpManager; //20B
    uint16 txFee; //2B
    uint16 launchFee; //2B
	uint16 farmRatioDenominator; //2B 
    uint256 fakePoolEthMCapThreshold; //32B 
    uint256 tokenSupply;
    uint256 fakePoolBaseEther;
    address weth;
	address v3staker;
}

struct FakePool {
    uint256 fakeEth;
    uint256 ethReserve;
    uint256 tokenReserve;
    address token;
    address pair;
    uint16 sellPenalty;
    bool locked;
}

    struct IncentiveKey {
        address rewardToken;
        address pool;
        uint256 startTime;
        uint256 endTime;
        uint256 vestingPeriod;
        address refundee;
    }

	interface IUniV3Staker {
		function createIncentive(IncentiveKey memory key, uint256 reward) external;
	}

contract SpookyLaunchpad is Ownable {
	event TokenCreated(address creator, address token, uint256 supply, string name, string symbol, string imageCid, string description, string[] links, uint256 price, LibTokens.LpStrategy lpStrategy);
	event TokenLaunched(address creator, address token, address pair);
	event Bought(address buyer, address token, uint256 ethIn, uint256 tokensOut, uint256 newPrice);
	event Sold(address seller, address token, uint256 ethOut, uint256 tokensIn, uint256 newPrice);
	event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); // UNIV2 event for tracking
	event FakePoolCreated(address token, uint16 sellPenalty, uint256 ethReserve, uint256 tokenReserve);
	event FakePoolReserveChanged(address token, uint256 ethReserve, uint256 tokenReserve);
	event FakePoolMCapReached(address token);

	
	mapping(address => FakePool) public poolMap;
    Config public config;
	uint256 public proceeds;

	constructor() Ownable() {
	}

	function create(string calldata name, string calldata symbol, string calldata imageCid, string calldata description, string[] calldata links, uint16 sellPenalty, LibTokens.LpStrategy lpStrategy, uint256 initialBuy) external payable {
		require(
			bytes(name).length <= 18 &&
			bytes(symbol).length <= 18 &&
			bytes(description).length <= 512, 
			"Invalid params"
		);

		require(links.length < 5, "5 links max");
		for (uint8 i = 0; i < links.length; i++) {
			require(bytes(links[i]).length <= 128, "link too long");
		}

		uint256 supply = config.tokenSupply;

		Token token = new Token();
		address tokenAddress = address(token);
		token.emboss(name, symbol, supply, address(this));

		uint256 creationPrice = _create_FakePool(tokenAddress, supply, sellPenalty);

		LibTokens.Storage storage ts = LibTokens.store();

		ts.creatorMap[tokenAddress] = msg.sender;
		ts.lpStrategyMap[tokenAddress] = lpStrategy;
		 
		emit TokenCreated(msg.sender, tokenAddress, config.tokenSupply, name, symbol, imageCid, description, links, creationPrice, lpStrategy);

		uint256 eth = msg.value;

		uint256 creationEth = config.creationPrice;
		require(eth >= creationEth, "Not enough eth to pay the creation price!");

		eth -= creationEth;
		gatherProceeds(creationEth);

		if (initialBuy > 0) {
			eth -= initialBuy;

			(uint256 tokensOut, uint256 newPrice) = _buy_FakePool(tokenAddress, initialBuy); 
			
			Token(token).transfer(msg.sender, tokensOut); // Transfer tokens to buyer
			emit Bought(msg.sender, tokenAddress, initialBuy, tokensOut, newPrice);
		}

		if (eth > 0) {
			(bool sent,) = msg.sender.call{ value: eth }(""); // refund dust
			require(sent, "not sent!");
		}
	}

	function quote(address token, uint256 amount, bool ethOut) public view returns(uint256) {
			return _quote_FakePool(token, amount, ethOut);
	}

	function buy(address token, uint256 min) external payable returns (uint256 tokensOut, uint256 newPrice) {
		(tokensOut, newPrice) = _buy_FakePool(token, msg.value);

		if (min != 0) require(tokensOut >= min, "amount out lower than min");

		Token(token).transfer(msg.sender, tokensOut); // Transfer tokens to buyer
		emit Bought(msg.sender, token, msg.value, tokensOut, newPrice);
		emit Swap(address(this), msg.value, 0, 0, tokensOut, msg.sender);
	}

	function sell(address token, uint256 amount, uint256 min) external returns (uint256 ethOut, uint256 newPrice) {
		(ethOut, newPrice) = _sell_FakePool(token, amount);

		if (min != 0) require(ethOut >= min, "amount out lower than min");

		Token(token).transferFrom(msg.sender, address(this), amount); // Transfer tokens from seller
		(bool sent,) = msg.sender.call{ value: ethOut }(""); require(sent, "eth send failed"); // Transfer eth to seller
		emit Sold(msg.sender, token, ethOut, amount, newPrice);
		emit Swap(msg.sender, 0, amount, ethOut, 0, address(this));
	}

	function launch(address token, uint8 farmType) external onlyOwner payable returns (
            uint256 tokenId,		//0=no farm, 1=token farm 2=wnative farm
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        ){
		(uint256 eth, uint256 tokens) = _launchstats_FakePool(token);
		


		uint256 launchFee = LibUtils.calculatePercentage(config.launchFee, eth);
		gatherProceeds(launchFee);
		eth -= launchFee;

		INonfungiblePositionManager nonfungiblePositionManager = INonfungiblePositionManager(config.nfpManager);
		IUniV3Staker v3staker = IUniV3Staker(config.v3staker);

		Token(token).approve(address(nonfungiblePositionManager), tokens);
		Token(token).launch();

		LibTokens.Storage storage ts = LibTokens.store();

		//LibTokens.LpStrategy lpStrategy = ts.lpStrategyMap[token];

		address wethAdr = config.weth;
		IwETH(wethAdr).deposit{ value: eth }();
		Token(wethAdr).approve(address(nonfungiblePositionManager), eth);
		
		uint amountFarm;
		if(farmType == 1) {
			amountFarm = tokens / config.farmRatioDenominator;
			tokens -= amountFarm;
			Token(token).approve(address(v3staker), amountFarm);
		} else if(farmType == 2) {
			amountFarm = eth / config.farmRatioDenominator;
			eth -= amountFarm;
			Token(wethAdr).approve(address(v3staker), amountFarm);
		}


		(address _token0, address _token1) = token < wethAdr ? (token, wethAdr) : (wethAdr, token);
		(uint _amount0, uint _amount1) = token < wethAdr ? (tokens, eth) : (eth, tokens);




		
		address pair = nonfungiblePositionManager.createAndInitializePoolIfNecessary(_token0, _token1, 3000, calculateSqrtPriceX96(_amount1, _amount0));
		Vault vault = new Vault();

        INonfungiblePositionManager.MintParams memory params =
        INonfungiblePositionManager.MintParams({
            token0: _token0,
            token1: _token1,
            fee: 3000,
            tickLower: -887272 + 52,
            tickUpper: 887272 - 52,
            amount0Desired: _amount0,
            amount1Desired: _amount1,
            amount0Min: _amount0 * 9 / 10,
            amount1Min: _amount1 * 9 / 10,
            recipient: address(vault),
            deadline: block.timestamp
        });

		(tokenId, liquidity, amount0, amount1) = nonfungiblePositionManager.mint(params);
		vault.setup(owner(), ts.creatorMap[token], tokenId);

		// create farm

		if(farmType != 0) {
			IncentiveKey memory incentive = IncentiveKey({
				rewardToken: farmType == 1 ? token : wethAdr,
				pool: pair,
				startTime: block.timestamp + 1,
				endTime: (block.timestamp + 1 + 60 days),
				vestingPeriod: 72 hours,
				refundee: owner()
			});
			v3staker.createIncentive(incentive, amountFarm);
		}

		setPool(token, pair);

		emit TokenLaunched(ts.creatorMap[token], token, pair);
	}

    function calculateSqrtPriceX96(uint256 amount0, uint256 amount1) public pure returns (uint160) {
		return (uint160)(sqrt(amount0 * (2**192 / amount1)));
    }

    function sqrt(uint256 x) internal pure returns (uint256 result) {
        if (x == 0) return 0;
        uint256 z = (x + 1) / 2;
        result = x;
        while (z < result) {
            result = z;
            z = (x / z + z) / 2;
        }
    }


	// // ==================================================================== // //
	// // =========================== FAKE POOLS ============================= // //
	// // ==================================================================== // //


    function getConfig() external view returns (Config memory) {
        return config;
    }

	function setConfig(Config memory _config) public onlyOwner {
		config = _config;
	}

	function swapExactTokensForETH(FakePool storage pool, uint256 tokens) internal returns (uint256) {
		uint256 out = getAmountOut(tokens, pool.tokenReserve, pool.ethReserve);
		pool.tokenReserve += tokens;
		pool.ethReserve -= out;
		emit FakePoolReserveChanged(pool.token, pool.ethReserve, pool.tokenReserve);
		return out;
	}

	function swapExactETHForTokens(FakePool storage pool, uint256 eth) internal returns (uint256) {
		uint256 out = getAmountOut(eth, pool.ethReserve, pool.tokenReserve);
		pool.tokenReserve -= out;
		pool.ethReserve += eth;
		emit FakePoolReserveChanged(pool.token, pool.ethReserve, pool.tokenReserve);
		return out;
	}

	function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) internal pure returns (uint256) {
		uint256 numerator = amountIn * reserveOut;
		uint256 denominator = reserveIn + amountIn;
		return numerator / denominator;
	}

	function price(FakePool storage pool, uint256 amount, bool ethOut) internal view returns (uint256) {
		if (ethOut) {
			return (amount * pool.ethReserve) / pool.tokenReserve;
		} else {
			return (amount * pool.tokenReserve) / pool.ethReserve;
		}
	}

	function checkMarketCapThreshold(FakePool storage pool) internal {
	 	uint256 p = price(pool, 1 ether, true);
		uint256 ethMcap = (config.tokenSupply * p) / 1 ether;

		if (ethMcap >= config.fakePoolEthMCapThreshold) {
			pool.locked = true;
			emit FakePoolMCapReached(pool.token);
		}
	}

	function calculateSellPenalty(FakePool storage pool, uint256 eth) internal view returns (uint256) {
		if (pool.sellPenalty == 0) return 0;
		return LibUtils.calculatePercentage(pool.sellPenalty, eth);
	}

	function deductSellPenalty(FakePool storage pool, uint256 eth) internal returns (uint256) {
		uint256 fee = calculateSellPenalty(pool, eth);
		if (fee == 0) {
			return eth;
		} else {
			pool.ethReserve += fee; // redistribute the penaltyFee back into the ether reserve
			return eth - fee;
		}
	}


	// PUBLIC

	function _quote_FakePool(address token, uint256 amount, bool ethOut) public view returns (uint256) {
		FakePool storage pool = poolMap[token];
		if (ethOut) { // sell
			uint256 eth = getAmountOut(amount, pool.tokenReserve, pool.ethReserve);
			eth -= calculateTxFee(eth);
			eth -= calculateSellPenalty(pool, eth);
			return eth;
		} else { // buy
			uint256 txFee = calculateTxFee(amount);
			return getAmountOut(amount - txFee, pool.ethReserve, pool.tokenReserve);
		}
	}

	function _create_FakePool(address tokenAddress, uint256 supply, uint16 sellPenalty) internal returns (uint256) {
		require(sellPenalty <= 700, "sell penalty invalid");

		FakePool storage pool = poolMap[tokenAddress];
		uint fakeEth = config.fakePoolBaseEther;
		pool.token = tokenAddress;
		pool.fakeEth = fakeEth;
		pool.ethReserve = fakeEth;
		pool.tokenReserve = supply;
		pool.sellPenalty = sellPenalty;

		emit FakePoolCreated(tokenAddress, sellPenalty, pool.ethReserve, pool.tokenReserve);

		return price(pool, 1 ether, true);
	}

	function _launchstats_FakePool(address token) public view returns (uint256, uint256) {
		FakePool storage pool = poolMap[token];
		require(pool.token != address(0));
		return (pool.ethReserve - pool.fakeEth, pool.tokenReserve);
	}

	function _buy_FakePool(address token, uint amount) internal returns (uint256, uint256) {
		FakePool storage pool = poolMap[token];
		require(pool.token != address(0) && !pool.locked, "pool is zero or locked!");

		uint256 ethIn = deductTxFee(amount);
		uint256 tokensOut = swapExactETHForTokens(pool, ethIn);

		checkMarketCapThreshold(pool);

		return (tokensOut, price(pool, 1 ether, true));
	}

	function _sell_FakePool(address token, uint256 amount) internal returns (uint256, uint256) {
		FakePool storage pool = poolMap[token];
		require(pool.token != address(0) && !pool.locked);

		uint256 ethOut = swapExactTokensForETH(pool, amount);
		ethOut = deductTxFee(ethOut);
		ethOut = deductSellPenalty(pool, ethOut);

		require(pool.ethReserve >= pool.fakeEth, "no eth left in pool");
		checkMarketCapThreshold(pool);

		return (ethOut, price(pool, 1 ether, true));
	}

    function setPool(address _token, address _pair) internal {
        poolMap[_token].locked = true;
        poolMap[_token].pair = _pair;
    }

	function calculateTxFee(uint256 eth) public view returns (uint256) {
		return LibUtils.calculatePercentage(config.txFee, eth);
	}

	function gatherProceeds(uint256 amount) internal {
		proceeds += amount;
	}

	function deductTxFee(uint256 eth) internal returns (uint256) {
		uint256 fee = calculateTxFee(eth);
		gatherProceeds(fee);
		return eth - fee;
	}



	function reap() external onlyOwner {
		uint256 eth = proceeds;
		proceeds = 0;
		(bool sent,) = payable(msg.sender).call{ value: eth }("");
		require(sent);
	}

	function unlock(address[] calldata assets) external onlyOwner {
		for (uint256 i = 0; i < assets.length; i++) {
			Token(assets[i]).transfer(msg.sender, Token(assets[i]).balanceOf(address(this)));
		}
	}

	function unlockEth(uint _value) external onlyOwner {
		(bool sent,) = payable(msg.sender).call{ value: _value }("");
		require(sent);
	}

	function manualLock(address _pool, bool _lock) external onlyOwner {
		FakePool storage pool = poolMap[_pool];
		pool.locked = _lock;
	}

	function manualLaunch(address token) external onlyOwner {
		Token(token).launch();
	}

}

File 2 of 10 : LibUtils.sol
// SPDX-License-Identifier: UNKNOWN
pragma solidity ^0.8.18;

library LibUtils {
	function calculatePercentage(uint16 fee, uint256 amount) internal pure returns (uint256) {
		return amount * fee / 1000;
	}

	function ethToUsd(uint256 usdcEthPrice, uint256 amountEth) internal pure returns (uint256) {
		uint256 ethAmount = amountEth;
		return ((ethAmount * usdcEthPrice) / (10**(8+18)) / (10**18));
	}

	function usdToEth(uint256 usdcEthPrice, uint256 usdAmount) internal pure returns (uint256) {
		return ((10**18 * (10**8)) / usdcEthPrice) * usdAmount;
	}

}

File 3 of 10 : LibTokens.sol
// SPDX-License-Identifier: UNKNOWN
pragma solidity ^0.8.18;

library LibTokens {
	bytes32 constant STORAGE_POSITION = keccak256("diamond.tokens.storage");

	struct TeamAllocation {
		uint16 percentage;
		uint8 beneficiary;
	}

	enum LpStrategy {
		Burn,
		Vest
	}

	struct Storage {
		mapping(address => TeamAllocation) _unused_teamAllocMap;
		mapping(address => address) creatorMap;
		mapping(address => LpStrategy) lpStrategyMap;
	}

	function store() internal pure returns (Storage storage s) {
		bytes32 position = STORAGE_POSITION;
		assembly {
			s.slot := position
		}
	}
}

File 4 of 10 : IwETH.sol
// SPDX-License-Identifier: UNKNOWN
pragma solidity ^0.8.18;

interface IwETH {
	function deposit() external payable;
}

File 5 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 10 : Token.sol
// SPDX-License-Identifier: UNKNOWN
pragma solidity ^0.8.18;

import { ERC20 } from "./ERC20.sol";

contract Token is ERC20 {

	string private _name;
	string private _symbol;

	string public junk = "junkdata";

	address internal owner;
	bool internal launched = false;

	function name() public view virtual override returns (string memory) {
		return _name;
	}

	function symbol() public view virtual override returns (string memory) {
		return _symbol;
	}

	function emboss(string calldata n, string calldata s, uint256 supply, address d) external {
		require(totalSupply() == 0);
		owner = d;

		_name = n;
		_symbol = s;

		_mint(msg.sender, supply);
	}

	function launch() external {
		require(msg.sender == owner && launched == false);
		launched = true;
	}

	function _beforeTokenTransfer(address from, address to, uint256 /*amount*/) internal view override {
		if (!launched) {
			require(from == owner || to == owner, "transfer not allowed before launch");
		}
	}

}

File 7 of 10 : INonFungiblePositionManager.sol
interface INonfungiblePositionManager {
    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
    }

    function mint(MintParams calldata params)
        external
        payable
        returns (
            uint256 tokenId,
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

    struct IncreaseLiquidityParams {
        uint256 tokenId;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    function increaseLiquidity(IncreaseLiquidityParams calldata params)
        external
        payable
        returns (uint128 liquidity, uint256 amount0, uint256 amount1);

    struct DecreaseLiquidityParams {
        uint256 tokenId;
        uint128 liquidity;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    function decreaseLiquidity(DecreaseLiquidityParams calldata params)
        external
        payable
        returns (uint256 amount0, uint256 amount1);

    struct CollectParams {
        uint256 tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    function collect(CollectParams calldata params)
        external
        payable
        returns (uint256 amount0, uint256 amount1);

    function createAndInitializePoolIfNecessary(
        address token0,
        address token1,
        uint24 fee,
        uint160 sqrtPriceX96
    ) external payable returns (address pool);

    function positions(uint256 tokenId)
        external
        view
        returns (
            uint96 nonce,
            address operator,
            address token0,
            address token1,
            uint24 fee,
            int24 tickLower,
            int24 tickUpper,
            uint128 liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );

    function WETH9() external returns (address);

    function factory() external returns (address);
}

File 8 of 10 : Vault.sol
// SPDX-License-Identifier: UNKNOWN
pragma solidity ^0.8.18;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
	function transfer(address to, uint256 value) external returns (bool);
}

interface IERC721Receiver {
	function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

interface Manager {
	function WETH9() external view returns (address);

	struct MintParams {
		address token0;
		address token1;
		uint24 fee;
		int24 tickLower;
		int24 tickUpper;
		uint256 amount0Desired;
		uint256 amount1Desired;
		uint256 amount0Min;
		uint256 amount1Min;
		address recipient;
		uint256 deadline;
	}

	struct CollectParams {
		uint256 tokenId;
		address recipient;
		uint128 amount0Max;
		uint128 amount1Max;
	}

	function mint(MintParams memory params) external returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
	function collect(CollectParams calldata params) external returns (uint256 amount0, uint256 amount1);
	function safeTransferFrom(address from, address to, uint256 tokenId) external;
}

contract Vault is IERC721Receiver {

	address public owner;
	address public owner2;
	uint256 public tokenId;
	Manager public nfpm = Manager(0xf807Aca27B1550Fe778fD4E7013BB57480b17fAc);
	uint public withdrawTime;

	constructor() {
	}

    function setup(address _owner, address _owner2, uint _tokenId) external {
        require(owner == address(0));
        owner = _owner;
		owner2 = _owner2;
		tokenId = _tokenId;
		withdrawTime = block.timestamp + 365 days;
    }

	function setNewOwner2(address newOwner) external {
		require(msg.sender == owner2 || msg.sender == owner);
		owner2 = newOwner;
	}

	function collectAndWithdraw(address token0, address token1) external {
		collectFees();
		withdraw(token0, token1);
	}

	function collectFees() public {
		nfpm.collect(
			Manager.CollectParams({
				tokenId: tokenId,
				recipient: address(this),
				amount0Max: type(uint128).max,
				amount1Max: type(uint128).max
			})
		);
	}

	function withdraw(address token0, address token1) public {
		uint amount0 = IERC20(token0).balanceOf(address(this)) / 2;
		uint amount1 = IERC20(token1).balanceOf(address(this)) / 2;

		IERC20(token0).transfer(owner, amount0);
		IERC20(token1).transfer(owner, amount1);

		IERC20(token0).transfer(owner2, IERC20(token0).balanceOf(address(this)));
		IERC20(token1).transfer(owner2, IERC20(token1).balanceOf(address(this)));
	}

	function withdraw2() external {
		require(msg.sender == owner);
		require(block.timestamp >= withdrawTime);
		nfpm.safeTransferFrom(address(this), owner, tokenId);
	}

	function onERC721Received(
		address operator,
		address from,
		uint256 id,
		bytes calldata data
	) external override returns (bytes4) {
		require(tokenId == 0, "Vault: LOCKED");

		tokenId = id;

		return IERC721Receiver.onERC721Received.selector;
	}
	
}

File 9 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 10 of 10 : ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple ERC20 + EIP-2612 implementation.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)
///
/// @dev Note:
/// - The ERC20 standard allows minting and transferring to and from the zero address,
///   minting and transferring zero tokens, as well as self-approvals.
///   For performance, this implementation WILL NOT revert for such actions.
///   Please add any checks with overrides if desired.
/// - The `permit` function uses the ecrecover precompile (0x1).
///
/// If you are overriding:
/// - NEVER violate the ERC20 invariant:
///   the total sum of all balances must be equal to `totalSupply()`.
/// - Check that the overridden function is actually used in the function you want to
///   change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC20 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The total supply has overflowed.
    error TotalSupplyOverflow();

    /// @dev The allowance has overflowed.
    error AllowanceOverflow();

    /// @dev The allowance has underflowed.
    error AllowanceUnderflow();

    /// @dev Insufficient balance.
    error InsufficientBalance();

    /// @dev Insufficient allowance.
    error InsufficientAllowance();

    /// @dev The permit is invalid.
    error InvalidPermit();

    /// @dev The permit has expired.
    error PermitExpired();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Emitted when `amount` tokens is transferred from `from` to `to`.
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
    uint256 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
    uint256 private constant _APPROVAL_EVENT_SIGNATURE =
        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The storage slot for the total supply.
    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;

    /// @dev The balance slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _BALANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let balanceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;

    /// @dev The allowance slot of (`owner`, `spender`) is given by:
    /// ```
    ///     mstore(0x20, spender)
    ///     mstore(0x0c, _ALLOWANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let allowanceSlot := keccak256(0x0c, 0x34)
    /// ```
    uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;

    /// @dev The nonce slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _NONCES_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let nonceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _NONCES_SLOT_SEED = 0x38377508;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`.
    uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901;

    /// @dev `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`.
    bytes32 private constant _DOMAIN_TYPEHASH =
        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    /// @dev `keccak256("1")`.
    bytes32 private constant _VERSION_HASH =
        0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;

    /// @dev `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`.
    bytes32 private constant _PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ERC20 METADATA                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the name of the token.
    function name() public view virtual returns (string memory);

    /// @dev Returns the symbol of the token.
    function symbol() public view virtual returns (string memory);

    /// @dev Returns the decimals places of the token.
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           ERC20                            */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the amount of tokens in existence.
    function totalSupply() public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_TOTAL_SUPPLY_SLOT)
        }
    }

    /// @dev Returns the amount of tokens owned by `owner`.
    function balanceOf(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.
    function allowance(address owner, address spender)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x34))
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
    ///
    /// Emits a {Approval} event.
    function approve(address spender, uint256 amount) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
        }
        return true;
    }

    /// @dev Transfer `amount` tokens from the caller to `to`.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    ///
    /// Emits a {Transfer} event.
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        _beforeTokenTransfer(msg.sender, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, caller())
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(msg.sender, to, amount);
        return true;
    }

    /// @dev Transfers `amount` tokens from `from` to `to`.
    ///
    /// Note: Does not update the allowance if it is the maximum uint256 value.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.
    ///
    /// Emits a {Transfer} event.
    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        _beforeTokenTransfer(from, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the allowance slot and load its value.
            mstore(0x20, caller())
            mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if add(allowance_, 1) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(from, to, amount);
        return true;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          EIP-2612                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev For more performance, override to return the constant value
    /// of `keccak256(bytes(name()))` if `name()` will never change.
    function _constantNameHash() internal view virtual returns (bytes32 result) {}

    /// @dev Returns the current nonce for `owner`.
    /// This value is used to compute the signature for EIP-2612 permit.
    function nonces(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the nonce slot and load its value.
            mstore(0x0c, _NONCES_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`,
    /// authorized by a signed approval by `owner`.
    ///
    /// Emits a {Approval} event.
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        bytes32 nameHash = _constantNameHash();
        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.
        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
        /// @solidity memory-safe-assembly
        assembly {
            // Revert if the block timestamp is greater than `deadline`.
            if gt(timestamp(), deadline) {
                mstore(0x00, 0x1a15a3cc) // `PermitExpired()`.
                revert(0x1c, 0x04)
            }
            let m := mload(0x40) // Grab the free memory pointer.
            // Clean the upper 96 bits.
            owner := shr(96, shl(96, owner))
            spender := shr(96, shl(96, spender))
            // Compute the nonce slot and load its value.
            mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX)
            mstore(0x00, owner)
            let nonceSlot := keccak256(0x0c, 0x20)
            let nonceValue := sload(nonceSlot)
            // Prepare the domain separator.
            mstore(m, _DOMAIN_TYPEHASH)
            mstore(add(m, 0x20), nameHash)
            mstore(add(m, 0x40), _VERSION_HASH)
            mstore(add(m, 0x60), chainid())
            mstore(add(m, 0x80), address())
            mstore(0x2e, keccak256(m, 0xa0))
            // Prepare the struct hash.
            mstore(m, _PERMIT_TYPEHASH)
            mstore(add(m, 0x20), owner)
            mstore(add(m, 0x40), spender)
            mstore(add(m, 0x60), value)
            mstore(add(m, 0x80), nonceValue)
            mstore(add(m, 0xa0), deadline)
            mstore(0x4e, keccak256(m, 0xc0))
            // Prepare the ecrecover calldata.
            mstore(0x00, keccak256(0x2c, 0x42))
            mstore(0x20, and(0xff, v))
            mstore(0x40, r)
            mstore(0x60, s)
            let t := staticcall(gas(), 1, 0, 0x80, 0x20, 0x20)
            // If the ecrecover fails, the returndatasize will be 0x00,
            // `owner` will be checked if it equals the hash at 0x00,
            // which evaluates to false (i.e. 0), and we will revert.
            // If the ecrecover succeeds, the returndatasize will be 0x20,
            // `owner` will be compared against the returned address at 0x20.
            if iszero(eq(mload(returndatasize()), owner)) {
                mstore(0x00, 0xddafbaef) // `InvalidPermit()`.
                revert(0x1c, 0x04)
            }
            // Increment and store the updated nonce.
            sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds.
            // Compute the allowance slot and store the value.
            // The `owner` is already at slot 0x20.
            mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender))
            sstore(keccak256(0x2c, 0x34), value)
            // Emit the {Approval} event.
            log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender)
            mstore(0x40, m) // Restore the free memory pointer.
            mstore(0x60, 0) // Restore the zero pointer.
        }
    }

    /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit.
    function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) {
        bytes32 nameHash = _constantNameHash();
        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.
        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Grab the free memory pointer.
            mstore(m, _DOMAIN_TYPEHASH)
            mstore(add(m, 0x20), nameHash)
            mstore(add(m, 0x40), _VERSION_HASH)
            mstore(add(m, 0x60), chainid())
            mstore(add(m, 0x80), address())
            result := keccak256(m, 0xa0)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL MINT FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Mints `amount` tokens to `to`, increasing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _mint(address to, uint256 amount) internal virtual {
        _beforeTokenTransfer(address(0), to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)
            let totalSupplyAfter := add(totalSupplyBefore, amount)
            // Revert if the total supply overflows.
            if lt(totalSupplyAfter, totalSupplyBefore) {
                mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.
                revert(0x1c, 0x04)
            }
            // Store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(address(0), to, amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL BURN FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Burns `amount` tokens from `from`, reducing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _burn(address from, uint256 amount) internal virtual {
        _beforeTokenTransfer(from, address(0), amount);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, from)
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Subtract and store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount))
            // Emit the {Transfer} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)
        }
        _afterTokenTransfer(from, address(0), amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL TRANSFER FUNCTIONS                 */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Moves `amount` of tokens from `from` to `to`.
    function _transfer(address from, address to, uint256 amount) internal virtual {
        _beforeTokenTransfer(from, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(from, to, amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL ALLOWANCE FUNCTIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and load its value.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if add(allowance_, 1) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.
    ///
    /// Emits a {Approval} event.
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let owner_ := shl(96, owner)
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     HOOKS TO OVERRIDE                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Hook that is called before any transfer of tokens.
    /// This includes minting and burning.
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /// @dev Hook that is called after any transfer of tokens.
    /// This includes minting and burning.
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "ds-test/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/",
    "openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint16","name":"sellPenalty","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"ethReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenReserve","type":"uint256"}],"name":"FakePoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"FakePoolMCapReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenReserve","type":"uint256"}],"name":"FakePoolReserveChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"string","name":"imageCid","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string[]","name":"links","type":"string[]"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"enum LibTokens.LpStrategy","name":"lpStrategy","type":"uint8"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"TokenLaunched","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"_launchstats_FakePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"ethOut","type":"bool"}],"name":"_quote_FakePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"tokensOut","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"calculateSqrtPriceX96","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"eth","type":"uint256"}],"name":"calculateTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint256","name":"creationPrice","type":"uint256"},{"internalType":"address","name":"nfpManager","type":"address"},{"internalType":"uint16","name":"txFee","type":"uint16"},{"internalType":"uint16","name":"launchFee","type":"uint16"},{"internalType":"uint16","name":"farmRatioDenominator","type":"uint16"},{"internalType":"uint256","name":"fakePoolEthMCapThreshold","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"fakePoolBaseEther","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"v3staker","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"imageCid","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string[]","name":"links","type":"string[]"},{"internalType":"uint16","name":"sellPenalty","type":"uint16"},{"internalType":"enum LibTokens.LpStrategy","name":"lpStrategy","type":"uint8"},{"internalType":"uint256","name":"initialBuy","type":"uint256"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"uint256","name":"creationPrice","type":"uint256"},{"internalType":"address","name":"nfpManager","type":"address"},{"internalType":"uint16","name":"txFee","type":"uint16"},{"internalType":"uint16","name":"launchFee","type":"uint16"},{"internalType":"uint16","name":"farmRatioDenominator","type":"uint16"},{"internalType":"uint256","name":"fakePoolEthMCapThreshold","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"fakePoolBaseEther","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"v3staker","type":"address"}],"internalType":"struct Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint8","name":"farmType","type":"uint8"}],"name":"launch","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"manualLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_lock","type":"bool"}],"name":"manualLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolMap","outputs":[{"internalType":"uint256","name":"fakeEth","type":"uint256"},{"internalType":"uint256","name":"ethReserve","type":"uint256"},{"internalType":"uint256","name":"tokenReserve","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint16","name":"sellPenalty","type":"uint16"},{"internalType":"bool","name":"locked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proceeds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"ethOut","type":"bool"}],"name":"quote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"sell","outputs":[{"internalType":"uint256","name":"ethOut","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"creationPrice","type":"uint256"},{"internalType":"address","name":"nfpManager","type":"address"},{"internalType":"uint16","name":"txFee","type":"uint16"},{"internalType":"uint16","name":"launchFee","type":"uint16"},{"internalType":"uint16","name":"farmRatioDenominator","type":"uint16"},{"internalType":"uint256","name":"fakePoolEthMCapThreshold","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"fakePoolBaseEther","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"v3staker","type":"address"}],"internalType":"struct Config","name":"_config","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"unlockEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080806040523461005b5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3613fda90816100618239f35b600080fdfe608060405260043610156200001357600080fd5b6000803560e01c80631683165f146200082d57806332f2bcf214620017b75780634a5e67a1146200174b57806353ae90fb146200171557806355b5ec6414620016f55780635b673532146200166a57806365d4b8b51462000d1657806368a008cf1462000c9f5780636a27246214620009ad578063706d4b881462000974578063715018a6146200091657806379502c55146200088e5780637e0eeadc146200085c5780638da5cb5b146200083357806392f87d7b146200082d578063a000bf4f14620007e2578063b75e23ed146200068b578063c3f909d41462000522578063c72896ac14620004e3578063cce7ec13146200039c578063d791de6314620001f55763f2fde38b146200012657600080fd5b34620001f2576020366003190112620001f2576200014362001f1a565b6200014d6200206f565b6001600160a01b039081169081156200019e57600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b80fd5b5034620001f25760209081600319360112620001f2576004356001600160401b03811162000398576200022d90369060040162001fb0565b9290620002396200206f565b825b84811062000247578380f35b6001600160a01b03602484826200026a62000264868b89620025c8565b620025ef565b16926200027d62000264868b89620025c8565b16604051928380926370a0823160e01b82523060048301525afa9081156200038d57918591879384916200034c575b5060405163a9059cbb60e01b8152336004820152602481019190915292839190829081604481015b03925af1801562000341576200030d575b506000198114620002f9576001016200023b565b634e487b7160e01b84526011600452602484fd5b6200033190843d861162000339575b6200032881836200204d565b8101906200210d565b5038620002e5565b503d6200031c565b6040513d87823e3d90fd5b92809294508391503d831162000385575b6200036981836200204d565b8101031262000381575185918591620002d4620002ac565b8580fd5b503d6200035d565b6040513d88823e3d90fd5b5080fd5b506040366003190112620001f257620003b462001f1a565b60243590620003c43482620023b3565b91909280620004ce575b5060405163a9059cbb60e01b815233600482015260248101849052602081604481886001600160a01b0387165af180156200034157604095927f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c928692620004ab575b5086513381526001600160a01b0391909116602082015234604082015260608101919091526080810184905260a090a18351903482528060208301528482015282606082015233907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803092a382519182526020820152f35b620004c69060203d811162000339576200032881836200204d565b503862000431565b620004dc908410156200216a565b38620003ce565b5034620001f25780600319360112620001f257620005006200206f565b8080808060095481600955335af16200051862002127565b5015620001f25780f35b5034620001f25780600319360112620001f257610120604051620005468162002030565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015201526101406040516200058d8162002030565b6002549081815261ffff60035460018060a01b0381166020840152818160a01c166040840152818160b01c16606084015260c01c16608082015260045460a082015260055460c082015260065460e082015260018060a01b036007541661010082015260018060a01b036008541661012082015260405191825260018060a01b03602082015116602083015261ffff604082015116604083015261ffff606082015116606083015261ffff608082015116608083015260a081015160a083015260c081015160c083015260e081015160e083015260018060a01b036101008201511661010083015261012060018060a01b0391015116610120820152f35b5034620001f257610140366003190112620001f257604051620006ae8162002030565b60043581526001600160a01b036024358181168103620007dd576020830190815260443561ffff8082168203620007dd5760408501918252606435918183168303620007dd57606086019283526084359182168203620007dd576080860191825260a0860160a435815260c087019160c435835260e088019360e435855261010435958887168703620007dd576101008a019687526101243599898b168b03620007dd578998816101208b93019c8d52620007686200206f565b5160025551166003549361ffff60a01b905160a01b169161ffff60b01b905160b01b169261ffff60c01b905160c01b169365ffffffffffff60d01b16171717176003555160045551600555516006555116916001600160601b0360a01b92836007541617600755511690600854161760085580f35b600080fd5b5034620001f2576040366003190112620001f25760206001600160a01b03620008246200081e62000815602435620021b7565b600435620021e8565b6200220a565b16604051908152f35b62001f31565b5034620001f25780600319360112620001f257546040516001600160a01b039091168152602090f35b5034620001f2576020366003190112620001f2576200087a6200206f565b80808080600435335af16200051862002127565b5034620001f25780600319360112620001f257610140600254600354600454906005546006549060018060a01b03938460075416938560085416956040519788528116602088015261ffff90818160a01c166040890152818160b01c16606089015260c01c16608087015260a086015260c085015260e0840152610100830152610120820152f35b5034620001f25780600319360112620001f257620009336200206f565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620001f2576020366003190112620001f25760206103e8620009a461ffff60035460a01c16600435620021e8565b04604051908152f35b5034620001f2576060366003190112620001f257620009cb62001f1a565b6001600160a01b038181168084526001602090815260408520600381015490931694604435939192602435928715158062000c8c575b1562000c885762000abd62000ab6857f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c62000a859a9b600286019062000aad825492600189019e8f94855462000a7c62000a7362000a60838c620021e8565b62000a6c8c86620021fc565b90620021dd565b998a93620021fc565b809455620020e9565b80945560405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a1620025ab565b8262002575565b965481541162000c4d578062000ad762000add92620024f4565b62002346565b948062000c38575b506040516323b872dd60e01b8152336004820152306024820152604481018490529084908290606490829086905af1801562000c2d5762000c0b575b508080808088335af162000b3462002127565b501562000bd457604080513381526001600160a01b039790971660208801528681018690526060870183905260808701859052957f9be8a5ca22b7e6e81f04b5879f0248227bb770114291bd47dfaee4c3a82ad60e9060a090a1855191818352838301528486830152606082015230907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803392a38351928352820152f35b60405162461bcd60e51b815260048101849052600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b62000c2590843d861162000339576200032881836200204d565b503862000b21565b6040513d84823e3d90fd5b62000c46908710156200216a565b3862000ae5565b60405162461bcd60e51b81526004810186905260136024820152721b9bc8195d1a081b19599d081a5b881c1bdbdb606a1b6044820152606490fd5b8280fd5b5060ff600482015460b01c161562000a01565b5034620001f2576020366003190112620001f2578062000cbe62001f1a565b62000cc86200206f565b6001600160a01b0316803b1562000d13578180916004604051809481936301339c2160e01b83525af1801562000c2d5762000d005750f35b62000d0b906200201c565b620001f25780f35b50fd5b506040366003190112620001f25762000d2e62001f1a565b6024359060ff8216820362000c885762000d476200206f565b62000d528162002371565b80928562000d8c600354946103e862000d7361ffff8860b01c1683620021e8565b049062000d8382600954620021fc565b600955620020e9565b60085460405163095ea7b360e01b81526001600160a01b038781166004830152602482018790529295918316926020908290604490829088908a165af180156200163b5762001646575b506001600160a01b0384163b1562000c88576040516301339c2160e01b81528381600481836001600160a01b038a165af19081156200163b57849162001623575b50506007546001600160a01b031696873b156200142657604051630d0e30db60e41b815284816004818a8d5af1908115620003415785916200160b575b505060405163095ea7b360e01b81526001600160a01b038816600482015260248101879052602081604481888d5af180156200034157620015e7575b508360ff8a166001036200155857505062000ec162000eb961ffff60035460c01c1683620021dd565b8092620020e9565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905290959060208180604481010381886001600160a01b038b165af18015620003415762001534575b505b6001600160a01b0385168811156200152a57849588905b6001600160a01b0387168a1115620015235791905b60206001600160a01b0362000f5d6200081e62000f5687620021b7565b86620021e8565b6040516309f56ab160e11b81526001600160a01b03808d1660048301528581166024830152610bb8604483015292909116606482015297889160849183918e165af1958615620014b5578c96620014d4575b506040518061093c8101106001600160401b0361093c83011117620014c05761093c6200260582398061093c810103908df0978815620014b55783600981020460091484151715620014a15782600981020460091483151715620014a15760405190816101608101106001600160401b0361016084011117620013d957600961014094600a82608098610164978396610160890160405260018060a01b0316885260018060a01b03166020880152610bb86040880152620d89b3196060880152620d89b48a8801528060a08801528360c0880152020460e0850152020461010082015260018060a01b03891661012082015242838201528c6040519a8b948593634418b22b60e11b855260018060a01b03815116600486015260018060a01b03602082015116602486015262ffffff6040820151166044860152606081015160020b60648601528781015160020b608486015260a081015160a486015260c081015160c486015260e081015160e486015261010081015161010486015260018060a01b0361012082015116610124860152015161014484015260018060a01b03165af1968715620014965789988a80978199829b6200142a575b5081546001600160a01b0390811690620011838a62001fe3565b5416906001600160a01b0383163b1562001426576040516365f2031160e11b81526001600160a01b0391821660048201529181166024830152604482018e905290918391839160649183918591165af1801562000c2d576200140a575b505060ff811662001297575b5050506001600160a01b038084168952600160205260409098206004018054600162ff000160a01b031916928916928317600160b01b179055506080966001600160801b0393927f3a2480ce53a8c9229556c140c60039b8c13bce2009773b802a638deec98eae1f92606092620012638362001fe3565b54169160405192835260018060a01b031660208301526040820152a160405194855216602084015260408301526060820152f35b60ff1660010362001403575083905b600142014211620013ef57624f1a0142016001420111620013ef578954604051906001600160a01b03166001600160401b0360c0830190811190831117620013d9578b9360c0830160405260018060a01b0316825260018060a01b0386166020830152600142016040830152624f1a01420160608301526203f480608083015260a0820152833b1562000c885760408051638d4502e760e01b815282516001600160a01b039081166004830152602084015181166024830152918301516044820152606083015160648201526080830151608482015260a0909201511660a482015260c481019190915291829060e490829084905af18015620013ce57620013b2575b808080620011ec565b620013be88916200201c565b620013ca5738620013a9565b8680fd5b6040513d8a823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b8a52601160045260248afd5b90620012a6565b62001415906200201c565b62001422578a38620011e0565b8a80fd5b8380fd5b9850995050985095506080853d6080116200148d575b816200144f608093836200204d565b8101031262001489578451956020860151986001600160801b038a168a0362001422578a60606040890151980151989a9798993862001169565b8880fd5b3d915062001440565b6040513d8b823e3d90fd5b634e487b7160e01b8d52601160045260248dfd5b6040513d8e823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b9095506020813d6020116200151a575b81620014f3602093836200204d565b810103126200151657516001600160a01b03811681036200151657943862000faf565b8b80fd5b3d9150620014e4565b9062000f39565b8795859062000f24565b620015509060203d60201162000339576200032881836200204d565b503862000f0b565b915094600260ff8a160362000f0d5790506200158262000eb961ffff60035460c01c1683620021dd565b60405163095ea7b360e01b81526001600160a01b038416600482015260248101839052602081604481888d5af180156200034157620015c3575b5062000f0d565b620015df9060203d60201162000339576200032881836200204d565b5038620015bc565b620016039060203d60201162000339576200032881836200204d565b503862000e90565b62001616906200201c565b6200142657833862000e54565b6200162e906200201c565b62000c8857823862000e17565b6040513d86823e3d90fd5b620016629060203d60201162000339576200032881836200204d565b503862000dd6565b5034620001f2576020366003190112620001f25760e0906001600160a01b039060ff90604090836200169b62001f1a565b1681526001602052208054926001820154916002810154600483600384015416920154936040519687526020870152604086015260608501528116608084015261ffff8160a01c1660a084015260b01c16151560c0820152f35b5034620001f25780600319360112620001f2576020600954604051908152f35b5034620001f2576020366003190112620001f25760406200173f6200173962001f1a565b62002371565b82519182526020820152f35b5034620001f2576040366003190112620001f2576200176962001f1a565b60243590811515809203620007dd57620017826200206f565b6001600160a01b03168252600160205260408220600401805460ff60b01b191660b09290921b60ff60b01b1691909117905580f35b50610100366003190112620001f2576004356001600160401b0381116200039857620017e890369060040162001f80565b6024356001600160401b03811162001426576200180a90369060040162001f80565b926044356001600160401b03811162000381576200182d90369060040162001f80565b906064356001600160401b03811162001f16576200185090369060040162001f80565b90916084356001600160401b03811162001f12576200187490369060040162001fb0565b94909661ffff60a4351660a435036200142257600260c4351015620014225760128911158062001f06575b8062001ef9575b1562001ec357600586101562001e90578a5b8660ff82161062001de9575060055499604051806110648101106001600160401b0361106483011117620014c05761106462002f41823980611064810103908df08015620014b5576001600160a01b03169a8c8c3b15620001f25780620019478e8c8f946200195b95604051968795869485936328869b1960e01b8552608060048601526084850191620020c8565b8281036003190160248401528a8c620020c8565b88604483015230606483015203925af1801562001ddc5762001dc6575b506102bc61ffff60a435161162001d8a578b8d9a989a528b8d60016020526040902091600654826001600160601b0360a01b60038601541617600385015580845580600185015581600285015560048401805461ffff60a01b60a43560a01b169061ffff60a01b191617905560405192835260a43561ffff1660208401526040830152606082015260807f6231ee9c84aaa3e6026eeb8f1f2dffe74e76ddeda12274e216d10df81013b7ae91a162001a309062002346565b9762001a3c8c62001fe3565b336001600160601b0360a01b8254161790558b6000527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db5625602052604060002060ff1981541660c43560ff161790556005549a6040519b8d8d3381526020015260408d01528b6101406060819201528c019062001ab892620020c8565b908a820360808c015262001acc92620020c8565b9088820360a08a015262001ae092620020c8565b9086820360c088015262001af492620020c8565b9284840360e086015280845260208401908060051b8501602001948389915b83831062001d21578a8a7f75028b0a037a0f08db1f929f961f295b07682033cdaf1697062e81cd6085f91b8b808c8c61010083015260c4356101208301520390a1600254349181831062001cca5762001b7c62001b72838695620020e9565b92600954620021fc565b60095560e435908162001be1575b50508062001b955750f35b81808092335af162001ba662002127565b501562001bb05780f35b60405162461bcd60e51b81526020600482015260096024820152686e6f742073656e742160b81b6044820152606490fd5b90918262001bef91620020e9565b9162001bfc8183620023b3565b60405163a9059cbb60e01b8152336004820152602481018390529391906020856044818a875af191821562001cbf577f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c9562001c909362001c9b575b50604080513381526001600160a01b0390951660208601528401949094526060830193909352608082019290925290819060a0820190565b0390a1838062001b8a565b62001cb79060203d60201162000339576200032881836200204d565b508962001c58565b6040513d89823e3d90fd5b60405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f7567682065746820746f2070617920746865206372656174696044820152686f6e2070726963652160b81b6064820152608490fd5b909192939496601f19828203018652601e19833603018835121562001422578288350190602082359201916001600160401b03811162001d8657803603831362001d865762001d776020928392600195620020c8565b99019601949301919062001b13565b8c80fd5b60405162461bcd60e51b81526020600482015260146024820152731cd95b1b081c195b985b1d1e481a5b9d985b1a5960621b6044820152606490fd5b62001dd4909d919d6200201c565b9b3862001978565b8e604051903d90823e3d90fd5b611fe08160051b16890135601e198a36030181121562001d8657890180356001600160401b03811162001e8c576020918282360391011362001e8c5760801062001e58575060ff80911690811462001e4457600101620018b8565b634e487b7160e01b8c52601160045260248cfd5b6064906040519062461bcd60e51b82526004820152600d60248201526c6c696e6b20746f6f206c6f6e6760981b6044820152fd5b8d80fd5b60405162461bcd60e51b815260206004820152600b60248201526a06a40d8d2dcd6e640dac2f60ab1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b6044820152606490fd5b50610200841115620018a6565b5060128a11156200189f565b8980fd5b8780fd5b600435906001600160a01b0382168203620007dd57565b34620007dd576060366003190112620007dd576004356001600160a01b0381168103620007dd57604435908115158203620007dd5760209162001f7891602435906200225c565b604051908152f35b9181601f84011215620007dd578235916001600160401b038311620007dd5760208381860195010111620007dd57565b9181601f84011215620007dd578235916001600160401b038311620007dd576020808501948460051b010111620007dd57565b6001600160a01b031660009081527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db56246020526040902090565b6001600160401b038111620013d957604052565b61014081019081106001600160401b03821117620013d957604052565b90601f801991011681019081106001600160401b03821117620013d957604052565b6000546001600160a01b031633036200208457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b91908203918211620020f757565b634e487b7160e01b600052601160045260246000fd5b90816020910312620007dd57518015158103620007dd5790565b3d1562002165573d906001600160401b038211620013d9576040519162002159601f8201601f1916602001846200204d565b82523d6000602084013e565b606090565b156200217257565b60405162461bcd60e51b815260206004820152601960248201527f616d6f756e74206f7574206c6f776572207468616e206d696e000000000000006044820152606490fd5b8015620021c757600160c01b0490565b634e487b7160e01b600052601260045260246000fd5b8115620021c7570490565b81810292918115918404141715620020f757565b91908201809211620020f757565b90811562002256576001808301808411620020f757811c90835b8483106200223157505050565b909193506200224c84620022468184620021dd565b620021fc565b821c919062002224565b60009150565b6001600160a01b03166000908152600160205260409020909115620022df57620022d5620022cd620022ad620022dc9462000a6c600286015491620022a6600188015482620021e8565b92620021fc565b6103e8620022c561ffff60035460a01c1683620021e8565b0490620020e9565b809262002319565b90620020e9565b90565b62000a6c62002304620022dc936103e8620022c561ffff60035460a01c1683620021e8565b620022a66002600185015494015482620021e8565b6004015460a01c61ffff169081156200233f576103e8916200233b91620021e8565b0490565b5050600090565b6001810154670de0b6b3a76400009080820291820403620020f7576002620022dc92015490620021dd565b6001600160a01b03908116600090815260016020526040902060038101549092911615620007dd576002620023ad6001840154845490620020e9565b92015490565b6001600160a01b039081166000908152600160205260409020600381018054909493908316151580620024e1575b156200249c576200244694620022dc936200248e620024217f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c94620025ab565b9160018601936200246385549460028901956200245a6200245288549e8f85620021e8565b62000a6c8585620021fc565b809e620020e9565b809755620021fc565b80955554169160405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a162000ad781620024f4565b60405162461bcd60e51b815260206004820152601760248201527f706f6f6c206973207a65726f206f72206c6f636b6564210000000000000000006044820152606490fd5b5060ff600483015460b01c1615620023e1565b670de0b6b3a7640000620025156200250c8362002346565b600554620021e8565b046004541115620025235750565b60048101805460ff60b01b1916600160b01b179055600301546040516001600160a01b039190911681527f96c3356711ed5fea211225a23108f7f27b7d4ee8f60bbfe05f98c018a6b3b51890602090a1565b62002581828262002319565b90816200258d57505090565b916001620022dc9301620025a3838254620021fc565b9055620020e9565b620022dc906103e862000d7361ffff60035460a01c1683620021e8565b9190811015620025d95760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b0381168103620007dd579056fe6080806040523461003c57600380546001600160a01b03191673f807aca27b1550fe778fd4e7013bb57480b17fac1790556108fa90816100428239f35b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c918263150b7a021461037c5750816317d70f7c1461035d57816345cb3dde1461033f5781634a41823b1461030d57816352709725146102e45781637303e913146102bb5781638da5cb5b14610293578163c87965721461027a578163cbe40622146101ee578163ea98847b1461013d57508063f5af5f95146100db5763f940e385146100a957600080fd5b346100d7573660031901126100d4576100d16100c3610426565b6100cb610441565b90610573565b80f35b80fd5b5080fd5b82346100d45760203660031901126100d4576100f5610426565b600154906001600160a01b039033828416148015610131575b1561012d5716906bffffffffffffffffffffffff60a01b161760015580f35b8380fd5b5081845416331461010e565b919050346101ea57826003193601126101ea5782546001600160a01b0390811692908490338590036100d757825442106100d757600354169360025490853b156101ea576064908386519788948593632142170760e11b85523089860152602485015260448401525af180156101e0576101b5578380f35b67ffffffffffffffff83116101cd5750523880808380f35b634e487b7160e01b845260419052602483fd5b82513d86823e3d90fd5b8280fd5b8390346100d75760603660031901126100d757610209610426565b610211610441565b83546001600160a01b039291908381166102765783926bffffffffffffffffffffffff60a01b948591169116178555169060015416176001556044356002556301e13380420190814211610263575580f35b634e487b7160e01b835260119052602482fd5b8580fd5b83346100d457806003193601126100d4576100d161048f565b5050346100d757816003193601126100d757905490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760035490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760015490516001600160a01b039091168152602090f35b5050346100d7573660031901126100d4576100d1610329610426565b610331610441565b9061033a61048f565b610573565b9050346101ea57826003193601126101ea5760209250549051908152f35b5050346100d757816003193601126100d7576020906002549051908152f35b915083346100d45760803660031901126100d457610398610426565b506103a1610441565b5060643567ffffffffffffffff8082116101ea57366023830112156101ea57818401359081116101ea57369101602401116100d457506002546103f5576044356002558251630a85bd0160e11b8152602090f35b62461bcd60e51b8252602090820152600d60248201526c15985d5b1d0e881313d0d2d151609a1b6044820152606490fd5b600435906001600160a01b038216820361043c57565b600080fd5b602435906001600160a01b038216820361043c57565b90601f8019910116810190811067ffffffffffffffff82111761047957604052565b634e487b7160e01b600052604160045260246000fd5b60018060a01b038060035416906002546040928351608081019080821067ffffffffffffffff83111761047957859360849285528152600060208201933085528583016fffffffffffffffffffffffffffffffff9081815281606086019181835289519a8b998a9863fc6f786560e01b8a525160048a01525116602488015251166044860152511660648401525af180156105505761052c575050565b813d8311610549575b61053f8183610457565b8101031261043c57565b503d610535565b82513d6000823e3d90fd5b9081602091031261043c5751801515810361043c5790565b604080516370a0823160e01b8082523060048084019190915260209591946001600160a01b03908116928785602481875afa9485156107db57600095610895575b50811692855187815230848201528881602481885afa90811561084057600091610868575b50600054875163a9059cbb60e01b8082529185166001600160a01b031686820190815260019890981c602089015290968a908290819060400103816000875af1801561081857918a9161065e9361084b575b5060005489518981529086166001600160a01b031687820190815260019290921c60208301529283918291604090910190565b03816000895af1801561084057610823575b5081600154169086519088825230858301528982602481845afa91821561081857908a92916000926107e6575b5088518881526001600160a01b0390941686850190815260208101929092528391829060009082906040015b03925af180156107db576107be575b506001541692845195865230828701528686602481865afa9586156107b35790879493929160009761077a575b506000906107338751988996879586948552840160209093929193604081019460018060a01b031681520152565b03925af19081156107705750610747575050565b8161076692903d10610769575b61075e8183610457565b81019061055b565b50565b503d610754565b513d6000823e3d90fd5b9192939482819892983d83116107ac575b6107958183610457565b810103126100d45750519486939291906000610705565b503d61078b565b85513d6000823e3d90fd5b6107d490883d8a116107695761075e8183610457565b50386106d8565b86513d6000823e3d90fd5b91909282813d8311610811575b6107fd8183610457565b810103126100d457505189916106c961069d565b503d6107f3565b88513d6000823e3d90fd5b61083990893d8b116107695761075e8183610457565b5038610670565b87513d6000823e3d90fd5b61086190833d85116107695761075e8183610457565b503861062b565b908982813d831161088e575b61087e8183610457565b810103126100d4575051386105d9565b503d610874565b90948882813d83116108bd575b6108ac8183610457565b810103126100d457505193816105b4565b503d6108a256fea2646970667358221220b2eacaf4f6bdff744cf25dca974d415a638494bbf8a247bd94cabf9e159dbf6264736f6c63430008120033608080604052346100d5576002546001908181811c911680156100cb575b60208210146100b557601f811161006c575b7f6a756e6b646174610000000000000000000000000000000000000000000000106002556003805460ff60a01b19169055610f8983816100db8239f35b6002600052601f0160051c7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace908101905b8181106100aa575061002f565b60008155820161009d565b634e487b7160e01b600052602260045260246000fd5b90607f169061001d565b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826301339c2114610d3857826306fdde0314610c8757508163095ea7b314610c1d57816318160ddd14610bf657816323b872dd14610a9257816328869b191461068d578163313ce567146106715781633644e515146105e957816370a08231146105b55781637ecebe001461058157816395d89b41146104bc5781639df89605146103bf578163a9059cbb146102a3578163d505accf1461010a575063dd62ed3e146100ca57600080fd5b346101065780600319360112610106576020916100e5610dcd565b906100ee610de8565b8452637f5e9f20600c52526034600c20549051908152f35b5080fd5b8383346101065760e036600319011261010657610125610dcd565b61012d610de8565b60443590606435916084359460ff8616860361029f5761014b610e66565b9384516020809601208142116102935782519760c060018060a01b03809916988997169965383775081901600e52878c5288600c2094855480957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528b84019081528d8985017fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc68152606086019c8d469052608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988525252898b525260a082015220604e526042602c208a5260ff16865260a435835260c435606052858060808b60015afa90873d5103610287577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259798999a50019055866303faf4f960a51b1790526034602c2055a380f35b8a63ddafbaef8b52601cfd5b89631a15a3cc8a52601cfd5b8680fd5b8284346103bc57816003193601126103bc576102bd610dcd565b6024359160035460ff8160a01c161561033f575b506387a211a2600c5233815260209485600c2090815490818611610334575084900390555282600c208181540190558252600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b63f4d678b88452601cfd5b6001600160a01b039081163381149182156103b0575b50501561036257856102d1565b835162461bcd60e51b8152602081870152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b84161490508680610355565b80fd5b838334610106578160031936011261010657805190826002546103e181610e2c565b8085529060019081811690811561049e5750600114610443575b5050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b0390f35b634e487b7160e01b815260418552602490fd5b6002865290915084907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8383106104855750506020915083010185806103fb565b81816020929493945483858a010152019101919061046e565b9150506020925060ff191682850152151560051b83010185806103fb565b8383346101065781600319360112610106578051908260018054906104e082610e2c565b8086529181811690811561049e5750600114610527575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b80865290915084907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8383106105685750506020915083010185806103fb565b81816020929493945483858a0101520191019190610551565b5050346101065760203660031901126101065760209161059f610dcd565b906338377508600c525281600c20549051908152f35b505034610106576020366003190112610106576020916105d3610dcd565b906387a211a2600c525281600c20549051908152f35b50503461010657816003193601126101065760209060a0610608610e66565b8381519101208251907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252848201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc683820152466060820152306080820152209051908152f35b5050346101065781600319360112610106576020905160128152f35b905034610a8e576080366003190112610a8e5767ffffffffffffffff8135818111610a8a576106bf9036908401610dfe565b60249491943583811161029f576106d99036908601610dfe565b604435966001600160a01b0360643581811697919590889003610a86576805345cdf77eb68f44c978854610a82576bffffffffffffffffffffffff60a01b6003541617600355818111610a6f57806107318c54610e2c565b93601f94858111610a14575b508c908d8684116001146109a35792610998575b50508160011b916000199060031b1c1916178a555b821161098557819060019361077b8554610e2c565b828111610916575b508a918311600114610899578a9261088e575b5050600019600383901b1c191690821b1790555b60035460ff8160a01c161561081f575b5050508054918383019283106108145750556387a211a2600c523382526020600c20818154019055602052600c5160601c817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a380f35b63e5cfe9578552601cfd5b168015908115610884575b50156108375780806107ba565b5162461bcd60e51b8152602081840152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b905033143861082a565b013590503880610796565b848b528493507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691601f1984168c5b8181106108fe575084116108e4575b505050811b0190556107aa565b0135600019600384901b60f8161c191690553880806108d7565b828401358555879690940193602092830192016108c8565b90919250848b527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68380860160051c8201926020871061097c575b91869588929594930160051c01915b82811061096e575050610783565b8d8155869550879101610960565b92508192610951565b634e487b7160e01b895260418752602489fd5b013590503880610751565b925090601f198416838052600080516020610f34833981519152935b8181106109fc57509084600195949392106109e2575b505050811b018a55610766565b0135600019600384901b60f8161c191690553880806109d5565b919360206001819287870135815501950192016109bf565b9091508c8052600080516020610f348339815191528580850160051c82019260208610610a66575b859493910160051c909101908e5b828210610a5857505061073d565b81558493506001018e610a4a565b92508192610a3c565b634e487b7160e01b8b526041895260248bfd5b8b80fd5b8a80fd5b8480fd5b8280fd5b8284346103bc5760603660031901126103bc57610aad610dcd565b90610ab6610de8565b6044359060035460ff8160a01c1615610b77575b508360601b92602096338852600c94637f5e9f208117865260348620805460018101610b54575b50506387a211a217855287852090815490818611610334575084900390555284822080548201905584525160601c906001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b808711610b6b5786900390556387a211a28a610af1565b836313be252b8652601cfd5b6001600160a01b039081168582168114918215610bea575b505015610b9c5786610aca565b845162461bcd60e51b8152602081880152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b83161490508780610b8f565b5050346101065781600319360112610106576020906805345cdf77eb68f44c549051908152f35b505034610106578060031936011261010657602091610c3a610dcd565b602435908452637f5e9f20600c52338252806034600c20558152602c5160601c907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b84908434610a8e5782600319360112610a8e57828354610ca681610e2c565b8085529060019081811690811561049e5750600114610cf0575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b8580529091508490600080516020610f348339815191525b838310610d1f5750506020915083010185806103fb565b81816020929493945483858a0101520191019190610d08565b84346103bc57806003193601126103bc57600354336001600160a01b0382161480610d76575b156101065760ff60a01b1916600160a01b1760035580f35b5060ff8160a01c1615610d5e565b6020808252825181830181905290939260005b828110610db957505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610d97565b600435906001600160a01b0382168203610de357565b600080fd5b602435906001600160a01b0382168203610de357565b9181601f84011215610de35782359167ffffffffffffffff8311610de35760208381860195010111610de357565b90600182811c92168015610e5c575b6020831014610e4657565b634e487b7160e01b600052602260045260246000fd5b91607f1691610e3b565b6040519060008054610e7781610e2c565b80855290600190818116908115610f155750600114610ecd575b5050829003601f01601f1916820167ffffffffffffffff811183821017610eb757604052565b634e487b7160e01b600052604160045260246000fd5b6000808052919250600080516020610f348339815191525b838310610efc575050602091508301013880610e91565b81816020929493945483858a0101520191019190610ee5565b9150506020925060ff191682850152151560051b8301013880610e9156fe290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563a26469706673582212208f9bf288b987c5af0ece277a334832c942609ba1f8cf36b0792ec82fef1fb4c964736f6c63430008120033a26469706673582212207ce7445468468cf2707c17cfad2258576201bb5ee26dba52bd26a0ac655b66f764736f6c63430008120033

Deployed Bytecode

0x608060405260043610156200001357600080fd5b6000803560e01c80631683165f146200082d57806332f2bcf214620017b75780634a5e67a1146200174b57806353ae90fb146200171557806355b5ec6414620016f55780635b673532146200166a57806365d4b8b51462000d1657806368a008cf1462000c9f5780636a27246214620009ad578063706d4b881462000974578063715018a6146200091657806379502c55146200088e5780637e0eeadc146200085c5780638da5cb5b146200083357806392f87d7b146200082d578063a000bf4f14620007e2578063b75e23ed146200068b578063c3f909d41462000522578063c72896ac14620004e3578063cce7ec13146200039c578063d791de6314620001f55763f2fde38b146200012657600080fd5b34620001f2576020366003190112620001f2576200014362001f1a565b6200014d6200206f565b6001600160a01b039081169081156200019e57600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b80fd5b5034620001f25760209081600319360112620001f2576004356001600160401b03811162000398576200022d90369060040162001fb0565b9290620002396200206f565b825b84811062000247578380f35b6001600160a01b03602484826200026a62000264868b89620025c8565b620025ef565b16926200027d62000264868b89620025c8565b16604051928380926370a0823160e01b82523060048301525afa9081156200038d57918591879384916200034c575b5060405163a9059cbb60e01b8152336004820152602481019190915292839190829081604481015b03925af1801562000341576200030d575b506000198114620002f9576001016200023b565b634e487b7160e01b84526011600452602484fd5b6200033190843d861162000339575b6200032881836200204d565b8101906200210d565b5038620002e5565b503d6200031c565b6040513d87823e3d90fd5b92809294508391503d831162000385575b6200036981836200204d565b8101031262000381575185918591620002d4620002ac565b8580fd5b503d6200035d565b6040513d88823e3d90fd5b5080fd5b506040366003190112620001f257620003b462001f1a565b60243590620003c43482620023b3565b91909280620004ce575b5060405163a9059cbb60e01b815233600482015260248101849052602081604481886001600160a01b0387165af180156200034157604095927f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c928692620004ab575b5086513381526001600160a01b0391909116602082015234604082015260608101919091526080810184905260a090a18351903482528060208301528482015282606082015233907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803092a382519182526020820152f35b620004c69060203d811162000339576200032881836200204d565b503862000431565b620004dc908410156200216a565b38620003ce565b5034620001f25780600319360112620001f257620005006200206f565b8080808060095481600955335af16200051862002127565b5015620001f25780f35b5034620001f25780600319360112620001f257610120604051620005468162002030565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015201526101406040516200058d8162002030565b6002549081815261ffff60035460018060a01b0381166020840152818160a01c166040840152818160b01c16606084015260c01c16608082015260045460a082015260055460c082015260065460e082015260018060a01b036007541661010082015260018060a01b036008541661012082015260405191825260018060a01b03602082015116602083015261ffff604082015116604083015261ffff606082015116606083015261ffff608082015116608083015260a081015160a083015260c081015160c083015260e081015160e083015260018060a01b036101008201511661010083015261012060018060a01b0391015116610120820152f35b5034620001f257610140366003190112620001f257604051620006ae8162002030565b60043581526001600160a01b036024358181168103620007dd576020830190815260443561ffff8082168203620007dd5760408501918252606435918183168303620007dd57606086019283526084359182168203620007dd576080860191825260a0860160a435815260c087019160c435835260e088019360e435855261010435958887168703620007dd576101008a019687526101243599898b168b03620007dd578998816101208b93019c8d52620007686200206f565b5160025551166003549361ffff60a01b905160a01b169161ffff60b01b905160b01b169261ffff60c01b905160c01b169365ffffffffffff60d01b16171717176003555160045551600555516006555116916001600160601b0360a01b92836007541617600755511690600854161760085580f35b600080fd5b5034620001f2576040366003190112620001f25760206001600160a01b03620008246200081e62000815602435620021b7565b600435620021e8565b6200220a565b16604051908152f35b62001f31565b5034620001f25780600319360112620001f257546040516001600160a01b039091168152602090f35b5034620001f2576020366003190112620001f2576200087a6200206f565b80808080600435335af16200051862002127565b5034620001f25780600319360112620001f257610140600254600354600454906005546006549060018060a01b03938460075416938560085416956040519788528116602088015261ffff90818160a01c166040890152818160b01c16606089015260c01c16608087015260a086015260c085015260e0840152610100830152610120820152f35b5034620001f25780600319360112620001f257620009336200206f565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620001f2576020366003190112620001f25760206103e8620009a461ffff60035460a01c16600435620021e8565b04604051908152f35b5034620001f2576060366003190112620001f257620009cb62001f1a565b6001600160a01b038181168084526001602090815260408520600381015490931694604435939192602435928715158062000c8c575b1562000c885762000abd62000ab6857f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c62000a859a9b600286019062000aad825492600189019e8f94855462000a7c62000a7362000a60838c620021e8565b62000a6c8c86620021fc565b90620021dd565b998a93620021fc565b809455620020e9565b80945560405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a1620025ab565b8262002575565b965481541162000c4d578062000ad762000add92620024f4565b62002346565b948062000c38575b506040516323b872dd60e01b8152336004820152306024820152604481018490529084908290606490829086905af1801562000c2d5762000c0b575b508080808088335af162000b3462002127565b501562000bd457604080513381526001600160a01b039790971660208801528681018690526060870183905260808701859052957f9be8a5ca22b7e6e81f04b5879f0248227bb770114291bd47dfaee4c3a82ad60e9060a090a1855191818352838301528486830152606082015230907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803392a38351928352820152f35b60405162461bcd60e51b815260048101849052600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b62000c2590843d861162000339576200032881836200204d565b503862000b21565b6040513d84823e3d90fd5b62000c46908710156200216a565b3862000ae5565b60405162461bcd60e51b81526004810186905260136024820152721b9bc8195d1a081b19599d081a5b881c1bdbdb606a1b6044820152606490fd5b8280fd5b5060ff600482015460b01c161562000a01565b5034620001f2576020366003190112620001f2578062000cbe62001f1a565b62000cc86200206f565b6001600160a01b0316803b1562000d13578180916004604051809481936301339c2160e01b83525af1801562000c2d5762000d005750f35b62000d0b906200201c565b620001f25780f35b50fd5b506040366003190112620001f25762000d2e62001f1a565b6024359060ff8216820362000c885762000d476200206f565b62000d528162002371565b80928562000d8c600354946103e862000d7361ffff8860b01c1683620021e8565b049062000d8382600954620021fc565b600955620020e9565b60085460405163095ea7b360e01b81526001600160a01b038781166004830152602482018790529295918316926020908290604490829088908a165af180156200163b5762001646575b506001600160a01b0384163b1562000c88576040516301339c2160e01b81528381600481836001600160a01b038a165af19081156200163b57849162001623575b50506007546001600160a01b031696873b156200142657604051630d0e30db60e41b815284816004818a8d5af1908115620003415785916200160b575b505060405163095ea7b360e01b81526001600160a01b038816600482015260248101879052602081604481888d5af180156200034157620015e7575b508360ff8a166001036200155857505062000ec162000eb961ffff60035460c01c1683620021dd565b8092620020e9565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905290959060208180604481010381886001600160a01b038b165af18015620003415762001534575b505b6001600160a01b0385168811156200152a57849588905b6001600160a01b0387168a1115620015235791905b60206001600160a01b0362000f5d6200081e62000f5687620021b7565b86620021e8565b6040516309f56ab160e11b81526001600160a01b03808d1660048301528581166024830152610bb8604483015292909116606482015297889160849183918e165af1958615620014b5578c96620014d4575b506040518061093c8101106001600160401b0361093c83011117620014c05761093c6200260582398061093c810103908df0978815620014b55783600981020460091484151715620014a15782600981020460091483151715620014a15760405190816101608101106001600160401b0361016084011117620013d957600961014094600a82608098610164978396610160890160405260018060a01b0316885260018060a01b03166020880152610bb86040880152620d89b3196060880152620d89b48a8801528060a08801528360c0880152020460e0850152020461010082015260018060a01b03891661012082015242838201528c6040519a8b948593634418b22b60e11b855260018060a01b03815116600486015260018060a01b03602082015116602486015262ffffff6040820151166044860152606081015160020b60648601528781015160020b608486015260a081015160a486015260c081015160c486015260e081015160e486015261010081015161010486015260018060a01b0361012082015116610124860152015161014484015260018060a01b03165af1968715620014965789988a80978199829b6200142a575b5081546001600160a01b0390811690620011838a62001fe3565b5416906001600160a01b0383163b1562001426576040516365f2031160e11b81526001600160a01b0391821660048201529181166024830152604482018e905290918391839160649183918591165af1801562000c2d576200140a575b505060ff811662001297575b5050506001600160a01b038084168952600160205260409098206004018054600162ff000160a01b031916928916928317600160b01b179055506080966001600160801b0393927f3a2480ce53a8c9229556c140c60039b8c13bce2009773b802a638deec98eae1f92606092620012638362001fe3565b54169160405192835260018060a01b031660208301526040820152a160405194855216602084015260408301526060820152f35b60ff1660010362001403575083905b600142014211620013ef57624f1a0142016001420111620013ef578954604051906001600160a01b03166001600160401b0360c0830190811190831117620013d9578b9360c0830160405260018060a01b0316825260018060a01b0386166020830152600142016040830152624f1a01420160608301526203f480608083015260a0820152833b1562000c885760408051638d4502e760e01b815282516001600160a01b039081166004830152602084015181166024830152918301516044820152606083015160648201526080830151608482015260a0909201511660a482015260c481019190915291829060e490829084905af18015620013ce57620013b2575b808080620011ec565b620013be88916200201c565b620013ca5738620013a9565b8680fd5b6040513d8a823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b8a52601160045260248afd5b90620012a6565b62001415906200201c565b62001422578a38620011e0565b8a80fd5b8380fd5b9850995050985095506080853d6080116200148d575b816200144f608093836200204d565b8101031262001489578451956020860151986001600160801b038a168a0362001422578a60606040890151980151989a9798993862001169565b8880fd5b3d915062001440565b6040513d8b823e3d90fd5b634e487b7160e01b8d52601160045260248dfd5b6040513d8e823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b9095506020813d6020116200151a575b81620014f3602093836200204d565b810103126200151657516001600160a01b03811681036200151657943862000faf565b8b80fd5b3d9150620014e4565b9062000f39565b8795859062000f24565b620015509060203d60201162000339576200032881836200204d565b503862000f0b565b915094600260ff8a160362000f0d5790506200158262000eb961ffff60035460c01c1683620021dd565b60405163095ea7b360e01b81526001600160a01b038416600482015260248101839052602081604481888d5af180156200034157620015c3575b5062000f0d565b620015df9060203d60201162000339576200032881836200204d565b5038620015bc565b620016039060203d60201162000339576200032881836200204d565b503862000e90565b62001616906200201c565b6200142657833862000e54565b6200162e906200201c565b62000c8857823862000e17565b6040513d86823e3d90fd5b620016629060203d60201162000339576200032881836200204d565b503862000dd6565b5034620001f2576020366003190112620001f25760e0906001600160a01b039060ff90604090836200169b62001f1a565b1681526001602052208054926001820154916002810154600483600384015416920154936040519687526020870152604086015260608501528116608084015261ffff8160a01c1660a084015260b01c16151560c0820152f35b5034620001f25780600319360112620001f2576020600954604051908152f35b5034620001f2576020366003190112620001f25760406200173f6200173962001f1a565b62002371565b82519182526020820152f35b5034620001f2576040366003190112620001f2576200176962001f1a565b60243590811515809203620007dd57620017826200206f565b6001600160a01b03168252600160205260408220600401805460ff60b01b191660b09290921b60ff60b01b1691909117905580f35b50610100366003190112620001f2576004356001600160401b0381116200039857620017e890369060040162001f80565b6024356001600160401b03811162001426576200180a90369060040162001f80565b926044356001600160401b03811162000381576200182d90369060040162001f80565b906064356001600160401b03811162001f16576200185090369060040162001f80565b90916084356001600160401b03811162001f12576200187490369060040162001fb0565b94909661ffff60a4351660a435036200142257600260c4351015620014225760128911158062001f06575b8062001ef9575b1562001ec357600586101562001e90578a5b8660ff82161062001de9575060055499604051806110648101106001600160401b0361106483011117620014c05761106462002f41823980611064810103908df08015620014b5576001600160a01b03169a8c8c3b15620001f25780620019478e8c8f946200195b95604051968795869485936328869b1960e01b8552608060048601526084850191620020c8565b8281036003190160248401528a8c620020c8565b88604483015230606483015203925af1801562001ddc5762001dc6575b506102bc61ffff60a435161162001d8a578b8d9a989a528b8d60016020526040902091600654826001600160601b0360a01b60038601541617600385015580845580600185015581600285015560048401805461ffff60a01b60a43560a01b169061ffff60a01b191617905560405192835260a43561ffff1660208401526040830152606082015260807f6231ee9c84aaa3e6026eeb8f1f2dffe74e76ddeda12274e216d10df81013b7ae91a162001a309062002346565b9762001a3c8c62001fe3565b336001600160601b0360a01b8254161790558b6000527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db5625602052604060002060ff1981541660c43560ff161790556005549a6040519b8d8d3381526020015260408d01528b6101406060819201528c019062001ab892620020c8565b908a820360808c015262001acc92620020c8565b9088820360a08a015262001ae092620020c8565b9086820360c088015262001af492620020c8565b9284840360e086015280845260208401908060051b8501602001948389915b83831062001d21578a8a7f75028b0a037a0f08db1f929f961f295b07682033cdaf1697062e81cd6085f91b8b808c8c61010083015260c4356101208301520390a1600254349181831062001cca5762001b7c62001b72838695620020e9565b92600954620021fc565b60095560e435908162001be1575b50508062001b955750f35b81808092335af162001ba662002127565b501562001bb05780f35b60405162461bcd60e51b81526020600482015260096024820152686e6f742073656e742160b81b6044820152606490fd5b90918262001bef91620020e9565b9162001bfc8183620023b3565b60405163a9059cbb60e01b8152336004820152602481018390529391906020856044818a875af191821562001cbf577f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c9562001c909362001c9b575b50604080513381526001600160a01b0390951660208601528401949094526060830193909352608082019290925290819060a0820190565b0390a1838062001b8a565b62001cb79060203d60201162000339576200032881836200204d565b508962001c58565b6040513d89823e3d90fd5b60405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f7567682065746820746f2070617920746865206372656174696044820152686f6e2070726963652160b81b6064820152608490fd5b909192939496601f19828203018652601e19833603018835121562001422578288350190602082359201916001600160401b03811162001d8657803603831362001d865762001d776020928392600195620020c8565b99019601949301919062001b13565b8c80fd5b60405162461bcd60e51b81526020600482015260146024820152731cd95b1b081c195b985b1d1e481a5b9d985b1a5960621b6044820152606490fd5b62001dd4909d919d6200201c565b9b3862001978565b8e604051903d90823e3d90fd5b611fe08160051b16890135601e198a36030181121562001d8657890180356001600160401b03811162001e8c576020918282360391011362001e8c5760801062001e58575060ff80911690811462001e4457600101620018b8565b634e487b7160e01b8c52601160045260248cfd5b6064906040519062461bcd60e51b82526004820152600d60248201526c6c696e6b20746f6f206c6f6e6760981b6044820152fd5b8d80fd5b60405162461bcd60e51b815260206004820152600b60248201526a06a40d8d2dcd6e640dac2f60ab1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b6044820152606490fd5b50610200841115620018a6565b5060128a11156200189f565b8980fd5b8780fd5b600435906001600160a01b0382168203620007dd57565b34620007dd576060366003190112620007dd576004356001600160a01b0381168103620007dd57604435908115158203620007dd5760209162001f7891602435906200225c565b604051908152f35b9181601f84011215620007dd578235916001600160401b038311620007dd5760208381860195010111620007dd57565b9181601f84011215620007dd578235916001600160401b038311620007dd576020808501948460051b010111620007dd57565b6001600160a01b031660009081527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db56246020526040902090565b6001600160401b038111620013d957604052565b61014081019081106001600160401b03821117620013d957604052565b90601f801991011681019081106001600160401b03821117620013d957604052565b6000546001600160a01b031633036200208457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b91908203918211620020f757565b634e487b7160e01b600052601160045260246000fd5b90816020910312620007dd57518015158103620007dd5790565b3d1562002165573d906001600160401b038211620013d9576040519162002159601f8201601f1916602001846200204d565b82523d6000602084013e565b606090565b156200217257565b60405162461bcd60e51b815260206004820152601960248201527f616d6f756e74206f7574206c6f776572207468616e206d696e000000000000006044820152606490fd5b8015620021c757600160c01b0490565b634e487b7160e01b600052601260045260246000fd5b8115620021c7570490565b81810292918115918404141715620020f757565b91908201809211620020f757565b90811562002256576001808301808411620020f757811c90835b8483106200223157505050565b909193506200224c84620022468184620021dd565b620021fc565b821c919062002224565b60009150565b6001600160a01b03166000908152600160205260409020909115620022df57620022d5620022cd620022ad620022dc9462000a6c600286015491620022a6600188015482620021e8565b92620021fc565b6103e8620022c561ffff60035460a01c1683620021e8565b0490620020e9565b809262002319565b90620020e9565b90565b62000a6c62002304620022dc936103e8620022c561ffff60035460a01c1683620021e8565b620022a66002600185015494015482620021e8565b6004015460a01c61ffff169081156200233f576103e8916200233b91620021e8565b0490565b5050600090565b6001810154670de0b6b3a76400009080820291820403620020f7576002620022dc92015490620021dd565b6001600160a01b03908116600090815260016020526040902060038101549092911615620007dd576002620023ad6001840154845490620020e9565b92015490565b6001600160a01b039081166000908152600160205260409020600381018054909493908316151580620024e1575b156200249c576200244694620022dc936200248e620024217f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c94620025ab565b9160018601936200246385549460028901956200245a6200245288549e8f85620021e8565b62000a6c8585620021fc565b809e620020e9565b809755620021fc565b80955554169160405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a162000ad781620024f4565b60405162461bcd60e51b815260206004820152601760248201527f706f6f6c206973207a65726f206f72206c6f636b6564210000000000000000006044820152606490fd5b5060ff600483015460b01c1615620023e1565b670de0b6b3a7640000620025156200250c8362002346565b600554620021e8565b046004541115620025235750565b60048101805460ff60b01b1916600160b01b179055600301546040516001600160a01b039190911681527f96c3356711ed5fea211225a23108f7f27b7d4ee8f60bbfe05f98c018a6b3b51890602090a1565b62002581828262002319565b90816200258d57505090565b916001620022dc9301620025a3838254620021fc565b9055620020e9565b620022dc906103e862000d7361ffff60035460a01c1683620021e8565b9190811015620025d95760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b0381168103620007dd579056fe6080806040523461003c57600380546001600160a01b03191673f807aca27b1550fe778fd4e7013bb57480b17fac1790556108fa90816100428239f35b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c918263150b7a021461037c5750816317d70f7c1461035d57816345cb3dde1461033f5781634a41823b1461030d57816352709725146102e45781637303e913146102bb5781638da5cb5b14610293578163c87965721461027a578163cbe40622146101ee578163ea98847b1461013d57508063f5af5f95146100db5763f940e385146100a957600080fd5b346100d7573660031901126100d4576100d16100c3610426565b6100cb610441565b90610573565b80f35b80fd5b5080fd5b82346100d45760203660031901126100d4576100f5610426565b600154906001600160a01b039033828416148015610131575b1561012d5716906bffffffffffffffffffffffff60a01b161760015580f35b8380fd5b5081845416331461010e565b919050346101ea57826003193601126101ea5782546001600160a01b0390811692908490338590036100d757825442106100d757600354169360025490853b156101ea576064908386519788948593632142170760e11b85523089860152602485015260448401525af180156101e0576101b5578380f35b67ffffffffffffffff83116101cd5750523880808380f35b634e487b7160e01b845260419052602483fd5b82513d86823e3d90fd5b8280fd5b8390346100d75760603660031901126100d757610209610426565b610211610441565b83546001600160a01b039291908381166102765783926bffffffffffffffffffffffff60a01b948591169116178555169060015416176001556044356002556301e13380420190814211610263575580f35b634e487b7160e01b835260119052602482fd5b8580fd5b83346100d457806003193601126100d4576100d161048f565b5050346100d757816003193601126100d757905490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760035490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760015490516001600160a01b039091168152602090f35b5050346100d7573660031901126100d4576100d1610329610426565b610331610441565b9061033a61048f565b610573565b9050346101ea57826003193601126101ea5760209250549051908152f35b5050346100d757816003193601126100d7576020906002549051908152f35b915083346100d45760803660031901126100d457610398610426565b506103a1610441565b5060643567ffffffffffffffff8082116101ea57366023830112156101ea57818401359081116101ea57369101602401116100d457506002546103f5576044356002558251630a85bd0160e11b8152602090f35b62461bcd60e51b8252602090820152600d60248201526c15985d5b1d0e881313d0d2d151609a1b6044820152606490fd5b600435906001600160a01b038216820361043c57565b600080fd5b602435906001600160a01b038216820361043c57565b90601f8019910116810190811067ffffffffffffffff82111761047957604052565b634e487b7160e01b600052604160045260246000fd5b60018060a01b038060035416906002546040928351608081019080821067ffffffffffffffff83111761047957859360849285528152600060208201933085528583016fffffffffffffffffffffffffffffffff9081815281606086019181835289519a8b998a9863fc6f786560e01b8a525160048a01525116602488015251166044860152511660648401525af180156105505761052c575050565b813d8311610549575b61053f8183610457565b8101031261043c57565b503d610535565b82513d6000823e3d90fd5b9081602091031261043c5751801515810361043c5790565b604080516370a0823160e01b8082523060048084019190915260209591946001600160a01b03908116928785602481875afa9485156107db57600095610895575b50811692855187815230848201528881602481885afa90811561084057600091610868575b50600054875163a9059cbb60e01b8082529185166001600160a01b031686820190815260019890981c602089015290968a908290819060400103816000875af1801561081857918a9161065e9361084b575b5060005489518981529086166001600160a01b031687820190815260019290921c60208301529283918291604090910190565b03816000895af1801561084057610823575b5081600154169086519088825230858301528982602481845afa91821561081857908a92916000926107e6575b5088518881526001600160a01b0390941686850190815260208101929092528391829060009082906040015b03925af180156107db576107be575b506001541692845195865230828701528686602481865afa9586156107b35790879493929160009761077a575b506000906107338751988996879586948552840160209093929193604081019460018060a01b031681520152565b03925af19081156107705750610747575050565b8161076692903d10610769575b61075e8183610457565b81019061055b565b50565b503d610754565b513d6000823e3d90fd5b9192939482819892983d83116107ac575b6107958183610457565b810103126100d45750519486939291906000610705565b503d61078b565b85513d6000823e3d90fd5b6107d490883d8a116107695761075e8183610457565b50386106d8565b86513d6000823e3d90fd5b91909282813d8311610811575b6107fd8183610457565b810103126100d457505189916106c961069d565b503d6107f3565b88513d6000823e3d90fd5b61083990893d8b116107695761075e8183610457565b5038610670565b87513d6000823e3d90fd5b61086190833d85116107695761075e8183610457565b503861062b565b908982813d831161088e575b61087e8183610457565b810103126100d4575051386105d9565b503d610874565b90948882813d83116108bd575b6108ac8183610457565b810103126100d457505193816105b4565b503d6108a256fea2646970667358221220b2eacaf4f6bdff744cf25dca974d415a638494bbf8a247bd94cabf9e159dbf6264736f6c63430008120033608080604052346100d5576002546001908181811c911680156100cb575b60208210146100b557601f811161006c575b7f6a756e6b646174610000000000000000000000000000000000000000000000106002556003805460ff60a01b19169055610f8983816100db8239f35b6002600052601f0160051c7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace908101905b8181106100aa575061002f565b60008155820161009d565b634e487b7160e01b600052602260045260246000fd5b90607f169061001d565b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826301339c2114610d3857826306fdde0314610c8757508163095ea7b314610c1d57816318160ddd14610bf657816323b872dd14610a9257816328869b191461068d578163313ce567146106715781633644e515146105e957816370a08231146105b55781637ecebe001461058157816395d89b41146104bc5781639df89605146103bf578163a9059cbb146102a3578163d505accf1461010a575063dd62ed3e146100ca57600080fd5b346101065780600319360112610106576020916100e5610dcd565b906100ee610de8565b8452637f5e9f20600c52526034600c20549051908152f35b5080fd5b8383346101065760e036600319011261010657610125610dcd565b61012d610de8565b60443590606435916084359460ff8616860361029f5761014b610e66565b9384516020809601208142116102935782519760c060018060a01b03809916988997169965383775081901600e52878c5288600c2094855480957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528b84019081528d8985017fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc68152606086019c8d469052608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988525252898b525260a082015220604e526042602c208a5260ff16865260a435835260c435606052858060808b60015afa90873d5103610287577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259798999a50019055866303faf4f960a51b1790526034602c2055a380f35b8a63ddafbaef8b52601cfd5b89631a15a3cc8a52601cfd5b8680fd5b8284346103bc57816003193601126103bc576102bd610dcd565b6024359160035460ff8160a01c161561033f575b506387a211a2600c5233815260209485600c2090815490818611610334575084900390555282600c208181540190558252600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b63f4d678b88452601cfd5b6001600160a01b039081163381149182156103b0575b50501561036257856102d1565b835162461bcd60e51b8152602081870152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b84161490508680610355565b80fd5b838334610106578160031936011261010657805190826002546103e181610e2c565b8085529060019081811690811561049e5750600114610443575b5050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b0390f35b634e487b7160e01b815260418552602490fd5b6002865290915084907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8383106104855750506020915083010185806103fb565b81816020929493945483858a010152019101919061046e565b9150506020925060ff191682850152151560051b83010185806103fb565b8383346101065781600319360112610106578051908260018054906104e082610e2c565b8086529181811690811561049e5750600114610527575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b80865290915084907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8383106105685750506020915083010185806103fb565b81816020929493945483858a0101520191019190610551565b5050346101065760203660031901126101065760209161059f610dcd565b906338377508600c525281600c20549051908152f35b505034610106576020366003190112610106576020916105d3610dcd565b906387a211a2600c525281600c20549051908152f35b50503461010657816003193601126101065760209060a0610608610e66565b8381519101208251907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252848201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc683820152466060820152306080820152209051908152f35b5050346101065781600319360112610106576020905160128152f35b905034610a8e576080366003190112610a8e5767ffffffffffffffff8135818111610a8a576106bf9036908401610dfe565b60249491943583811161029f576106d99036908601610dfe565b604435966001600160a01b0360643581811697919590889003610a86576805345cdf77eb68f44c978854610a82576bffffffffffffffffffffffff60a01b6003541617600355818111610a6f57806107318c54610e2c565b93601f94858111610a14575b508c908d8684116001146109a35792610998575b50508160011b916000199060031b1c1916178a555b821161098557819060019361077b8554610e2c565b828111610916575b508a918311600114610899578a9261088e575b5050600019600383901b1c191690821b1790555b60035460ff8160a01c161561081f575b5050508054918383019283106108145750556387a211a2600c523382526020600c20818154019055602052600c5160601c817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a380f35b63e5cfe9578552601cfd5b168015908115610884575b50156108375780806107ba565b5162461bcd60e51b8152602081840152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b905033143861082a565b013590503880610796565b848b528493507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691601f1984168c5b8181106108fe575084116108e4575b505050811b0190556107aa565b0135600019600384901b60f8161c191690553880806108d7565b828401358555879690940193602092830192016108c8565b90919250848b527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68380860160051c8201926020871061097c575b91869588929594930160051c01915b82811061096e575050610783565b8d8155869550879101610960565b92508192610951565b634e487b7160e01b895260418752602489fd5b013590503880610751565b925090601f198416838052600080516020610f34833981519152935b8181106109fc57509084600195949392106109e2575b505050811b018a55610766565b0135600019600384901b60f8161c191690553880806109d5565b919360206001819287870135815501950192016109bf565b9091508c8052600080516020610f348339815191528580850160051c82019260208610610a66575b859493910160051c909101908e5b828210610a5857505061073d565b81558493506001018e610a4a565b92508192610a3c565b634e487b7160e01b8b526041895260248bfd5b8b80fd5b8a80fd5b8480fd5b8280fd5b8284346103bc5760603660031901126103bc57610aad610dcd565b90610ab6610de8565b6044359060035460ff8160a01c1615610b77575b508360601b92602096338852600c94637f5e9f208117865260348620805460018101610b54575b50506387a211a217855287852090815490818611610334575084900390555284822080548201905584525160601c906001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b808711610b6b5786900390556387a211a28a610af1565b836313be252b8652601cfd5b6001600160a01b039081168582168114918215610bea575b505015610b9c5786610aca565b845162461bcd60e51b8152602081880152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b83161490508780610b8f565b5050346101065781600319360112610106576020906805345cdf77eb68f44c549051908152f35b505034610106578060031936011261010657602091610c3a610dcd565b602435908452637f5e9f20600c52338252806034600c20558152602c5160601c907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b84908434610a8e5782600319360112610a8e57828354610ca681610e2c565b8085529060019081811690811561049e5750600114610cf0575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b8580529091508490600080516020610f348339815191525b838310610d1f5750506020915083010185806103fb565b81816020929493945483858a0101520191019190610d08565b84346103bc57806003193601126103bc57600354336001600160a01b0382161480610d76575b156101065760ff60a01b1916600160a01b1760035580f35b5060ff8160a01c1615610d5e565b6020808252825181830181905290939260005b828110610db957505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610d97565b600435906001600160a01b0382168203610de357565b600080fd5b602435906001600160a01b0382168203610de357565b9181601f84011215610de35782359167ffffffffffffffff8311610de35760208381860195010111610de357565b90600182811c92168015610e5c575b6020831014610e4657565b634e487b7160e01b600052602260045260246000fd5b91607f1691610e3b565b6040519060008054610e7781610e2c565b80855290600190818116908115610f155750600114610ecd575b5050829003601f01601f1916820167ffffffffffffffff811183821017610eb757604052565b634e487b7160e01b600052604160045260246000fd5b6000808052919250600080516020610f348339815191525b838310610efc575050602091508301013880610e91565b81816020929493945483858a0101520191019190610ee5565b9150506020925060ff191682850152151560051b8301013880610e9156fe290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563a26469706673582212208f9bf288b987c5af0ece277a334832c942609ba1f8cf36b0792ec82fef1fb4c964736f6c63430008120033a26469706673582212207ce7445468468cf2707c17cfad2258576201bb5ee26dba52bd26a0ac655b66f764736f6c63430008120033

Deployed Bytecode Sourcemap

1196:12820:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;;;;2162:22:0;;1196:12820:2;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;2566:40:0;1196:12820:2;2566:40:0;;1196:12820:2;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;1063:62:0;;;;:::i;:::-;13516:13:2;13531:17;;;;;;1196:12820;;;13550:3;-1:-1:-1;;;;;1196:12820:2;13566:9;1196:12820;13566:9;;;;;;:::i;:::-;;:::i;:::-;1196:12820;13604:9;;;;;;;:::i;:::-;1196:12820;;;;;;;;;;13598:41;;13633:4;1196:12820;13598:41;;1196:12820;13598:41;;;;;;;;;;;;;;;;13550:3;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;13560:80:2;;13586:10;1196:12820;13560:80;;1196:12820;;;;;;;;;;;;;;;;;;13560:80;;;;;;;;;;;13550:3;-1:-1:-1;;;1196:12820:2;;;;;;13516:13;;1196:12820;-1:-1:-1;;;1196:12820:2;;;;;;;;13560:80;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;1196:12820;;;;;;;;;13598:41;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1196:12820;;;;;;;;;13560:80;13598:41;;1196:12820;;;;13598:41;;;;;;1196:12820;;;;;;;;;;;;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;;;4201:9;4180:31;4201:9;4180:31;;:::i;:::-;4220:8;;;;4216:68;;1196:12820;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;4289:44:2;;4311:10;1196:12820;4289:44;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;4289:44;;;;;;1196:12820;4289:44;;4370:57;4289:44;;;;;1196:12820;-1:-1:-1;1196:12820:2;;4311:10;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;4201:9;1196:12820;;;;;;;;;;;;;;;;;;;4370:57;1196:12820;;4201:9;;1196:12820;;;;;;;;;;;;;;;;4311:10;4449:4;4436:59;1196:12820;4449:4;4436:59;;1196:12820;;;;;;;;;;4289:44;;;1196:12820;4289:44;;;;;;;;;:::i;:::-;;;;;4216:68;4230:54;4238:16;;;;4230:54;:::i;:::-;4216:68;;;1196:12820;;;;;;;;;;;;;1063:62:0;;:::i;:::-;1196:12820:2;;;;13336:8;1196:12820;;13336:8;1196:12820;13387:10;13379:42;;;;:::i;:::-;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8595:6;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;1196:12820:2;8674:16;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;-1:-1:-1;;;;;7966:34:2;7971:28;7982:16;1196:12820;;7982:16;:::i;:::-;1196:12820;;7971:28;:::i;:::-;7966:34;:::i;:::-;1196:12820;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;1063:62:0;;:::i;:::-;1196:12820:2;;;;;;13729:10;13721:45;;;;:::i;1196:12820::-;;;;;;;;;;;;;;2141:20;1196:12820;;;;;;2141:20;1196:12820;2141:20;1196:12820;;;;;;;;;2141:20;1196:12820;;;;2141:20;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;1196:12820:2;;;-1:-1:-1;;;;;;1196:12820:2;;;;-1:-1:-1;;;;;1196:12820:2;2566:40:0;1196:12820:2;;2566:40:0;1196:12820:2;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;197:4:8;182:12;1196:12820:2;;;;;;;;182:12:8;:::i;:::-;1196:12820:2;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;12446:10;;1196:12820;;;;;;;;;;;;;12446:24;;;;:40;;1196:12820;;;;12589:31;12557:19;8833:17;8934:70;8903:22;8833:17;;;;;1196:12820;8934:70;1196:12820;;8852:15;1196:12820;8852:15;;1196:12820;;;;;8872:27;9557:23;9479:21;;;;:::i;:::-;9526:20;;;;:::i;:::-;9557:23;;:::i;:::-;8872:27;;;;:::i;:::-;1196:12820;;;8903:22;:::i;:::-;1196:12820;;;;;8934:70;;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;8934:70;;;;12557:19;:::i;:::-;12589:31;;:::i;:::-;1196:12820;;;;-1:-1:-1;1196:12820:2;;12716:4;;12742:26;12716:4;;:::i;:::-;12742:26;:::i;:::-;4675:8;;4671:65;;1196:12820;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;4741:60:2;;4767:10;1196:12820;4741:60;;1196:12820;4787:4;1196:12820;;;;;;;;;;;;;;;;;;;4787:4;;4741:60;;;;;;;;1196:12820;4767:10;;;;;;;4851:36;;;;:::i;:::-;;1196:12820;;;;;;4767:10;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;4956:49;;1196:12820;;4956:49;1196:12820;;;;;;;;;;;;;;;;;;;4787:4;4767:10;5014:53;1196:12820;4767:10;5014:53;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;4741:60;;;;;;;;;;;;;:::i;:::-;;;;;;1196:12820;;;;;;;;;4671:65;4685:51;4693:13;;;;4685:51;:::i;:::-;4671:65;;;1196:12820;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;12446:40;12475:11;1196:12820;;12475:11;;1196:12820;;;;12474:12;12446:40;;1196:12820;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;13988:21;;;;;1196:12820;;;;;;;;;;;;;13988:21;;;;;;;;;;1196:12820;;13988:21;;;;:::i;:::-;1196:12820;;13988:21;1196:12820;13988:21;1196:12820;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;;;;;;;;;;;1063:62:0;;:::i;:::-;5362:28:2;;;:::i;:::-;5330:60;1196:12820;;5503:16;1196:12820;;;197:4:8;182:12;1196:12820:2;;;;;182:12:8;;:::i;:::-;1196:12820:2;;13108:18;1196:12820;13108:18;1196:12820;13108:18;:::i;:::-;;1196:12820;5503:16;:::i;:::-;5668:15;1196:12820;;;-1:-1:-1;;;5689:65:2;;-1:-1:-1;;;;;1196:12820:2;;;;5689:65;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;5689:65;;;;;;;;1196:12820;-1:-1:-1;;;;;;1196:12820:2;;5758:21;;;;1196:12820;;-1:-1:-1;;;5758:21:2;;1196:12820;;;;;-1:-1:-1;;;;;1196:12820:2;;5758:21;;;;;;;;;;;1196:12820;-1:-1:-1;;5919:11:2;1196:12820;-1:-1:-1;;;;;1196:12820:2;;5934:38;;;;;1196:12820;;-1:-1:-1;;;5934:38:2;;;1196:12820;;;5934:38;;;;;;;;;;;;;1196:12820;-1:-1:-1;;1196:12820:2;;-1:-1:-1;;;5976:64:2;;-1:-1:-1;;;;;1196:12820:2;;;5976:64;;1196:12820;;;;;;;;;;;5976:64;;;;;;;;;;1196:12820;-1:-1:-1;6047:15:2;1196:12820;;;;6069:13;5448:16;;1196:12820;;6143:20;6102:36;1196:12820;;;;;;6102:36;;:::i;:::-;6143:20;;;:::i;:::-;1196:12820;;-1:-1:-1;;;6168:51:2;;-1:-1:-1;;;;;1196:12820:2;;;6168:51;;1196:12820;;;;;;;;;;;;;;;;6168:51;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;6168:51;;;;;;;;6066:318;;;-1:-1:-1;;;;;1196:12820:2;;6426:15;-1:-1:-1;1196:12820:2;;;6426:53;;;;;-1:-1:-1;;;;;1196:12820:2;;6426:15;-1:-1:-1;1196:12820:2;;;6516:47;;;1196:12820;-1:-1:-1;;;;;7966:34:2;7971:28;7982:16;;;:::i;:::-;7971:28;;:::i;7966:34::-;1196:12820;;-1:-1:-1;;;6589:128:2;;-1:-1:-1;;;;;1196:12820:2;;;;6589:128;;1196:12820;;;;;;;;6669:4;1196:12820;;;;;;;;;;;;;;;;;;;;;6589:128;;;;;;;;;;;6516:47;1196:12820;;;6735:11;;;;;-1:-1:-1;;;;;6735:11:2;;;;;;;;;;;;;;;;;;;;;;;;1196:12820;13108:18;1196:12820;;;13108:18;1196:12820;;;;;;;;13108:18;1196:12820;;;13108:18;1196:12820;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;13108:18;6820:444;1196:12820;7130:2;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;6820:444;;1196:12820;6669:4;1196:12820;6820:444;;1196:12820;6965:12;;1196:12820;6820:444;;1196:12820;7002:11;6820:444;;;1196:12820;6820:444;1196:12820;6820:444;;1196:12820;6820:444;;;;1196:12820;;;;6820:444;;1196:12820;;;6820:444;;;1196:12820;;;;;;;;6820:444;;;1196:12820;7238:15;6820:444;;;1196:12820;;;;;;;;;;;;7310:39;;1196:12820;;;;;;;;;7310:39;;1196:12820;;;;;;;6820:444;;1196:12820;;;;;;;;6820:444;;1196:12820;;;;;;;6820:444;;1196:12820;;;;;;;6820:444;;;1196:12820;;;;;;;;6820:444;;1196:12820;;;;;6820:444;;;1196:12820;;;;;;6820:444;;1196:12820;;;;;6820:444;;;1196:12820;;;;;;;;;;6820:444;;;1196:12820;;;;;;6820:444;1196:12820;;;;;;;;;;;7310:39;;;;;;;;;;;;;;;;;;6516:47;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;;;1196:12820:2;;;;7374:20;;;:::i;:::-;1196:12820;;;-1:-1:-1;;;;;1196:12820:2;;7353:51;;;;1196:12820;;-1:-1:-1;;;7353:51:2;;-1:-1:-1;;;;;1196:12820:2;;;;7353:51;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;7353:51;;;;;;;;6516:47;1196:12820;;;;;7427:331;;6516:47;-1:-1:-1;;;;;;;;1196:12820:2;;;;;;;;;;;;;12846:22;1196:12820;;-1:-1:-1;;;;;;1196:12820:2;;;;;;;-1:-1:-1;;;1196:12820:2;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;;;1196:12820:2;;7792:48;;1196:12820;;7806:20;1196:12820;7806:20;:::i;:::-;1196:12820;;;;;;;;;;;;;;;;;;;;;;7792:48;1196:12820;;;;;;;;;;;;;;;;;;;7427:331;1196:12820;;;6069:13;5448:16;;7514:31;;;;1196:12820;7238:15;1196:12820;7238:15;1196:12820;;;;7238:15;1196:12820;;7238:15;1196:12820;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;-1:-1:-1;;;;;6820:444:2;1196:12820;;;;;;;-1:-1:-1;1196:12820:2;;;;;6820:444;1196:12820;;;;;;;;;;;;;;;;;;;;7482:219;;1196:12820;;7238:15;1196:12820;;7482:219;;1196:12820;;7238:15;1196:12820;;7482:219;;1196:12820;7664:8;1196:12820;7482:219;;1196:12820;;7482:219;;1196:12820;7706:47;;;;;1196:12820;;;-1:-1:-1;;;7706:47:2;;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;7706:47;;1196:12820;;7482:219;;1196:12820;;;;;;;7482:219;;;1196:12820;;;;;;7482:219;;1196:12820;;;;;;7482:219;;1196:12820;;;;;;7482:219;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;7706:47;;;;;;;;7514:31;7427:331;;;;;7706:47;;;;;:::i;:::-;1196:12820;;7706:47;;;1196:12820;;;;7706:47;1196:12820;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;7514:31;;;;7353:51;;;;:::i;:::-;1196:12820;;7353:51;;;;1196:12820;;;;7353:51;1196:12820;;;7310:39;;;;;;;;;;1196:12820;7310:39;;1196:12820;7310:39;;;;;;1196:12820;7310:39;;;:::i;:::-;;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;7310:39;;;;;;;;1196:12820;;;;7310:39;;;-1:-1:-1;7310:39:2;;;1196:12820;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;6735:11;1196:12820;;;;;;;;;6735:11;-1:-1:-1;;;1196:12820:2;;;;;;;;6589:128;;;;1196:12820;6589:128;;1196:12820;6589:128;;;;;;1196:12820;6589:128;;;:::i;:::-;;;1196:12820;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;6589:128;;;;1196:12820;;;;6589:128;;;-1:-1:-1;6589:128:2;;6516:47;;;;6426:53;;;;;;;6168:51;;;1196:12820;6168:51;1196:12820;6168:51;;;;;;;:::i;:::-;;;;;6066:318;1196:12820;;;5448:6;1196:12820;;;6233:13;6066:318;6230:154;1196:12820;;6304:17;6266:33;1196:12820;;;;;;6266:33;;:::i;6304:17::-;1196:12820;;-1:-1:-1;;;6326:53:2;;-1:-1:-1;;;;;1196:12820:2;;;6326:53;;1196:12820;;;;;;;;;;;6326:53;;;;;;;;;;6230:154;;6066:318;;6326:53;;;1196:12820;6326:53;1196:12820;6326:53;;;;;;;:::i;:::-;;;;;5976:64;;;1196:12820;5976:64;1196:12820;5976:64;;;;;;;:::i;:::-;;;;;5934:38;;;;:::i;:::-;1196:12820;;5934:38;;;;5758:21;;;;:::i;:::-;1196:12820;;5758:21;;;;;1196:12820;;;;;;;;;5689:65;;;1196:12820;5689:65;1196:12820;5689:65;;;;;;;:::i;:::-;;;;;1196:12820;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;:::i;:::-;;;;;;;;;;2092:43;1196:12820;2092:43;;1196:12820;2092:43;;;;1196:12820;;2092:43;1196:12820;2092:43;;1196:12820;;2092:43;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2164:23;1196:12820;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;;;;;;;;;;;;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;13902:11;1196:12820;;-1:-1:-1;;;;1196:12820:2;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;1196:12820:2;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2492:2;2470:24;;;:57;;;1196:12820;2470:96;;;1196:12820;;;;2620:1;2605:16;;1196:12820;;;2646:11;2659:16;1196:12820;;;;2659:16;;;1196:12820;2620:1;1196:12820;;;;2805:11;;;;;-1:-1:-1;;;;;2805:11:2;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;2861:49;;;;;;1196:12820;;;;;;;;;;;;;;;;;;;;2861:49;;1196:12820;;2861:49;;1196:12820;;;;;;:::i;:::-;;;;-1:-1:-1;;1196:12820:2;;;;;;;;:::i;:::-;;;;;;2904:4;1196:12820;;;;2861:49;;;;;;;;;;2641:106;1196:12820;11267:3;1196:12820;;;;11252:18;1196:12820;;;;;;;;;;;;;;;;;11364:24;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;11392:10;;1196:12820;;;;11392:10;;1196:12820;;;;11447:15;1196:12820;11447:15;;1196:12820;11476:17;1196:12820;11476:17;;1196:12820;;11506:16;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11546:78;;;11636:26;;;:::i;:::-;3048:27;;;;:::i;:::-;3078:10;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;3092:16;1196:12820;;;;;;;;;;;;;;;;;2620:1;1196:12820;;;;3078:10;;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2620:1;1196:12820;;;;;;;;;;;;;;;;;3148:129;1196:12820;;;;;;;;;;;;;;3148:129;;;1196:12820;;3296:9;;3364:18;;;1196:12820;;13108:18;3433;;;;;:::i;:::-;1196:12820;13108:18;1196:12820;13108:18;:::i;:::-;;1196:12820;;;3491:14;;3487:289;;1196:12820;3784:7;;;3780:117;;1196:12820;;3780:117;3078:10;;;;;3813:33;;;;:::i;:::-;;1196:12820;;;3780:117;1196:12820;;;;-1:-1:-1;;;1196:12820:2;;;;;;;13108:18;1196:12820;;;;-1:-1:-1;;;1196:12820:2;;;;;;;3487:289;3512:17;;;;;;:::i;:::-;3575:39;;;;;:::i;:::-;1196:12820;;-1:-1:-1;;;3624:44:2;;3078:10;1196:12820;3624:44;;1196:12820;;;;;;;;;;;;;;3624:44;1196:12820;3624:44;;;;;;;3706:65;3624:44;3706:65;3624:44;;;3487:289;-1:-1:-1;1196:12820:2;;;3078:10;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3706:65;;;;3487:289;;;;3624:44;;;1196:12820;3624:44;1196:12820;3624:44;;;;;;;:::i;:::-;;;;;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;2861:49;;;;;;;:::i;:::-;;;;;;1196:12820;;;;;;;;;;;2677:3;1196:12820;;2620:1;1196:12820;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;-1:-1:-1;1196:12820:2;;2677:3;1196:12820;;;;;;;;;;;2646:11;;1196:12820;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;2470:96;2534:32;2563:3;2534:32;;;2470:96;;:57;2501:26;2492:2;2501:26;;;2470:57;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;:::o;:::-;;;;;;-1:-1:-1;;1196:12820:2;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;3048:13;1196:12820;;;;;;:::o;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;:::o;1359:130:0:-;1273:6;1196:12820:2;-1:-1:-1;;;;;1196:12820:2;734:10:1;1422:23:0;1196:12820:2;;1359:130:0:o;1196:12820:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1196:12820:2;;;;;;;;-1:-1:-1;;1196:12820:2;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;:::i;:::-;;;;-1:-1:-1;1196:12820:2;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8014:250::-;;8092:6;;8088:20;;8135:1;1196:12820;;;;;;;;;;8151:10;;8178;;;;;;8014:250;;;:::o;8171:87::-;8204:10;;;;8233:9;8204:10;8233:5;;;;:::i;:::-;:9;:::i;:::-;1196:12820;;;;8171:87;;8088:20;8097:1;;-1:-1:-1;8100:8:2:o;10652:474::-;-1:-1:-1;;;;;1196:12820:2;-1:-1:-1;1196:12820:2;;;;;;;;;10652:474;;10797:326;;;10935:31;10897:26;9557:23;10928:38;10857:17;9526:20;10857:17;;;1196:12820;10876:15;9479:21;1196:12820;10876:15;;1196:12820;9479:21;;:::i;:::-;9526:20;;:::i;9557:23::-;197:4:8;182:12;1196:12820:2;13030:12;1196:12820;;;;182:12:8;;:::i;:::-;1196:12820:2;10897:26;;:::i;:::-;10935:31;;;:::i;:::-;10928:38;;:::i;:::-;10971:10;:::o;10797:326::-;9526:20;11067:14;9557:23;1196:12820;197:4:8;182:12;1196:12820:2;13030:12;1196:12820;;;;182:12:8;;:::i;11067:14:2:-;9479:21;11100:17;1196:12820;11083:15;;1196:12820;11100:17;;1196:12820;9479:21;;:::i;10132:203::-;10238:16;;1196:12820;;;;;;10238:21;;10234:35;;197:4:8;182:12;;;;:::i;:::-;1196:12820:2;10132:203;:::o;10234:35::-;10261:8;;-1:-1:-1;10261:8:2;:::o;9587:250::-;11324:7;9724:15;;1196:12820;11648:7;1196:12820;;;;;;;;;;9743:17;9714:46;9743:17;;1196:12820;9714:46;;:::i;11669:230::-;-1:-1:-1;;;;;1196:12820:2;;;-1:-1:-1;1196:12820:2;;;;;;;;;11808:10;;;1196:12820;;;11669:230;1196:12820;11808:24;1196:12820;;11877:17;11845:30;1196:12820;11845:15;;1196:12820;;;11845:30;;:::i;:::-;11877:17;;1196:12820;11669:230;:::o;11902:396::-;-1:-1:-1;;;;;1196:12820:2;;;-1:-1:-1;1196:12820:2;;;;;;;;;12043:10;;;1196:12820;;12043:10;;11902:396;;1196:12820;;12043:24;;;:40;;11902:396;1196:12820;;;9479:21;12132:19;12267:26;12132:19;9253:70;12132:19;9253:70;12132:19;;:::i;:::-;9155:15;1196:12820;9155:15;;1196:12820;9222:22;1196:12820;;9172:17;;;;1196:12820;9194:24;9557:23;1196:12820;;9479:21;;;;:::i;:::-;9526:20;;;;:::i;9557:23::-;9194:24;;;:::i;:::-;1196:12820;;;9222:22;:::i;:::-;1196:12820;;;;;;;;9253:70;;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;9253:70;;;;12238:4;;;:::i;1196:12820::-;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;12043:40;12072:11;1196:12820;12072:11;;;1196:12820;;;;12071:12;12043:40;;9840:289;9934:7;9971:22;9922:26;;;:::i;:::-;9971:18;1196:12820;9971:22;:::i;:::-;1196:12820;10024:31;1196:12820;-1:-1:-1;10013:42:2;10009:117;;9840:289;:::o;10009:117::-;10024:31;10062:11;;1196:12820;;-1:-1:-1;;;;1196:12820:2;-1:-1:-1;;;1196:12820:2;;;9971:18;10110:10;1196:12820;;;-1:-1:-1;;;;;1196:12820:2;;;;;;10090:31;;1196:12820;;10090:31;9840:289::o;10338:298::-;10446:31;;;;:::i;:::-;10485:8;;;;10500:10;;;:::o;10481:152::-;10526:15;;10619:9;10526:15;;:22;1196:12820;;;10526:22;:::i;:::-;1196:12820;;10619:9;:::i;13133:145::-;13265:9;13133:145;197:4:8;182:12;1196:12820:2;13030:12;1196:12820;;;;182:12:8;;:::i;1196:12820:2:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;:::o

Swarm Source

ipfs://7ce7445468468cf2707c17cfad2258576201bb5ee26dba52bd26a0ac655b66f7

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.