ETH Price: $3,940.35 (+1.73%)

Contract

0x078c3203AdCB19480f2cE20bBE11CEa4CE754485
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Launch196946702024-04-20 5:54:11239 days ago1713592451IN
0x078c3203...4CE754485
2 ETH0.039536956.25988707
Launch196917462024-04-19 20:05:11240 days ago1713557111IN
0x078c3203...4CE754485
1 ETH0.061208659.70280981
Launch196914182024-04-19 18:58:47240 days ago1713553127IN
0x078c3203...4CE754485
1 ETH0.059407679.39492634
Launch192921662024-02-23 18:46:11296 days ago1708713971IN
0x078c3203...4CE754485
0.645 ETH0.2087437933.07399871
Launch190856522024-01-25 19:15:11325 days ago1706210111IN
0x078c3203...4CE754485
0.6 ETH0.1488948323.51229553
Launch187839702023-12-14 11:05:11367 days ago1702551911IN
0x078c3203...4CE754485
1 ETH0.2403235138.06119399
Launch187541672023-12-10 6:57:35371 days ago1702191455IN
0x078c3203...4CE754485
1 ETH0.1523869224.11212267
Launch187439002023-12-08 20:24:47373 days ago1702067087IN
0x078c3203...4CE754485
0.8 ETH0.2428440238.40401572
Launch187409232023-12-08 10:24:11373 days ago1702031051IN
0x078c3203...4CE754485
1 ETH0.2435403138.51403145
Launch187368092023-12-07 20:32:11374 days ago1701981131IN
0x078c3203...4CE754485
1 ETH0.3517863855.48331071
Launch187312152023-12-07 1:42:59375 days ago1701913379IN
0x078c3203...4CE754485
1 ETH0.2327392136.80621629
Launch187300032023-12-06 21:39:11375 days ago1701898751IN
0x078c3203...4CE754485
0.8 ETH0.4487088470.96087969
Launch187092362023-12-03 23:49:35378 days ago1701647375IN
0x078c3203...4CE754485
0.7 ETH0.1965876831.12764782
Launch187088152023-12-03 22:24:35378 days ago1701642275IN
0x078c3203...4CE754485
1 ETH0.2452963938.83371078
Launch187074522023-12-03 17:48:47378 days ago1701625727IN
0x078c3203...4CE754485
1.1 ETH0.2354821437.27388182
Launch187021192023-12-02 23:52:11379 days ago1701561131IN
0x078c3203...4CE754485
1 ETH0.2133245933.78823047
Launch187014922023-12-02 21:46:11379 days ago1701553571IN
0x078c3203...4CE754485
1 ETH0.2113524633.35844984
Launch186014532023-11-18 21:39:59393 days ago1700343599IN
0x078c3203...4CE754485
0.5 ETH0.0964978515.32494697
Launch186014132023-11-18 21:31:59393 days ago1700343119IN
0x078c3203...4CE754485
0.5 ETH0.117627218.63028783
Launch186013352023-11-18 21:16:11393 days ago1700342171IN
0x078c3203...4CE754485
0.89 ETH0.118637818.72514026
Launch186012742023-11-18 21:03:59393 days ago1700341439IN
0x078c3203...4CE754485
0.6 ETH0.1395709322.09679832
Launch185981332023-11-18 10:28:59393 days ago1700303339IN
0x078c3203...4CE754485
0.3 ETH0.1049325316.56513705
Launch185979722023-11-18 9:55:59393 days ago1700301359IN
0x078c3203...4CE754485
0.6 ETH0.1131358117.91991044
Launch184970342023-11-04 6:57:23407 days ago1699081043IN
0x078c3203...4CE754485
0 ETH0.1203257313.43913025
Launch184965492023-11-04 5:18:47407 days ago1699075127IN
0x078c3203...4CE754485
0.1 ETH0.0877521112.41229463
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
196946702024-04-20 5:54:11239 days ago1713592451
0x078c3203...4CE754485
2 ETH
196946702024-04-20 5:54:11239 days ago1713592451
0x078c3203...4CE754485
 Contract Creation0 ETH
196917462024-04-19 20:05:11240 days ago1713557111
0x078c3203...4CE754485
1 ETH
196917462024-04-19 20:05:11240 days ago1713557111
0x078c3203...4CE754485
 Contract Creation0 ETH
196914182024-04-19 18:58:47240 days ago1713553127
0x078c3203...4CE754485
1 ETH
196914182024-04-19 18:58:47240 days ago1713553127
0x078c3203...4CE754485
 Contract Creation0 ETH
192921662024-02-23 18:46:11296 days ago1708713971
0x078c3203...4CE754485
0.645 ETH
192921662024-02-23 18:46:11296 days ago1708713971
0x078c3203...4CE754485
 Contract Creation0 ETH
190856522024-01-25 19:15:11325 days ago1706210111
0x078c3203...4CE754485
0.6 ETH
190856522024-01-25 19:15:11325 days ago1706210111
0x078c3203...4CE754485
 Contract Creation0 ETH
187839702023-12-14 11:05:11367 days ago1702551911
0x078c3203...4CE754485
1 ETH
187839702023-12-14 11:05:11367 days ago1702551911
0x078c3203...4CE754485
 Contract Creation0 ETH
187541672023-12-10 6:57:35371 days ago1702191455
0x078c3203...4CE754485
1 ETH
187541672023-12-10 6:57:35371 days ago1702191455
0x078c3203...4CE754485
 Contract Creation0 ETH
187439002023-12-08 20:24:47373 days ago1702067087
0x078c3203...4CE754485
0.8 ETH
187439002023-12-08 20:24:47373 days ago1702067087
0x078c3203...4CE754485
 Contract Creation0 ETH
187409232023-12-08 10:24:11373 days ago1702031051
0x078c3203...4CE754485
1 ETH
187409232023-12-08 10:24:11373 days ago1702031051
0x078c3203...4CE754485
 Contract Creation0 ETH
187368092023-12-07 20:32:11374 days ago1701981131
0x078c3203...4CE754485
1 ETH
187368092023-12-07 20:32:11374 days ago1701981131
0x078c3203...4CE754485
 Contract Creation0 ETH
187312152023-12-07 1:42:59375 days ago1701913379
0x078c3203...4CE754485
1 ETH
187312152023-12-07 1:42:59375 days ago1701913379
0x078c3203...4CE754485
 Contract Creation0 ETH
187300032023-12-06 21:39:11375 days ago1701898751
0x078c3203...4CE754485
0.8 ETH
187300032023-12-06 21:39:11375 days ago1701898751
0x078c3203...4CE754485
 Contract Creation0 ETH
187092362023-12-03 23:49:35378 days ago1701647375
0x078c3203...4CE754485
0.7 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Bakery

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: Bakery.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "./Token.sol";

contract Bakery {

	struct Info {
		Token[] tokens;
		mapping(address => uint256) nonce;
		address template;
		address team;
	}
	Info private info;


	constructor() {
		Token _template = new Token();
		_template.lock();
		info.template = address(_template);
		Team _team = new Team();
		_team.initialize(msg.sender);
		info.team = address(_team);
	}
	
	function salt() public returns (bytes32) {
		return keccak256(abi.encodePacked(msg.sender, info.nonce[msg.sender]++));
	}

	function launch(bool _deployProxy, string memory _name, string memory _symbol, uint256 _totalSupply, uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _concentratedPercent, uint256 _creatorFee) external payable returns (address) {
		Token _token;
		{
			bytes32 _salt = salt();
			if (_deployProxy) {
				address _proxy;
				bytes20 _template = bytes20(info.template);
				assembly {
					let _clone := mload(0x40)
					mstore(_clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
					mstore(add(_clone, 0x14), _template)
					mstore(add(_clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
					_proxy := create2(0, _clone, 0x37, _salt)
				}
				_token = Token(_proxy);
			} else {
				_token = new Token{salt:_salt}();
			}
		}
		_token.initialize{value:msg.value}(msg.sender, _name, _symbol, _totalSupply, _initialMarketCap, _upperMarketCap, _concentratedPercent, _creatorFee);
		info.tokens.push(_token);
		return address(_token);
	}


	function template() public view returns (address) {
		return info.template;
	}

	function teamTemplate() public view returns (address) {
		return info.team;
	}
	
	function totalTokens() public view returns (uint256) {
		return info.tokens.length;
	}

	function tokenAtIndex(uint256 _index) public view returns (Token) {
		return info.tokens[_index];
	}

	function allTokens() public view returns (Token[] memory) {
		return info.tokens;
	}
}

File 2 of 2: Token.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface Router {
	struct ExactInputSingleParams {
		address tokenIn;
		address tokenOut;
		uint24 fee;
		address recipient;
		uint256 amountIn;
		uint256 amountOutMinimum;
		uint160 sqrtPriceLimitX96;
	}
	function factory() external view returns (address);
	function positionManager() external view returns (address);
	function WETH9() external view returns (address);
	function exactInputSingle(ExactInputSingleParams calldata) external payable returns (uint256);
}

interface Factory {
	function createPool(address _tokenA, address _tokenB, uint24 _fee) external returns (address);
}

interface Pool {
	function initialize(uint160 _sqrtPriceX96) external;
}

interface PositionManager {
	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 calldata) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
	function collect(CollectParams calldata) external payable returns (uint256 amount0, uint256 amount1);
}

interface ERC20 {
	function balanceOf(address) external view returns (uint256);
	function transfer(address, uint256) external returns (bool);
}

interface WETH is ERC20 {
	function withdraw(uint256) external;
}


contract Team {

	Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);

	struct Share {
		address payable user;
		uint256 shares;
	}
	Share[] public shares;
	uint256 public totalShares;
	ERC20 public token;


	function initialize(address _creator) external {
		require(totalShares == 0);
		token = ERC20(msg.sender);
		_addShare(_creator, 3);
		_addShare(0xe6c791FBd46dB3f4EdA5f7Bb76474F4FA530733E, 2);
		_addShare(0xc28C9da0F8a500DFfC16Ff09a3DD1Cc4c530D346, 1);
	}

	receive() external payable {}

	function withdrawETH() public {
		uint256 _balance = address(this).balance;
		if (_balance > 0) {
			for (uint256 i = 0; i < shares.length; i++) {
				Share memory _share = shares[i];
				!_share.user.send(_balance * _share.shares / totalShares);
			}
		}
	}

	function withdrawToken(ERC20 _token) public {
		WETH _weth = WETH(ROUTER.WETH9());
		if (address(_token) == address(_weth)) {
			_weth.withdraw(_weth.balanceOf(address(this)));
			withdrawETH();
		} else {
			uint256 _balance = _token.balanceOf(address(this));
			if (_balance > 0) {
				for (uint256 i = 0; i < shares.length; i++) {
					Share memory _share = shares[i];
					_token.transfer(_share.user, _balance * _share.shares / totalShares);
				}
			}
		}
	}

	function withdrawWETH() public {
		withdrawToken(ERC20(ROUTER.WETH9()));
	}

	function withdrawFees() external {
		withdrawWETH();
		withdrawToken(token);
	}


	function _addShare(address _user, uint256 _shares) internal {
		shares.push(Share(payable(_user), _shares));
		totalShares += _shares;
	}
}


contract Token {

	uint256 constant private UINT_MAX = type(uint256).max;
	uint128 constant private UINT128_MAX = type(uint128).max;
	uint256 constant private MAX_NAME_LENGTH = 32;
	uint256 constant private MIN_SUPPLY = 1e16; // 0.01 tokens
	uint256 constant private MAX_SUPPLY = 1e33; // 1 quadrillion tokens
	uint256 constant private PERCENT_PRECISION = 1000; // 1 = 0.1%
	Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);

	int24 constant internal MIN_TICK = -887272;
	int24 constant internal MAX_TICK = -MIN_TICK;
	uint160 constant internal MIN_SQRT_RATIO = 4295128739;
	uint160 constant internal MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;

	string public name;
	string public symbol;
	uint8 constant public decimals = 18;

	string constant public source = "Created with Bossman's Bakery (bakery.mullet.capital)!";


	struct User {
		uint256 balance;
		mapping(address => uint256) allowance;
	}

	struct Info {
		bool locked;
		Team team;
		address pool;
		address creator;
		uint256 totalSupply;
		uint256 initialMarketCap;
		uint256 upperMarketCap;
		uint256 concentratedPercent;
		uint256 creatorFee;
		mapping(address => User) users;
		uint256 lowerPositionId;
		uint256 upperPositionId;
	}
	Info private info;


	event Transfer(address indexed from, address indexed to, uint256 tokens);
	event Approval(address indexed owner, address indexed spender, uint256 tokens);

	
	function lock() external {
		require(!info.locked);
		require(totalSupply() == 0);
		info.locked = true;
	}
	
	function initialize(address _creator, string memory _name, string memory _symbol, uint256 _totalSupply, uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _concentratedPercent, uint256 _creatorFee) external payable {
		require(!info.locked);
		require(totalSupply() == 0);
		require(bytes(_name).length > 0 && bytes(_name).length <= MAX_NAME_LENGTH);
		require(bytes(_symbol).length > 0 && bytes(_symbol).length <= MAX_NAME_LENGTH);
		require(_totalSupply >= MIN_SUPPLY && _totalSupply <= MAX_SUPPLY);
		require(_initialMarketCap > 0 && _upperMarketCap > _initialMarketCap);
		require(_concentratedPercent < PERCENT_PRECISION);
		require(_creatorFee < PERCENT_PRECISION);
		info.team = new Team();
		info.team.initialize(_creator);
		info.creator = _creator;
		name = _name;
		symbol = _symbol;
		info.totalSupply = _totalSupply;
		info.users[address(this)].balance = _totalSupply;
		emit Transfer(address(0x0), address(this), _totalSupply);
		info.initialMarketCap = _initialMarketCap;
		info.upperMarketCap = _upperMarketCap;
		info.concentratedPercent = _concentratedPercent;
		info.creatorFee = _creatorFee;
		_createLP(_initialMarketCap, _upperMarketCap, _concentratedPercent, _creatorFee);
	}

	function collectTradingFees() external {
		PositionManager _pm = PositionManager(ROUTER.positionManager());
		if (info.lowerPositionId != 0) {
			_pm.collect(PositionManager.CollectParams({
				tokenId: info.lowerPositionId,
				recipient: team(),
				amount0Max: UINT128_MAX,
				amount1Max: UINT128_MAX
			}));
		}
		_pm.collect(PositionManager.CollectParams({
			tokenId: info.upperPositionId,
			recipient: team(),
			amount0Max: UINT128_MAX,
			amount1Max: UINT128_MAX
		}));
		info.team.withdrawFees();
	}

	function transfer(address _to, uint256 _tokens) external returns (bool) {
		return _transfer(msg.sender, _to, _tokens);
	}

	function approve(address _spender, uint256 _tokens) external returns (bool) {
		return _approve(msg.sender, _spender, _tokens);
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		unchecked {
			uint256 _allowance = allowance(_from, msg.sender);
			require(_allowance >= _tokens);
			if (_allowance != UINT_MAX) {
				info.users[_from].allowance[msg.sender] -= _tokens;
			}
			return _transfer(_from, _to, _tokens);
		}
	}

	function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
		_transfer(msg.sender, _to, _tokens);
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Callable(_to).tokenCallback(msg.sender, _tokens, _data));
		}
		return true;
	}
	

	function creator() public view returns (address) {
		return info.creator;
	}
	
	function team() public view returns (address) {
		return address(info.team);
	}

	function pool() public view returns (address) {
		return info.pool;
	}

	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return info.users[_user].balance;
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function positions() external view returns (uint256 lower, uint256 upper) {
		return (info.lowerPositionId, info.upperPositionId);
	}

	function initialMarketCap() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.initialMarketCap, 18, 5), " ETH"));
	}

	function upperMarketCap() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.upperMarketCap, 18, 5), " ETH"));
	}

	function concentratedPercent() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.concentratedPercent * 100, 3, 3), "%"));
	}

	function creatorFee() external view returns (string memory) {
		return string(abi.encodePacked(_uint2str(info.creatorFee * 100, 3, 3), "%"));
	}


	function _createLP(uint256 _initialMarketCap, uint256 _upperMarketCap, uint256 _concentratedPercent, uint256 _creatorFee) internal {
		unchecked {
			address _this = address(this);
			address _weth = ROUTER.WETH9();
			bool _weth0 = _weth < _this;
			(uint160 _initialSqrtPrice, ) = _getPriceAndTickFromValues(_weth0, totalSupply(), _initialMarketCap);
			info.pool = Factory(ROUTER.factory()).createPool(_this, _weth, 10000);
			Pool(pool()).initialize(_initialSqrtPrice);
			PositionManager _pm = PositionManager(ROUTER.positionManager());
			_approve(_this, address(_pm), totalSupply());
			( , int24 _minTick) = _getPriceAndTickFromValues(_weth0, totalSupply(), _initialMarketCap);
			( , int24 _maxTick) = _getPriceAndTickFromValues(_weth0, totalSupply(), _upperMarketCap);
			uint256 _concentratedTokens = _concentratedPercent * totalSupply() / PERCENT_PRECISION;
			if (_concentratedTokens > 0) {
				if (_creatorFee > 0) {
					_pm.mint(PositionManager.MintParams({
						token0: _weth0 ? _weth : _this,
						token1: !_weth0 ? _weth : _this,
						fee: 10000,
						tickLower: _weth0 ? _minTick - 200 : _minTick,
						tickUpper: !_weth0 ? _minTick + 200 : _minTick,
						amount0Desired: _weth0 ? 0 :  _concentratedTokens * _creatorFee / PERCENT_PRECISION,
						amount1Desired: !_weth0 ? 0 : _concentratedTokens * _creatorFee / PERCENT_PRECISION,
						amount0Min: 0,
						amount1Min: 0,
						recipient: creator(),
						deadline: block.timestamp
					}));
				}
				(info.lowerPositionId, , , ) = _pm.mint(PositionManager.MintParams({
					token0: _weth0 ? _weth : _this,
					token1: !_weth0 ? _weth : _this,
					fee: 10000,
					tickLower: _weth0 ? _minTick - 200 : _minTick,
					tickUpper: !_weth0 ? _minTick + 200 : _minTick,
					amount0Desired: _weth0 ? 0 :  _concentratedTokens * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
					amount1Desired: !_weth0 ? 0 : _concentratedTokens * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
					amount0Min: 0,
					amount1Min: 0,
					recipient: _this,
					deadline: block.timestamp
				}));
				_minTick = _weth0 ? _minTick - 200 : _minTick + 200;
			}
			if (_creatorFee > 0) {
				_pm.mint(PositionManager.MintParams({
					token0: _weth0 ? _weth : _this,
					token1: !_weth0 ? _weth : _this,
					fee: 10000,
					tickLower: _weth0 ? _maxTick : _minTick,
					tickUpper: !_weth0 ? _maxTick : _minTick,
					amount0Desired: _weth0 ? 0 :  (totalSupply() - _concentratedTokens) * _creatorFee / PERCENT_PRECISION,
					amount1Desired: !_weth0 ? 0 : (totalSupply() - _concentratedTokens) * _creatorFee / PERCENT_PRECISION,
					amount0Min: 0,
					amount1Min: 0,
					recipient: creator(),
					deadline: block.timestamp
				}));
			}
			(info.upperPositionId, , , ) = _pm.mint(PositionManager.MintParams({
				token0: _weth0 ? _weth : _this,
				token1: !_weth0 ? _weth : _this,
				fee: 10000,
				tickLower: _weth0 ? _maxTick : _minTick,
				tickUpper: !_weth0 ? _maxTick : _minTick,
				amount0Desired: _weth0 ? 0 :  (totalSupply() - _concentratedTokens) * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
				amount1Desired: !_weth0 ? 0 : (totalSupply() - _concentratedTokens) * (PERCENT_PRECISION - _creatorFee) / PERCENT_PRECISION,
				amount0Min: 0,
				amount1Min: 0,
				recipient: _this,
				deadline: block.timestamp
			}));
			if (_this.balance > 0) {
				ROUTER.exactInputSingle{value:_this.balance}(Router.ExactInputSingleParams({
					tokenIn: _weth,
					tokenOut: _this,
					fee: 10000,
					recipient: creator(),
					amountIn: _this.balance,
					amountOutMinimum: 0,
					sqrtPriceLimitX96: 0
				}));
			}
		}
	}
	
	function _approve(address _owner, address _spender, uint256 _tokens) internal returns (bool) {
		info.users[_owner].allowance[_spender] = _tokens;
		emit Approval(_owner, _spender, _tokens);
		return true;
	}
	
	function _transfer(address _from, address _to, uint256 _tokens) internal returns (bool) {
		unchecked {
			require(_tokens > 0);
			require(balanceOf(_from) >= _tokens);
			info.users[_from].balance -= _tokens;
			info.users[_to].balance += _tokens;
			emit Transfer(_from, _to, _tokens);
			return true;
		}
	}


	function _getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {
		unchecked {
			uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));
			require(absTick <= uint256(int256(MAX_TICK)), 'T');

			uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;
			if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
			if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
			if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
			if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
			if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
			if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
			if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
			if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
			if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
			if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
			if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
			if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
			if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
			if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
			if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
			if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
			if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
			if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
			if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;

			if (tick > 0) ratio = type(uint256).max / ratio;

			sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));
		}
	}

	function _getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {
		unchecked {
			require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');
			uint256 ratio = uint256(sqrtPriceX96) << 32;

			uint256 r = ratio;
			uint256 msb = 0;

			assembly {
				let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(5, gt(r, 0xFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(4, gt(r, 0xFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(3, gt(r, 0xFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(2, gt(r, 0xF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(1, gt(r, 0x3))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := gt(r, 0x1)
				msb := or(msb, f)
			}

			if (msb >= 128) r = ratio >> (msb - 127);
			else r = ratio << (127 - msb);

			int256 log_2 = (int256(msb) - 128) << 64;

			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(63, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(62, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(61, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(60, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(59, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(58, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(57, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(56, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(55, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(54, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(53, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(52, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(51, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(50, f))
			}

			int256 log_sqrt10001 = log_2 * 255738958999603826347141;

			int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);
			int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);

			tick = tickLow == tickHi ? tickLow : _getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;
		}
	}

	function _sqrt(uint256 _n) internal pure returns (uint256 result) {
		unchecked {
			uint256 _tmp = (_n + 1) / 2;
			result = _n;
			while (_tmp < result) {
				result = _tmp;
				_tmp = (_n / _tmp + _tmp) / 2;
			}
		}
	}

	function _getPriceAndTickFromValues(bool _weth0, uint256 _tokens, uint256 _weth) internal pure returns (uint160 price, int24 tick) {
		uint160 _tmpPrice = uint160(_sqrt(2**192 / (!_weth0 ? _tokens : _weth) * (_weth0 ? _tokens : _weth)));
		tick = _getTickAtSqrtRatio(_tmpPrice);
		tick = tick - (tick % 200);
		price = _getSqrtRatioAtTick(tick);
	}

	function _uint2str(uint256 _value, uint256 _scale, uint256 _maxDecimals) internal pure returns (string memory str) {
		uint256 _d = _scale > _maxDecimals ? _maxDecimals : _scale;
		uint256 _n = _value / 10**(_scale > _d ? _scale - _d : 0);
		if (_n == 0) {
			return "0";
		}
		uint256 _digits = 1;
		uint256 _tmp = _n;
		while (_tmp > 9) {
			_tmp /= 10;
			_digits++;
		}
		_tmp = _digits > _d ? _digits : _d + 1;
		uint256 _offset = (_tmp > _d + 1 ? _tmp - _d - 1 > _d ? _d : _tmp - _d - 1 : 0);
		for (uint256 i = 0; i < _tmp - _offset; i++) {
			uint256 _dec = i < _tmp - _digits ? 0 : (_n / (10**(_tmp - i - 1))) % 10;
			bytes memory _char = new bytes(1);
			_char[0] = bytes1(uint8(_dec) + 48);
			str = string(abi.encodePacked(str, string(_char)));
			if (i < _tmp - _d - 1) {
				if ((i + 1) % 3 == (_tmp - _d) % 3) {
					str = string(abi.encodePacked(str, ","));
				}
			} else {
				if ((_n / 10**_offset) % 10**(_tmp - _offset - i - 1) == 0) {
					break;
				} else if (i == _tmp - _d - 1) {
					str = string(abi.encodePacked(str, "."));
				}
			}
		}
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"allTokens","outputs":[{"internalType":"contract Token[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_deployProxy","type":"bool"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_initialMarketCap","type":"uint256"},{"internalType":"uint256","name":"_upperMarketCap","type":"uint256"},{"internalType":"uint256","name":"_concentratedPercent","type":"uint256"},{"internalType":"uint256","name":"_creatorFee","type":"uint256"}],"name":"launch","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"salt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"template","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenAtIndex","outputs":[{"internalType":"contract Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561000f575f80fd5b505f60405161001d90610149565b604051809103905ff080158015610036573d5f803e3d5ffd5b509050806001600160a01b031663f83d08ba6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610071575f80fd5b505af1158015610083573d5f803e3d5ffd5b5050600280546001600160a01b0319166001600160a01b03851617905550506040515f906100b090610156565b604051809103905ff0801580156100c9573d5f803e3d5ffd5b5060405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b15801561010b575f80fd5b505af115801561011d573d5f803e3d5ffd5b5050600380546001600160a01b0319166001600160a01b03949094169390931790925550610163915050565b6131ce806139a883390190565b61086a80616b7683390190565b613838806101705f395ff3fe60806040526004361061006e575f3560e01c80637e1c0c091161004c5780637e1c0c09146100ec5780639bb932d414610109578063bfa0b1331461011c578063c36d468614610130575f80fd5b806341f1afc7146100725780636f2ddd93146100ae5780636ff97f1d146100cb575b5f80fd5b34801561007d575f80fd5b5061009161008c3660046103b4565b61014d565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b9575f80fd5b506002546001600160a01b0316610091565b3480156100d6575f80fd5b506100df61017c565b6040516100a591906103cb565b3480156100f7575f80fd5b505f545b6040519081526020016100a5565b6100916101173660046104b4565b6101dd565b348015610127575f80fd5b506100fb610345565b34801561013b575f80fd5b506003546001600160a01b0316610091565b5f805f01828154811061016257610162610555565b5f918252602090912001546001600160a01b031692915050565b60605f80018054806020026020016040519081016040528092919081815260200182805480156101d357602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116101b5575b5050505050905090565b5f805f6101e8610345565b90508a1561025757600254604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b815260609190911b6bffffffffffffffffffffffff1916601482018190526e5af43d82803e903d91602b57fd5bf360881b60288301525f918360378285f5945061028592505050565b80604051610264906103a7565b8190604051809103905ff5905080158015610281573d5f803e3d5ffd5b5091505b50604051630947f66960e41b81526001600160a01b0382169063947f66909034906102c29033908e908e908e908e908e908e908e906004016105ac565b5f604051808303818588803b1580156102d9575f80fd5b505af11580156102eb573d5f803e3d5ffd5b50505f80546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b03861617905550919b9a5050505050505050505050565b335f8181526001602052604081208054919291908361036383610610565b9091555060405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160405160208183030381529060405280519060200120905090565b6131ce8061063583390190565b5f602082840312156103c4575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561040b5783516001600160a01b0316835292840192918401916001016103e6565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261043a575f80fd5b813567ffffffffffffffff8082111561045557610455610417565b604051601f8301601f19908116603f0116810190828211818310171561047d5761047d610417565b81604052838152866020858801011115610495575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b0312156104cc575f80fd5b883580151581146104db575f80fd5b9750602089013567ffffffffffffffff808211156104f7575f80fd5b6105038c838d0161042b565b985060408b0135915080821115610518575f80fd5b506105258b828c0161042b565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e090910135945092505050565b634e487b7160e01b5f52603260045260245ffd5b5f81518084525f5b8181101561058d57602081850181015186830182015201610571565b505f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0389168152610100602082018190525f906105d08382018b610569565b905082810360408401526105e4818a610569565b60608401989098525050608081019490945260a084019290925260c083015260e0909101529392505050565b5f6001820161062d57634e487b7160e01b5f52601160045260245ffd5b506001019056fe608060405234801561000f575f80fd5b506131b18061001d5f395ff3fe608060405260043610610131575f3560e01c806367e828bf116100a8578063a9059cbb1161006d578063a9059cbb14610329578063ba5b798214610348578063bdaaa6401461036f578063dd62ed3e14610383578063e88958dc146103cb578063f83d08ba146103df575f80fd5b806367e828bf1461029857806370a08231146102ac57806385f2aef2146102e0578063947f66901461030257806395d89b4114610315575f80fd5b806318160ddd116100f957806318160ddd146101ec57806323b872dd1461020a578063313ce567146102295780633b5f19351461024f5780634000aea01461026357806353f8b30314610282575f80fd5b806302d05d3f1461013557806306fdde031461016b578063095ea7b31461018c5780630bb68bd2146101bb57806316f0115b146101cf575b5f80fd5b348015610140575f80fd5b506004546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610176575f80fd5b5061017f6103f3565b6040516101629190612017565b348015610197575f80fd5b506101ab6101a6366004612060565b61047e565b6040519015158152602001610162565b3480156101c6575f80fd5b5061017f610493565b3480156101da575f80fd5b506003546001600160a01b031661014e565b3480156101f7575f80fd5b506005545b604051908152602001610162565b348015610215575f80fd5b506101ab61022436600461208a565b6104d4565b348015610234575f80fd5b5061023d601281565b60405160ff9091168152602001610162565b34801561025a575f80fd5b5061017f610551565b34801561026e575f80fd5b506101ab61027d3660046120c8565b610575565b34801561028d575f80fd5b50610296610616565b005b3480156102a3575f80fd5b5061017f610879565b3480156102b7575f80fd5b506101fc6102c636600461214a565b6001600160a01b03165f908152600a602052604090205490565b3480156102eb575f80fd5b5060025461010090046001600160a01b031661014e565b610296610310366004612202565b610895565b348015610320575f80fd5b5061017f610a86565b348015610334575f80fd5b506101ab610343366004612060565b610a93565b348015610353575f80fd5b50600b54600c5460408051928352602083019190915201610162565b34801561037a575f80fd5b5061017f610a9f565b34801561038e575f80fd5b506101fc61039d36600461229f565b6001600160a01b039182165f908152600a602090815260408083209390941682526001909201909152205490565b3480156103d6575f80fd5b5061017f610ab3565b3480156103ea575f80fd5b50610296610ac8565b5f80546103ff906122d6565b80601f016020809104026020016040519081016040528092919081815260200182805461042b906122d6565b80156104765780601f1061044d57610100808354040283529160200191610476565b820191905f5260205f20905b81548152906001019060200180831161045957829003601f168201915b505050505081565b5f61048a338484610af2565b90505b92915050565b6008546060906104b0906104a890606461231c565b600380610b5e565b6040516020016104c09190612333565b604051602081830303815290604052905090565b6001600160a01b0383165f908152600a6020908152604080832033845260010190915281205482811015610506575f80fd5b5f19811461053b576001600160a01b0385165f908152600a602090815260408083203384526001019091529020805484900390555b610546858585610e76565b9150505b9392505050565b606061056560026004015460126005610b5e565b6040516020016104c09190612357565b5f610581338686610e76565b50843b63ffffffff81161561060a57604051636be32e7360e01b81526001600160a01b03871690636be32e73906105c290339089908990899060040161237e565b6020604051808303815f875af11580156105de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060291906123c5565b61060a575f80fd5b50600195945050505050565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610667573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068b91906123e4565b600b549091501561075457806001600160a01b031663fc6f7865604051806080016040528060026009015481526020016106d36002546001600160a01b036101009091041690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b16815261071291906004016123ff565b60408051808303815f875af115801561072d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107519190612442565b50505b806001600160a01b031663fc6f786560405180608001604052806002600a015481526020016107916002546001600160a01b036101009091041690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526107d091906004016123ff565b60408051808303815f875af11580156107eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080f9190612442565b505060025f0160019054906101000a90046001600160a01b03166001600160a01b031663476343ee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610860575f80fd5b505af1158015610872573d5f803e3d5ffd5b5050505050565b6040518060600160405280603681526020016131466036913981565b60025460ff16156108a4575f80fd5b600554156108b0575f80fd5b5f87511180156108c257506020875111155b6108ca575f80fd5b5f86511180156108dc57506020865111155b6108e4575f80fd5b662386f26fc10000851015801561090957506d314dc6448d9338c15b0a000000008511155b610911575f80fd5b5f8411801561091f57508383115b610927575f80fd5b6103e88210610934575f80fd5b6103e88110610941575f80fd5b60405161094d90611fe8565b604051809103905ff080158015610966573d5f803e3d5ffd5b5060028054610100600160a81b0319166101006001600160a01b039384168102919091179182905560405163189acdbd60e31b81528b8416600482015291049091169063c4d66de8906024015f604051808303815f87803b1580156109c9575f80fd5b505af11580156109db573d5f803e3d5ffd5b5050600480546001600160a01b0319166001600160a01b038c16179055505f9050610a0688826124b2565b506001610a1387826124b2565b506005859055305f818152600a60209081526040808320899055518881527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36006849055600783905560088290556009819055610a7c84848484610f0c565b5050505050505050565b600180546103ff906122d6565b5f61048a338484610e76565b606061056560026005015460126005610b5e565b6009546060906104b0906104a890606461231c565b60025460ff1615610ad7575f80fd5b60055415610ae3575f80fd5b6002805460ff19166001179055565b6001600160a01b038381165f818152600a602090815260408083209487168084526001909501825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b60605f828411610b6e5783610b70565b825b90505f818511610b80575f610b8a565b610b8a828661256e565b610b9590600a612661565b610b9f9087612680565b9050805f03610bcb57604051806040016040528060018152602001600360fc1b8152509250505061054a565b6001815b6009811115610bf757610be3600a82612680565b905081610bef81612693565b925050610bcf565b838211610c0e57610c098460016126ab565b610c10565b815b90505f610c1e8560016126ab565b8211610c2a575f610c63565b846001610c37828561256e565b610c41919061256e565b11610c61576001610c52868461256e565b610c5c919061256e565b610c63565b845b90505f5b610c71828461256e565b811015610e69575f610c83858561256e565b8210610cc557600a6001610c97848761256e565b610ca1919061256e565b610cac90600a612661565b610cb69088612680565b610cc091906126be565b610cc7565b5f5b6040805160018082528183019092529192505f9190602082018180368337019050509050610cf68260306126d1565b60f81b815f81518110610d0b57610d0b6126ea565b60200101906001600160f81b03191690815f1a9053508881604051602001610d349291906126fe565b60408051601f1981840301815291905298506001610d52898761256e565b610d5c919061256e565b831015610dbd576003610d6f898761256e565b610d7991906126be565b6003610d868560016126ab565b610d9091906126be565b03610db85788604051602001610da6919061272c565b60405160208183030381529060405298505b610e54565b600183610dca868861256e565b610dd4919061256e565b610dde919061256e565b610de990600a612661565b610df485600a612661565b610dfe9089612680565b610e0891906126be565b5f03610e15575050610e69565b6001610e21898761256e565b610e2b919061256e565b8303610e545788604051602001610e429190612750565b60405160208183030381529060405298505b50508080610e6190612693565b915050610c67565b5050505050509392505050565b5f808211610e82575f80fd5b81610ea1856001600160a01b03165f908152600a602052604090205490565b1015610eab575f80fd5b6001600160a01b038085165f818152600a6020526040808220805487900390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b4c9086815260200190565b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8591906123e4565b90506001600160a01b03808316908216105f610faa82610fa460055490565b8a6118e4565b5090507368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102191906123e4565b60405163a167129560e01b81526001600160a01b03868116600483015285811660248301526127106044830152919091169063a1671295906064016020604051808303815f875af1158015611078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109c91906123e4565b600380546001600160a01b0319166001600160a01b0392909216918217905560405163f637731d60e01b81526001600160a01b038381166004830152919091169063f637731d906024015f604051808303815f87803b1580156110fd575f80fd5b505af115801561110f573d5f803e3d5ffd5b505050505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611164573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118891906123e4565b905061119d858261119860055490565b610af2565b505f6111b2846111ac60055490565b8c6118e4565b9150505f6111c3856111ac60055490565b9150505f6103e86111d360055490565b8b02816111e2576111e261266c565b049050801561149557881561133e57836001600160a01b0316638831645660405180610160016040528089611217578b611219565b8a5b6001600160a01b031681526020018915611233578b611235565b8a5b6001600160a01b03168152612710602082015260400189611256578661125b565b60c887035b60020b8152602001891561126f5786611274565b8660c8015b60020b81526020018961128d576103e8858e020461128f565b5f5b815260200189156112a6576103e8858e02046112a8565b5f5b81526020015f81526020015f81526020016112cb6004546001600160a01b031690565b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016112f99190612774565b6080604051808303815f875af1158015611315573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113399190612838565b505050505b836001600160a01b0316638831645660405180610160016040528089611364578b611366565b8a5b6001600160a01b031681526020018915611380578b611382565b8a5b6001600160a01b031681526127106020820152604001896113a357866113a8565b60c887035b60020b815260200189156113bc57866113c1565b8660c8015b60020b8152602001896113dc576103e88d81038602046113de565b5f5b815260200189156113f7576103e88d81038602046113f9565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016114399190612774565b6080604051808303815f875af1158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190612838565b505050600b558561148d578260c801611492565b60c883035b92505b881561161057836001600160a01b03166388316456604051806101600160405280896114c1578b6114c3565b8a5b6001600160a01b0316815260200189156114dd578b6114df565b8a5b6001600160a01b031681526127106020820152604001896115005786611502565b855b60020b815260200189156115165786611518565b855b60020b815260200189611548576103e88d8661153360055490565b0302816115425761154261266c565b0461154a565b5f5b81526020018915611578576103e88d8661156360055490565b0302816115725761157261266c565b0461157a565b5f5b81526020015f81526020015f815260200161159d6004546001600160a01b031690565b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016115cb9190612774565b6080604051808303815f875af11580156115e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b9190612838565b505050505b836001600160a01b0316638831645660405180610160016040528089611636578b611638565b8a5b6001600160a01b031681526020018915611652578b611654565b8a5b6001600160a01b031681526127106020820152604001896116755786611677565b855b60020b8152602001891561168b578661168d565b855b60020b8152602001896116c1576103e88d6103e803866116ac60055490565b0302816116bb576116bb61266c565b046116c3565b5f5b815260200189156116f5576103e88d6103e803866116e060055490565b0302816116ef576116ef61266c565b046116f7565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016117379190612774565b6080604051808303815f875af1158015611753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117779190612838565b505050600c556001600160a01b03881631156118d6577368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b03166304e45aaf896001600160a01b0316316040518060e001604052808b6001600160a01b031681526020018c6001600160a01b0316815260200161271062ffffff1681526020016118036004546001600160a01b031690565b6001600160a01b0390811682528d8116316020808401919091525f604080850182905260609485019190915280516001600160e01b031960e089901b168152855184166004820152918501518316602483015284015162ffffff16604482015291830151811660648301526080830151608483015260a083015160a483015260c09092015190911660c482015260e40160206040518083038185885af11580156118af573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118d4919061287e565b505b505050505050505050505050565b5f805f611922866118f557846118f7565b855b87156119035785611905565b865b61191390600160c01b612680565b61191d919061231c565b61195a565b905061192d8161199d565b915061193a60c883612895565b61194490836128b6565b915061194f82611cba565b925050935093915050565b80600260018201045b81811015611997578091506002818285816119805761198061266c565b04018161198f5761198f61266c565b049050611963565b50919050565b5f6401000276a36001600160a01b038316108015906119d8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b611a0d5760405162461bcd60e51b81526020600482015260016024820152602960f91b60448201526064015b60405180910390fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c97908811961790941790921717909117171760808110611aa157607f810383901c9150611aab565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14611cab57886001600160a01b0316611c9082611cba565b6001600160a01b03161115611ca55781611cad565b80611cad565b815b9998505050505050505050565b5f805f8360020b12611ccf578260020b611cd6565b8260020b5f035b9050620d89e8811115611d0f5760405162461bcd60e51b81526020600482015260016024820152601560fa1b6044820152606401611a04565b5f816001165f03611d2457600160801b611d36565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611d6a576ffff97272373d413259a46990580e213a0260801c5b6004821615611d89576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611da8576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611dc7576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611de6576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611e05576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611e24576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611e44576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611e64576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611e84576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611ea4576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611ec4576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611ee4576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611f04576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611f24576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611f45576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611f65576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611f84576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611fa1576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611fc057805f1981611fbc57611fbc61266c565b0490505b640100000000810615611fd4576001611fd6565b5f5b60ff16602082901c0192505050919050565b61086a806128dc83390190565b5f5b8381101561200f578181015183820152602001611ff7565b50505f910152565b602081525f8251806020840152612035816040850160208701611ff5565b601f01601f19169190910160400192915050565b6001600160a01b038116811461205d575f80fd5b50565b5f8060408385031215612071575f80fd5b823561207c81612049565b946020939093013593505050565b5f805f6060848603121561209c575f80fd5b83356120a781612049565b925060208401356120b781612049565b929592945050506040919091013590565b5f805f80606085870312156120db575f80fd5b84356120e681612049565b935060208501359250604085013567ffffffffffffffff80821115612109575f80fd5b818701915087601f83011261211c575f80fd5b81358181111561212a575f80fd5b88602082850101111561213b575f80fd5b95989497505060200194505050565b5f6020828403121561215a575f80fd5b813561054a81612049565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612188575f80fd5b813567ffffffffffffffff808211156121a3576121a3612165565b604051601f8301601f19908116603f011681019082821181831017156121cb576121cb612165565b816040528381528660208588010111156121e3575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121561221a575f80fd5b883561222581612049565b9750602089013567ffffffffffffffff80821115612241575f80fd5b61224d8c838d01612179565b985060408b0135915080821115612262575f80fd5b5061226f8b828c01612179565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e090910135945092505050565b5f80604083850312156122b0575f80fd5b82356122bb81612049565b915060208301356122cb81612049565b809150509250929050565b600181811c908216806122ea57607f821691505b60208210810361199757634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761048d5761048d612308565b5f8251612344818460208701611ff5565b602560f81b920191825250600101919050565b5f8251612368818460208701611ff5565b630408aa8960e31b920191825250600401919050565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f602082840312156123d5575f80fd5b8151801515811461054a575f80fd5b5f602082840312156123f4575f80fd5b815161054a81612049565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f8060408385031215612453575f80fd5b505080516020909101519092909150565b601f8211156124ad575f81815260208120601f850160051c8101602086101561248a5750805b601f850160051c820191505b818110156124a957828155600101612496565b5050505b505050565b815167ffffffffffffffff8111156124cc576124cc612165565b6124e0816124da84546122d6565b84612464565b602080601f831160018114612513575f84156124fc5750858301515b5f19600386901b1c1916600185901b1785556124a9565b5f85815260208120601f198616915b8281101561254157888601518255948401946001909101908401612522565b508582101561255e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561048d5761048d612308565b600181815b808511156125bb57815f19048211156125a1576125a1612308565b808516156125ae57918102915b93841c9390800290612586565b509250929050565b5f826125d15750600161048d565b816125dd57505f61048d565b81600181146125f357600281146125fd57612619565b600191505061048d565b60ff84111561260e5761260e612308565b50506001821b61048d565b5060208310610133831016604e8410600b841016171561263c575081810a61048d565b6126468383612581565b805f190482111561265957612659612308565b029392505050565b5f61048a83836125c3565b634e487b7160e01b5f52601260045260245ffd5b5f8261268e5761268e61266c565b500490565b5f600182016126a4576126a4612308565b5060010190565b8082018082111561048d5761048d612308565b5f826126cc576126cc61266c565b500690565b60ff818116838216019081111561048d5761048d612308565b634e487b7160e01b5f52603260045260245ffd5b5f835161270f818460208801611ff5565b835190830190612723818360208801611ff5565b01949350505050565b5f825161273d818460208701611ff5565b600b60fa1b920191825250600101919050565b5f8251612761818460208701611ff5565b601760f91b920191825250600101919050565b81516001600160a01b03168152610160810160208301516127a060208401826001600160a01b03169052565b5060408301516127b7604084018262ffffff169052565b5060608301516127cc606084018260020b9052565b5060808301516127e1608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151612827828501826001600160a01b03169052565b505061014092830151919092015290565b5f805f806080858703121561284b575f80fd5b8451935060208501516001600160801b0381168114612868575f80fd5b6040860151606090960151949790965092505050565b5f6020828403121561288e575f80fd5b5051919050565b5f8260020b806128a7576128a761266c565b808360020b0791505092915050565b600282810b9082900b03627fffff198112627fffff8213171561048d5761048d61230856fe608060405234801561000f575f80fd5b5061084d8061001d5f395ff3fe60806040526004361061007c575f3560e01c8063894760691161004c5780638947606914610117578063c4d66de814610136578063e086e5ec14610155578063fc0c546a14610169575f80fd5b80633a98ef3914610087578063476343ee146100af5780634c02f62e146100c557806357a858fc146100d9575f80fd5b3661008357005b5f80fd5b348015610092575f80fd5b5061009c60015481565b6040519081526020015b60405180910390f35b3480156100ba575f80fd5b506100c36101a0565b005b3480156100d0575f80fd5b506100c36101bf565b3480156100e4575f80fd5b506100f86100f33660046106ea565b610236565b604080516001600160a01b0390931683526020830191909152016100a6565b348015610122575f80fd5b506100c3610131366004610715565b61026b565b348015610141575f80fd5b506100c3610150366004610715565b61052f565b348015610160575f80fd5b506100c3610599565b348015610174575f80fd5b50600254610188906001600160a01b031681565b6040516001600160a01b0390911681526020016100a6565b6101a86101bf565b6002546101bd906001600160a01b031661026b565b565b6101bd7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610212573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101319190610737565b5f8181548110610244575f80fd5b5f918252602090912060029091020180546001909101546001600160a01b03909116915082565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e09190610737565b9050806001600160a01b0316826001600160a01b0316036103c0576040516370a0823160e01b81523060048201526001600160a01b03821690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015610345573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103699190610752565b6040518263ffffffff1660e01b815260040161038791815260200190565b5f604051808303815f87803b15801561039e575f80fd5b505af11580156103b0573d5f803e3d5ffd5b505050506103bc610599565b5050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610404573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104289190610752565b9050801561052a575f5b5f54811015610528575f80828154811061044e5761044e610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03908116808452600192830154948401859052915492945088169263a9059cbb929061049d9088610791565b6104a791906107ae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156104ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051391906107cd565b50508080610520906107ec565b915050610432565b505b505050565b6001541561053b575f80fd5b600280546001600160a01b0319163317905561055881600361063c565b61057773e6c791fbd46db3f4eda5f7bb76474f4fa530733e600261063c565b61059673c28c9da0f8a500dffc16ff09a3dd1cc4c530d346600161063c565b50565b478015610596575f5b5f548110156103bc575f8082815481106105be576105be610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03168083526001918201549383018490529054919350916108fc91906106079087610791565b61061191906107ae565b6040518115909202915f818181858888f1935050505050508080610634906107ec565b9150506105a2565b604080518082019091526001600160a01b038381168252602082018381525f80546001808201835582805294517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563600290920291820180546001600160a01b031916919095161790935590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909201919091558154839291906106e1908490610804565b90915550505050565b5f602082840312156106fa575f80fd5b5035919050565b6001600160a01b0381168114610596575f80fd5b5f60208284031215610725575f80fd5b813561073081610701565b9392505050565b5f60208284031215610747575f80fd5b815161073081610701565b5f60208284031215610762575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107a8576107a861077d565b92915050565b5f826107c857634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156107dd575f80fd5b81518015158114610730575f80fd5b5f600182016107fd576107fd61077d565b5060010190565b808201808211156107a8576107a861077d56fea26469706673582212205a7d6207f78ca60fa96c729b5948f291193052a1303377654ac9c3ef10d5ae3a64736f6c6343000815003343726561746564207769746820426f73736d616e27732042616b657279202862616b6572792e6d756c6c65742e6361706974616c2921a2646970667358221220d15a9c359bb5a5fd7a5ffce6c29d3ea55d4d85e9848f95dfc71def0599c5044e64736f6c63430008150033a26469706673582212206fbb11124a4c98cc46e2c52e2a508beab1f8034dc29e64fc4245137e1b2d92a064736f6c63430008150033608060405234801561000f575f80fd5b506131b18061001d5f395ff3fe608060405260043610610131575f3560e01c806367e828bf116100a8578063a9059cbb1161006d578063a9059cbb14610329578063ba5b798214610348578063bdaaa6401461036f578063dd62ed3e14610383578063e88958dc146103cb578063f83d08ba146103df575f80fd5b806367e828bf1461029857806370a08231146102ac57806385f2aef2146102e0578063947f66901461030257806395d89b4114610315575f80fd5b806318160ddd116100f957806318160ddd146101ec57806323b872dd1461020a578063313ce567146102295780633b5f19351461024f5780634000aea01461026357806353f8b30314610282575f80fd5b806302d05d3f1461013557806306fdde031461016b578063095ea7b31461018c5780630bb68bd2146101bb57806316f0115b146101cf575b5f80fd5b348015610140575f80fd5b506004546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610176575f80fd5b5061017f6103f3565b6040516101629190612017565b348015610197575f80fd5b506101ab6101a6366004612060565b61047e565b6040519015158152602001610162565b3480156101c6575f80fd5b5061017f610493565b3480156101da575f80fd5b506003546001600160a01b031661014e565b3480156101f7575f80fd5b506005545b604051908152602001610162565b348015610215575f80fd5b506101ab61022436600461208a565b6104d4565b348015610234575f80fd5b5061023d601281565b60405160ff9091168152602001610162565b34801561025a575f80fd5b5061017f610551565b34801561026e575f80fd5b506101ab61027d3660046120c8565b610575565b34801561028d575f80fd5b50610296610616565b005b3480156102a3575f80fd5b5061017f610879565b3480156102b7575f80fd5b506101fc6102c636600461214a565b6001600160a01b03165f908152600a602052604090205490565b3480156102eb575f80fd5b5060025461010090046001600160a01b031661014e565b610296610310366004612202565b610895565b348015610320575f80fd5b5061017f610a86565b348015610334575f80fd5b506101ab610343366004612060565b610a93565b348015610353575f80fd5b50600b54600c5460408051928352602083019190915201610162565b34801561037a575f80fd5b5061017f610a9f565b34801561038e575f80fd5b506101fc61039d36600461229f565b6001600160a01b039182165f908152600a602090815260408083209390941682526001909201909152205490565b3480156103d6575f80fd5b5061017f610ab3565b3480156103ea575f80fd5b50610296610ac8565b5f80546103ff906122d6565b80601f016020809104026020016040519081016040528092919081815260200182805461042b906122d6565b80156104765780601f1061044d57610100808354040283529160200191610476565b820191905f5260205f20905b81548152906001019060200180831161045957829003601f168201915b505050505081565b5f61048a338484610af2565b90505b92915050565b6008546060906104b0906104a890606461231c565b600380610b5e565b6040516020016104c09190612333565b604051602081830303815290604052905090565b6001600160a01b0383165f908152600a6020908152604080832033845260010190915281205482811015610506575f80fd5b5f19811461053b576001600160a01b0385165f908152600a602090815260408083203384526001019091529020805484900390555b610546858585610e76565b9150505b9392505050565b606061056560026004015460126005610b5e565b6040516020016104c09190612357565b5f610581338686610e76565b50843b63ffffffff81161561060a57604051636be32e7360e01b81526001600160a01b03871690636be32e73906105c290339089908990899060040161237e565b6020604051808303815f875af11580156105de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060291906123c5565b61060a575f80fd5b50600195945050505050565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610667573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068b91906123e4565b600b549091501561075457806001600160a01b031663fc6f7865604051806080016040528060026009015481526020016106d36002546001600160a01b036101009091041690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b16815261071291906004016123ff565b60408051808303815f875af115801561072d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107519190612442565b50505b806001600160a01b031663fc6f786560405180608001604052806002600a015481526020016107916002546001600160a01b036101009091041690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526107d091906004016123ff565b60408051808303815f875af11580156107eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080f9190612442565b505060025f0160019054906101000a90046001600160a01b03166001600160a01b031663476343ee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610860575f80fd5b505af1158015610872573d5f803e3d5ffd5b5050505050565b6040518060600160405280603681526020016131466036913981565b60025460ff16156108a4575f80fd5b600554156108b0575f80fd5b5f87511180156108c257506020875111155b6108ca575f80fd5b5f86511180156108dc57506020865111155b6108e4575f80fd5b662386f26fc10000851015801561090957506d314dc6448d9338c15b0a000000008511155b610911575f80fd5b5f8411801561091f57508383115b610927575f80fd5b6103e88210610934575f80fd5b6103e88110610941575f80fd5b60405161094d90611fe8565b604051809103905ff080158015610966573d5f803e3d5ffd5b5060028054610100600160a81b0319166101006001600160a01b039384168102919091179182905560405163189acdbd60e31b81528b8416600482015291049091169063c4d66de8906024015f604051808303815f87803b1580156109c9575f80fd5b505af11580156109db573d5f803e3d5ffd5b5050600480546001600160a01b0319166001600160a01b038c16179055505f9050610a0688826124b2565b506001610a1387826124b2565b506005859055305f818152600a60209081526040808320899055518881527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36006849055600783905560088290556009819055610a7c84848484610f0c565b5050505050505050565b600180546103ff906122d6565b5f61048a338484610e76565b606061056560026005015460126005610b5e565b6009546060906104b0906104a890606461231c565b60025460ff1615610ad7575f80fd5b60055415610ae3575f80fd5b6002805460ff19166001179055565b6001600160a01b038381165f818152600a602090815260408083209487168084526001909501825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b60605f828411610b6e5783610b70565b825b90505f818511610b80575f610b8a565b610b8a828661256e565b610b9590600a612661565b610b9f9087612680565b9050805f03610bcb57604051806040016040528060018152602001600360fc1b8152509250505061054a565b6001815b6009811115610bf757610be3600a82612680565b905081610bef81612693565b925050610bcf565b838211610c0e57610c098460016126ab565b610c10565b815b90505f610c1e8560016126ab565b8211610c2a575f610c63565b846001610c37828561256e565b610c41919061256e565b11610c61576001610c52868461256e565b610c5c919061256e565b610c63565b845b90505f5b610c71828461256e565b811015610e69575f610c83858561256e565b8210610cc557600a6001610c97848761256e565b610ca1919061256e565b610cac90600a612661565b610cb69088612680565b610cc091906126be565b610cc7565b5f5b6040805160018082528183019092529192505f9190602082018180368337019050509050610cf68260306126d1565b60f81b815f81518110610d0b57610d0b6126ea565b60200101906001600160f81b03191690815f1a9053508881604051602001610d349291906126fe565b60408051601f1981840301815291905298506001610d52898761256e565b610d5c919061256e565b831015610dbd576003610d6f898761256e565b610d7991906126be565b6003610d868560016126ab565b610d9091906126be565b03610db85788604051602001610da6919061272c565b60405160208183030381529060405298505b610e54565b600183610dca868861256e565b610dd4919061256e565b610dde919061256e565b610de990600a612661565b610df485600a612661565b610dfe9089612680565b610e0891906126be565b5f03610e15575050610e69565b6001610e21898761256e565b610e2b919061256e565b8303610e545788604051602001610e429190612750565b60405160208183030381529060405298505b50508080610e6190612693565b915050610c67565b5050505050509392505050565b5f808211610e82575f80fd5b81610ea1856001600160a01b03165f908152600a602052604090205490565b1015610eab575f80fd5b6001600160a01b038085165f818152600a6020526040808220805487900390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b4c9086815260200190565b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8591906123e4565b90506001600160a01b03808316908216105f610faa82610fa460055490565b8a6118e4565b5090507368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102191906123e4565b60405163a167129560e01b81526001600160a01b03868116600483015285811660248301526127106044830152919091169063a1671295906064016020604051808303815f875af1158015611078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109c91906123e4565b600380546001600160a01b0319166001600160a01b0392909216918217905560405163f637731d60e01b81526001600160a01b038381166004830152919091169063f637731d906024015f604051808303815f87803b1580156110fd575f80fd5b505af115801561110f573d5f803e3d5ffd5b505050505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611164573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118891906123e4565b905061119d858261119860055490565b610af2565b505f6111b2846111ac60055490565b8c6118e4565b9150505f6111c3856111ac60055490565b9150505f6103e86111d360055490565b8b02816111e2576111e261266c565b049050801561149557881561133e57836001600160a01b0316638831645660405180610160016040528089611217578b611219565b8a5b6001600160a01b031681526020018915611233578b611235565b8a5b6001600160a01b03168152612710602082015260400189611256578661125b565b60c887035b60020b8152602001891561126f5786611274565b8660c8015b60020b81526020018961128d576103e8858e020461128f565b5f5b815260200189156112a6576103e8858e02046112a8565b5f5b81526020015f81526020015f81526020016112cb6004546001600160a01b031690565b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016112f99190612774565b6080604051808303815f875af1158015611315573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113399190612838565b505050505b836001600160a01b0316638831645660405180610160016040528089611364578b611366565b8a5b6001600160a01b031681526020018915611380578b611382565b8a5b6001600160a01b031681526127106020820152604001896113a357866113a8565b60c887035b60020b815260200189156113bc57866113c1565b8660c8015b60020b8152602001896113dc576103e88d81038602046113de565b5f5b815260200189156113f7576103e88d81038602046113f9565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016114399190612774565b6080604051808303815f875af1158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190612838565b505050600b558561148d578260c801611492565b60c883035b92505b881561161057836001600160a01b03166388316456604051806101600160405280896114c1578b6114c3565b8a5b6001600160a01b0316815260200189156114dd578b6114df565b8a5b6001600160a01b031681526127106020820152604001896115005786611502565b855b60020b815260200189156115165786611518565b855b60020b815260200189611548576103e88d8661153360055490565b0302816115425761154261266c565b0461154a565b5f5b81526020018915611578576103e88d8661156360055490565b0302816115725761157261266c565b0461157a565b5f5b81526020015f81526020015f815260200161159d6004546001600160a01b031690565b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016115cb9190612774565b6080604051808303815f875af11580156115e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b9190612838565b505050505b836001600160a01b0316638831645660405180610160016040528089611636578b611638565b8a5b6001600160a01b031681526020018915611652578b611654565b8a5b6001600160a01b031681526127106020820152604001896116755786611677565b855b60020b8152602001891561168b578661168d565b855b60020b8152602001896116c1576103e88d6103e803866116ac60055490565b0302816116bb576116bb61266c565b046116c3565b5f5b815260200189156116f5576103e88d6103e803866116e060055490565b0302816116ef576116ef61266c565b046116f7565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016117379190612774565b6080604051808303815f875af1158015611753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117779190612838565b505050600c556001600160a01b03881631156118d6577368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b03166304e45aaf896001600160a01b0316316040518060e001604052808b6001600160a01b031681526020018c6001600160a01b0316815260200161271062ffffff1681526020016118036004546001600160a01b031690565b6001600160a01b0390811682528d8116316020808401919091525f604080850182905260609485019190915280516001600160e01b031960e089901b168152855184166004820152918501518316602483015284015162ffffff16604482015291830151811660648301526080830151608483015260a083015160a483015260c09092015190911660c482015260e40160206040518083038185885af11580156118af573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118d4919061287e565b505b505050505050505050505050565b5f805f611922866118f557846118f7565b855b87156119035785611905565b865b61191390600160c01b612680565b61191d919061231c565b61195a565b905061192d8161199d565b915061193a60c883612895565b61194490836128b6565b915061194f82611cba565b925050935093915050565b80600260018201045b81811015611997578091506002818285816119805761198061266c565b04018161198f5761198f61266c565b049050611963565b50919050565b5f6401000276a36001600160a01b038316108015906119d8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b611a0d5760405162461bcd60e51b81526020600482015260016024820152602960f91b60448201526064015b60405180910390fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c97908811961790941790921717909117171760808110611aa157607f810383901c9150611aab565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14611cab57886001600160a01b0316611c9082611cba565b6001600160a01b03161115611ca55781611cad565b80611cad565b815b9998505050505050505050565b5f805f8360020b12611ccf578260020b611cd6565b8260020b5f035b9050620d89e8811115611d0f5760405162461bcd60e51b81526020600482015260016024820152601560fa1b6044820152606401611a04565b5f816001165f03611d2457600160801b611d36565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611d6a576ffff97272373d413259a46990580e213a0260801c5b6004821615611d89576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611da8576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611dc7576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611de6576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611e05576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611e24576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611e44576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611e64576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611e84576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611ea4576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611ec4576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611ee4576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611f04576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611f24576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611f45576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611f65576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611f84576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611fa1576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611fc057805f1981611fbc57611fbc61266c565b0490505b640100000000810615611fd4576001611fd6565b5f5b60ff16602082901c0192505050919050565b61086a806128dc83390190565b5f5b8381101561200f578181015183820152602001611ff7565b50505f910152565b602081525f8251806020840152612035816040850160208701611ff5565b601f01601f19169190910160400192915050565b6001600160a01b038116811461205d575f80fd5b50565b5f8060408385031215612071575f80fd5b823561207c81612049565b946020939093013593505050565b5f805f6060848603121561209c575f80fd5b83356120a781612049565b925060208401356120b781612049565b929592945050506040919091013590565b5f805f80606085870312156120db575f80fd5b84356120e681612049565b935060208501359250604085013567ffffffffffffffff80821115612109575f80fd5b818701915087601f83011261211c575f80fd5b81358181111561212a575f80fd5b88602082850101111561213b575f80fd5b95989497505060200194505050565b5f6020828403121561215a575f80fd5b813561054a81612049565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612188575f80fd5b813567ffffffffffffffff808211156121a3576121a3612165565b604051601f8301601f19908116603f011681019082821181831017156121cb576121cb612165565b816040528381528660208588010111156121e3575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121561221a575f80fd5b883561222581612049565b9750602089013567ffffffffffffffff80821115612241575f80fd5b61224d8c838d01612179565b985060408b0135915080821115612262575f80fd5b5061226f8b828c01612179565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e090910135945092505050565b5f80604083850312156122b0575f80fd5b82356122bb81612049565b915060208301356122cb81612049565b809150509250929050565b600181811c908216806122ea57607f821691505b60208210810361199757634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761048d5761048d612308565b5f8251612344818460208701611ff5565b602560f81b920191825250600101919050565b5f8251612368818460208701611ff5565b630408aa8960e31b920191825250600401919050565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f602082840312156123d5575f80fd5b8151801515811461054a575f80fd5b5f602082840312156123f4575f80fd5b815161054a81612049565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f8060408385031215612453575f80fd5b505080516020909101519092909150565b601f8211156124ad575f81815260208120601f850160051c8101602086101561248a5750805b601f850160051c820191505b818110156124a957828155600101612496565b5050505b505050565b815167ffffffffffffffff8111156124cc576124cc612165565b6124e0816124da84546122d6565b84612464565b602080601f831160018114612513575f84156124fc5750858301515b5f19600386901b1c1916600185901b1785556124a9565b5f85815260208120601f198616915b8281101561254157888601518255948401946001909101908401612522565b508582101561255e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561048d5761048d612308565b600181815b808511156125bb57815f19048211156125a1576125a1612308565b808516156125ae57918102915b93841c9390800290612586565b509250929050565b5f826125d15750600161048d565b816125dd57505f61048d565b81600181146125f357600281146125fd57612619565b600191505061048d565b60ff84111561260e5761260e612308565b50506001821b61048d565b5060208310610133831016604e8410600b841016171561263c575081810a61048d565b6126468383612581565b805f190482111561265957612659612308565b029392505050565b5f61048a83836125c3565b634e487b7160e01b5f52601260045260245ffd5b5f8261268e5761268e61266c565b500490565b5f600182016126a4576126a4612308565b5060010190565b8082018082111561048d5761048d612308565b5f826126cc576126cc61266c565b500690565b60ff818116838216019081111561048d5761048d612308565b634e487b7160e01b5f52603260045260245ffd5b5f835161270f818460208801611ff5565b835190830190612723818360208801611ff5565b01949350505050565b5f825161273d818460208701611ff5565b600b60fa1b920191825250600101919050565b5f8251612761818460208701611ff5565b601760f91b920191825250600101919050565b81516001600160a01b03168152610160810160208301516127a060208401826001600160a01b03169052565b5060408301516127b7604084018262ffffff169052565b5060608301516127cc606084018260020b9052565b5060808301516127e1608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151612827828501826001600160a01b03169052565b505061014092830151919092015290565b5f805f806080858703121561284b575f80fd5b8451935060208501516001600160801b0381168114612868575f80fd5b6040860151606090960151949790965092505050565b5f6020828403121561288e575f80fd5b5051919050565b5f8260020b806128a7576128a761266c565b808360020b0791505092915050565b600282810b9082900b03627fffff198112627fffff8213171561048d5761048d61230856fe608060405234801561000f575f80fd5b5061084d8061001d5f395ff3fe60806040526004361061007c575f3560e01c8063894760691161004c5780638947606914610117578063c4d66de814610136578063e086e5ec14610155578063fc0c546a14610169575f80fd5b80633a98ef3914610087578063476343ee146100af5780634c02f62e146100c557806357a858fc146100d9575f80fd5b3661008357005b5f80fd5b348015610092575f80fd5b5061009c60015481565b6040519081526020015b60405180910390f35b3480156100ba575f80fd5b506100c36101a0565b005b3480156100d0575f80fd5b506100c36101bf565b3480156100e4575f80fd5b506100f86100f33660046106ea565b610236565b604080516001600160a01b0390931683526020830191909152016100a6565b348015610122575f80fd5b506100c3610131366004610715565b61026b565b348015610141575f80fd5b506100c3610150366004610715565b61052f565b348015610160575f80fd5b506100c3610599565b348015610174575f80fd5b50600254610188906001600160a01b031681565b6040516001600160a01b0390911681526020016100a6565b6101a86101bf565b6002546101bd906001600160a01b031661026b565b565b6101bd7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610212573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101319190610737565b5f8181548110610244575f80fd5b5f918252602090912060029091020180546001909101546001600160a01b03909116915082565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e09190610737565b9050806001600160a01b0316826001600160a01b0316036103c0576040516370a0823160e01b81523060048201526001600160a01b03821690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015610345573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103699190610752565b6040518263ffffffff1660e01b815260040161038791815260200190565b5f604051808303815f87803b15801561039e575f80fd5b505af11580156103b0573d5f803e3d5ffd5b505050506103bc610599565b5050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610404573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104289190610752565b9050801561052a575f5b5f54811015610528575f80828154811061044e5761044e610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03908116808452600192830154948401859052915492945088169263a9059cbb929061049d9088610791565b6104a791906107ae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156104ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051391906107cd565b50508080610520906107ec565b915050610432565b505b505050565b6001541561053b575f80fd5b600280546001600160a01b0319163317905561055881600361063c565b61057773e6c791fbd46db3f4eda5f7bb76474f4fa530733e600261063c565b61059673c28c9da0f8a500dffc16ff09a3dd1cc4c530d346600161063c565b50565b478015610596575f5b5f548110156103bc575f8082815481106105be576105be610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03168083526001918201549383018490529054919350916108fc91906106079087610791565b61061191906107ae565b6040518115909202915f818181858888f1935050505050508080610634906107ec565b9150506105a2565b604080518082019091526001600160a01b038381168252602082018381525f80546001808201835582805294517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563600290920291820180546001600160a01b031916919095161790935590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909201919091558154839291906106e1908490610804565b90915550505050565b5f602082840312156106fa575f80fd5b5035919050565b6001600160a01b0381168114610596575f80fd5b5f60208284031215610725575f80fd5b813561073081610701565b9392505050565b5f60208284031215610747575f80fd5b815161073081610701565b5f60208284031215610762575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107a8576107a861077d565b92915050565b5f826107c857634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156107dd575f80fd5b81518015158114610730575f80fd5b5f600182016107fd576107fd61077d565b5060010190565b808201808211156107a8576107a861077d56fea26469706673582212205a7d6207f78ca60fa96c729b5948f291193052a1303377654ac9c3ef10d5ae3a64736f6c6343000815003343726561746564207769746820426f73736d616e27732042616b657279202862616b6572792e6d756c6c65742e6361706974616c2921a2646970667358221220d15a9c359bb5a5fd7a5ffce6c29d3ea55d4d85e9848f95dfc71def0599c5044e64736f6c63430008150033608060405234801561000f575f80fd5b5061084d8061001d5f395ff3fe60806040526004361061007c575f3560e01c8063894760691161004c5780638947606914610117578063c4d66de814610136578063e086e5ec14610155578063fc0c546a14610169575f80fd5b80633a98ef3914610087578063476343ee146100af5780634c02f62e146100c557806357a858fc146100d9575f80fd5b3661008357005b5f80fd5b348015610092575f80fd5b5061009c60015481565b6040519081526020015b60405180910390f35b3480156100ba575f80fd5b506100c36101a0565b005b3480156100d0575f80fd5b506100c36101bf565b3480156100e4575f80fd5b506100f86100f33660046106ea565b610236565b604080516001600160a01b0390931683526020830191909152016100a6565b348015610122575f80fd5b506100c3610131366004610715565b61026b565b348015610141575f80fd5b506100c3610150366004610715565b61052f565b348015610160575f80fd5b506100c3610599565b348015610174575f80fd5b50600254610188906001600160a01b031681565b6040516001600160a01b0390911681526020016100a6565b6101a86101bf565b6002546101bd906001600160a01b031661026b565b565b6101bd7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610212573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101319190610737565b5f8181548110610244575f80fd5b5f918252602090912060029091020180546001909101546001600160a01b03909116915082565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e09190610737565b9050806001600160a01b0316826001600160a01b0316036103c0576040516370a0823160e01b81523060048201526001600160a01b03821690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015610345573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103699190610752565b6040518263ffffffff1660e01b815260040161038791815260200190565b5f604051808303815f87803b15801561039e575f80fd5b505af11580156103b0573d5f803e3d5ffd5b505050506103bc610599565b5050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610404573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104289190610752565b9050801561052a575f5b5f54811015610528575f80828154811061044e5761044e610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03908116808452600192830154948401859052915492945088169263a9059cbb929061049d9088610791565b6104a791906107ae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156104ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051391906107cd565b50508080610520906107ec565b915050610432565b505b505050565b6001541561053b575f80fd5b600280546001600160a01b0319163317905561055881600361063c565b61057773e6c791fbd46db3f4eda5f7bb76474f4fa530733e600261063c565b61059673c28c9da0f8a500dffc16ff09a3dd1cc4c530d346600161063c565b50565b478015610596575f5b5f548110156103bc575f8082815481106105be576105be610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03168083526001918201549383018490529054919350916108fc91906106079087610791565b61061191906107ae565b6040518115909202915f818181858888f1935050505050508080610634906107ec565b9150506105a2565b604080518082019091526001600160a01b038381168252602082018381525f80546001808201835582805294517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563600290920291820180546001600160a01b031916919095161790935590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909201919091558154839291906106e1908490610804565b90915550505050565b5f602082840312156106fa575f80fd5b5035919050565b6001600160a01b0381168114610596575f80fd5b5f60208284031215610725575f80fd5b813561073081610701565b9392505050565b5f60208284031215610747575f80fd5b815161073081610701565b5f60208284031215610762575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107a8576107a861077d565b92915050565b5f826107c857634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156107dd575f80fd5b81518015158114610730575f80fd5b5f600182016107fd576107fd61077d565b5060010190565b808201808211156107a8576107a861077d56fea26469706673582212205a7d6207f78ca60fa96c729b5948f291193052a1303377654ac9c3ef10d5ae3a64736f6c63430008150033

Deployed Bytecode

0x60806040526004361061006e575f3560e01c80637e1c0c091161004c5780637e1c0c09146100ec5780639bb932d414610109578063bfa0b1331461011c578063c36d468614610130575f80fd5b806341f1afc7146100725780636f2ddd93146100ae5780636ff97f1d146100cb575b5f80fd5b34801561007d575f80fd5b5061009161008c3660046103b4565b61014d565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b9575f80fd5b506002546001600160a01b0316610091565b3480156100d6575f80fd5b506100df61017c565b6040516100a591906103cb565b3480156100f7575f80fd5b505f545b6040519081526020016100a5565b6100916101173660046104b4565b6101dd565b348015610127575f80fd5b506100fb610345565b34801561013b575f80fd5b506003546001600160a01b0316610091565b5f805f01828154811061016257610162610555565b5f918252602090912001546001600160a01b031692915050565b60605f80018054806020026020016040519081016040528092919081815260200182805480156101d357602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116101b5575b5050505050905090565b5f805f6101e8610345565b90508a1561025757600254604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b815260609190911b6bffffffffffffffffffffffff1916601482018190526e5af43d82803e903d91602b57fd5bf360881b60288301525f918360378285f5945061028592505050565b80604051610264906103a7565b8190604051809103905ff5905080158015610281573d5f803e3d5ffd5b5091505b50604051630947f66960e41b81526001600160a01b0382169063947f66909034906102c29033908e908e908e908e908e908e908e906004016105ac565b5f604051808303818588803b1580156102d9575f80fd5b505af11580156102eb573d5f803e3d5ffd5b50505f80546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b03861617905550919b9a5050505050505050505050565b335f8181526001602052604081208054919291908361036383610610565b9091555060405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160405160208183030381529060405280519060200120905090565b6131ce8061063583390190565b5f602082840312156103c4575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561040b5783516001600160a01b0316835292840192918401916001016103e6565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261043a575f80fd5b813567ffffffffffffffff8082111561045557610455610417565b604051601f8301601f19908116603f0116810190828211818310171561047d5761047d610417565b81604052838152866020858801011115610495575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b0312156104cc575f80fd5b883580151581146104db575f80fd5b9750602089013567ffffffffffffffff808211156104f7575f80fd5b6105038c838d0161042b565b985060408b0135915080821115610518575f80fd5b506105258b828c0161042b565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e090910135945092505050565b634e487b7160e01b5f52603260045260245ffd5b5f81518084525f5b8181101561058d57602081850181015186830182015201610571565b505f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0389168152610100602082018190525f906105d08382018b610569565b905082810360408401526105e4818a610569565b60608401989098525050608081019490945260a084019290925260c083015260e0909101529392505050565b5f6001820161062d57634e487b7160e01b5f52601160045260245ffd5b506001019056fe608060405234801561000f575f80fd5b506131b18061001d5f395ff3fe608060405260043610610131575f3560e01c806367e828bf116100a8578063a9059cbb1161006d578063a9059cbb14610329578063ba5b798214610348578063bdaaa6401461036f578063dd62ed3e14610383578063e88958dc146103cb578063f83d08ba146103df575f80fd5b806367e828bf1461029857806370a08231146102ac57806385f2aef2146102e0578063947f66901461030257806395d89b4114610315575f80fd5b806318160ddd116100f957806318160ddd146101ec57806323b872dd1461020a578063313ce567146102295780633b5f19351461024f5780634000aea01461026357806353f8b30314610282575f80fd5b806302d05d3f1461013557806306fdde031461016b578063095ea7b31461018c5780630bb68bd2146101bb57806316f0115b146101cf575b5f80fd5b348015610140575f80fd5b506004546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610176575f80fd5b5061017f6103f3565b6040516101629190612017565b348015610197575f80fd5b506101ab6101a6366004612060565b61047e565b6040519015158152602001610162565b3480156101c6575f80fd5b5061017f610493565b3480156101da575f80fd5b506003546001600160a01b031661014e565b3480156101f7575f80fd5b506005545b604051908152602001610162565b348015610215575f80fd5b506101ab61022436600461208a565b6104d4565b348015610234575f80fd5b5061023d601281565b60405160ff9091168152602001610162565b34801561025a575f80fd5b5061017f610551565b34801561026e575f80fd5b506101ab61027d3660046120c8565b610575565b34801561028d575f80fd5b50610296610616565b005b3480156102a3575f80fd5b5061017f610879565b3480156102b7575f80fd5b506101fc6102c636600461214a565b6001600160a01b03165f908152600a602052604090205490565b3480156102eb575f80fd5b5060025461010090046001600160a01b031661014e565b610296610310366004612202565b610895565b348015610320575f80fd5b5061017f610a86565b348015610334575f80fd5b506101ab610343366004612060565b610a93565b348015610353575f80fd5b50600b54600c5460408051928352602083019190915201610162565b34801561037a575f80fd5b5061017f610a9f565b34801561038e575f80fd5b506101fc61039d36600461229f565b6001600160a01b039182165f908152600a602090815260408083209390941682526001909201909152205490565b3480156103d6575f80fd5b5061017f610ab3565b3480156103ea575f80fd5b50610296610ac8565b5f80546103ff906122d6565b80601f016020809104026020016040519081016040528092919081815260200182805461042b906122d6565b80156104765780601f1061044d57610100808354040283529160200191610476565b820191905f5260205f20905b81548152906001019060200180831161045957829003601f168201915b505050505081565b5f61048a338484610af2565b90505b92915050565b6008546060906104b0906104a890606461231c565b600380610b5e565b6040516020016104c09190612333565b604051602081830303815290604052905090565b6001600160a01b0383165f908152600a6020908152604080832033845260010190915281205482811015610506575f80fd5b5f19811461053b576001600160a01b0385165f908152600a602090815260408083203384526001019091529020805484900390555b610546858585610e76565b9150505b9392505050565b606061056560026004015460126005610b5e565b6040516020016104c09190612357565b5f610581338686610e76565b50843b63ffffffff81161561060a57604051636be32e7360e01b81526001600160a01b03871690636be32e73906105c290339089908990899060040161237e565b6020604051808303815f875af11580156105de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060291906123c5565b61060a575f80fd5b50600195945050505050565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610667573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068b91906123e4565b600b549091501561075457806001600160a01b031663fc6f7865604051806080016040528060026009015481526020016106d36002546001600160a01b036101009091041690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b16815261071291906004016123ff565b60408051808303815f875af115801561072d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107519190612442565b50505b806001600160a01b031663fc6f786560405180608001604052806002600a015481526020016107916002546001600160a01b036101009091041690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526107d091906004016123ff565b60408051808303815f875af11580156107eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080f9190612442565b505060025f0160019054906101000a90046001600160a01b03166001600160a01b031663476343ee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610860575f80fd5b505af1158015610872573d5f803e3d5ffd5b5050505050565b6040518060600160405280603681526020016131466036913981565b60025460ff16156108a4575f80fd5b600554156108b0575f80fd5b5f87511180156108c257506020875111155b6108ca575f80fd5b5f86511180156108dc57506020865111155b6108e4575f80fd5b662386f26fc10000851015801561090957506d314dc6448d9338c15b0a000000008511155b610911575f80fd5b5f8411801561091f57508383115b610927575f80fd5b6103e88210610934575f80fd5b6103e88110610941575f80fd5b60405161094d90611fe8565b604051809103905ff080158015610966573d5f803e3d5ffd5b5060028054610100600160a81b0319166101006001600160a01b039384168102919091179182905560405163189acdbd60e31b81528b8416600482015291049091169063c4d66de8906024015f604051808303815f87803b1580156109c9575f80fd5b505af11580156109db573d5f803e3d5ffd5b5050600480546001600160a01b0319166001600160a01b038c16179055505f9050610a0688826124b2565b506001610a1387826124b2565b506005859055305f818152600a60209081526040808320899055518881527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36006849055600783905560088290556009819055610a7c84848484610f0c565b5050505050505050565b600180546103ff906122d6565b5f61048a338484610e76565b606061056560026005015460126005610b5e565b6009546060906104b0906104a890606461231c565b60025460ff1615610ad7575f80fd5b60055415610ae3575f80fd5b6002805460ff19166001179055565b6001600160a01b038381165f818152600a602090815260408083209487168084526001909501825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b60605f828411610b6e5783610b70565b825b90505f818511610b80575f610b8a565b610b8a828661256e565b610b9590600a612661565b610b9f9087612680565b9050805f03610bcb57604051806040016040528060018152602001600360fc1b8152509250505061054a565b6001815b6009811115610bf757610be3600a82612680565b905081610bef81612693565b925050610bcf565b838211610c0e57610c098460016126ab565b610c10565b815b90505f610c1e8560016126ab565b8211610c2a575f610c63565b846001610c37828561256e565b610c41919061256e565b11610c61576001610c52868461256e565b610c5c919061256e565b610c63565b845b90505f5b610c71828461256e565b811015610e69575f610c83858561256e565b8210610cc557600a6001610c97848761256e565b610ca1919061256e565b610cac90600a612661565b610cb69088612680565b610cc091906126be565b610cc7565b5f5b6040805160018082528183019092529192505f9190602082018180368337019050509050610cf68260306126d1565b60f81b815f81518110610d0b57610d0b6126ea565b60200101906001600160f81b03191690815f1a9053508881604051602001610d349291906126fe565b60408051601f1981840301815291905298506001610d52898761256e565b610d5c919061256e565b831015610dbd576003610d6f898761256e565b610d7991906126be565b6003610d868560016126ab565b610d9091906126be565b03610db85788604051602001610da6919061272c565b60405160208183030381529060405298505b610e54565b600183610dca868861256e565b610dd4919061256e565b610dde919061256e565b610de990600a612661565b610df485600a612661565b610dfe9089612680565b610e0891906126be565b5f03610e15575050610e69565b6001610e21898761256e565b610e2b919061256e565b8303610e545788604051602001610e429190612750565b60405160208183030381529060405298505b50508080610e6190612693565b915050610c67565b5050505050509392505050565b5f808211610e82575f80fd5b81610ea1856001600160a01b03165f908152600a602052604090205490565b1015610eab575f80fd5b6001600160a01b038085165f818152600a6020526040808220805487900390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b4c9086815260200190565b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8591906123e4565b90506001600160a01b03808316908216105f610faa82610fa460055490565b8a6118e4565b5090507368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102191906123e4565b60405163a167129560e01b81526001600160a01b03868116600483015285811660248301526127106044830152919091169063a1671295906064016020604051808303815f875af1158015611078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109c91906123e4565b600380546001600160a01b0319166001600160a01b0392909216918217905560405163f637731d60e01b81526001600160a01b038381166004830152919091169063f637731d906024015f604051808303815f87803b1580156110fd575f80fd5b505af115801561110f573d5f803e3d5ffd5b505050505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611164573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118891906123e4565b905061119d858261119860055490565b610af2565b505f6111b2846111ac60055490565b8c6118e4565b9150505f6111c3856111ac60055490565b9150505f6103e86111d360055490565b8b02816111e2576111e261266c565b049050801561149557881561133e57836001600160a01b0316638831645660405180610160016040528089611217578b611219565b8a5b6001600160a01b031681526020018915611233578b611235565b8a5b6001600160a01b03168152612710602082015260400189611256578661125b565b60c887035b60020b8152602001891561126f5786611274565b8660c8015b60020b81526020018961128d576103e8858e020461128f565b5f5b815260200189156112a6576103e8858e02046112a8565b5f5b81526020015f81526020015f81526020016112cb6004546001600160a01b031690565b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016112f99190612774565b6080604051808303815f875af1158015611315573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113399190612838565b505050505b836001600160a01b0316638831645660405180610160016040528089611364578b611366565b8a5b6001600160a01b031681526020018915611380578b611382565b8a5b6001600160a01b031681526127106020820152604001896113a357866113a8565b60c887035b60020b815260200189156113bc57866113c1565b8660c8015b60020b8152602001896113dc576103e88d81038602046113de565b5f5b815260200189156113f7576103e88d81038602046113f9565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016114399190612774565b6080604051808303815f875af1158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190612838565b505050600b558561148d578260c801611492565b60c883035b92505b881561161057836001600160a01b03166388316456604051806101600160405280896114c1578b6114c3565b8a5b6001600160a01b0316815260200189156114dd578b6114df565b8a5b6001600160a01b031681526127106020820152604001896115005786611502565b855b60020b815260200189156115165786611518565b855b60020b815260200189611548576103e88d8661153360055490565b0302816115425761154261266c565b0461154a565b5f5b81526020018915611578576103e88d8661156360055490565b0302816115725761157261266c565b0461157a565b5f5b81526020015f81526020015f815260200161159d6004546001600160a01b031690565b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016115cb9190612774565b6080604051808303815f875af11580156115e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b9190612838565b505050505b836001600160a01b0316638831645660405180610160016040528089611636578b611638565b8a5b6001600160a01b031681526020018915611652578b611654565b8a5b6001600160a01b031681526127106020820152604001896116755786611677565b855b60020b8152602001891561168b578661168d565b855b60020b8152602001896116c1576103e88d6103e803866116ac60055490565b0302816116bb576116bb61266c565b046116c3565b5f5b815260200189156116f5576103e88d6103e803866116e060055490565b0302816116ef576116ef61266c565b046116f7565b5f5b81526020015f81526020015f81526020018b6001600160a01b03168152602001428152506040518263ffffffff1660e01b81526004016117379190612774565b6080604051808303815f875af1158015611753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117779190612838565b505050600c556001600160a01b03881631156118d6577368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b03166304e45aaf896001600160a01b0316316040518060e001604052808b6001600160a01b031681526020018c6001600160a01b0316815260200161271062ffffff1681526020016118036004546001600160a01b031690565b6001600160a01b0390811682528d8116316020808401919091525f604080850182905260609485019190915280516001600160e01b031960e089901b168152855184166004820152918501518316602483015284015162ffffff16604482015291830151811660648301526080830151608483015260a083015160a483015260c09092015190911660c482015260e40160206040518083038185885af11580156118af573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118d4919061287e565b505b505050505050505050505050565b5f805f611922866118f557846118f7565b855b87156119035785611905565b865b61191390600160c01b612680565b61191d919061231c565b61195a565b905061192d8161199d565b915061193a60c883612895565b61194490836128b6565b915061194f82611cba565b925050935093915050565b80600260018201045b81811015611997578091506002818285816119805761198061266c565b04018161198f5761198f61266c565b049050611963565b50919050565b5f6401000276a36001600160a01b038316108015906119d8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b611a0d5760405162461bcd60e51b81526020600482015260016024820152602960f91b60448201526064015b60405180910390fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c97908811961790941790921717909117171760808110611aa157607f810383901c9150611aab565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14611cab57886001600160a01b0316611c9082611cba565b6001600160a01b03161115611ca55781611cad565b80611cad565b815b9998505050505050505050565b5f805f8360020b12611ccf578260020b611cd6565b8260020b5f035b9050620d89e8811115611d0f5760405162461bcd60e51b81526020600482015260016024820152601560fa1b6044820152606401611a04565b5f816001165f03611d2457600160801b611d36565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611d6a576ffff97272373d413259a46990580e213a0260801c5b6004821615611d89576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611da8576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611dc7576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611de6576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611e05576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611e24576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611e44576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611e64576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611e84576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611ea4576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611ec4576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611ee4576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611f04576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611f24576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611f45576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611f65576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611f84576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611fa1576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611fc057805f1981611fbc57611fbc61266c565b0490505b640100000000810615611fd4576001611fd6565b5f5b60ff16602082901c0192505050919050565b61086a806128dc83390190565b5f5b8381101561200f578181015183820152602001611ff7565b50505f910152565b602081525f8251806020840152612035816040850160208701611ff5565b601f01601f19169190910160400192915050565b6001600160a01b038116811461205d575f80fd5b50565b5f8060408385031215612071575f80fd5b823561207c81612049565b946020939093013593505050565b5f805f6060848603121561209c575f80fd5b83356120a781612049565b925060208401356120b781612049565b929592945050506040919091013590565b5f805f80606085870312156120db575f80fd5b84356120e681612049565b935060208501359250604085013567ffffffffffffffff80821115612109575f80fd5b818701915087601f83011261211c575f80fd5b81358181111561212a575f80fd5b88602082850101111561213b575f80fd5b95989497505060200194505050565b5f6020828403121561215a575f80fd5b813561054a81612049565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612188575f80fd5b813567ffffffffffffffff808211156121a3576121a3612165565b604051601f8301601f19908116603f011681019082821181831017156121cb576121cb612165565b816040528381528660208588010111156121e3575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121561221a575f80fd5b883561222581612049565b9750602089013567ffffffffffffffff80821115612241575f80fd5b61224d8c838d01612179565b985060408b0135915080821115612262575f80fd5b5061226f8b828c01612179565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e090910135945092505050565b5f80604083850312156122b0575f80fd5b82356122bb81612049565b915060208301356122cb81612049565b809150509250929050565b600181811c908216806122ea57607f821691505b60208210810361199757634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761048d5761048d612308565b5f8251612344818460208701611ff5565b602560f81b920191825250600101919050565b5f8251612368818460208701611ff5565b630408aa8960e31b920191825250600401919050565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f602082840312156123d5575f80fd5b8151801515811461054a575f80fd5b5f602082840312156123f4575f80fd5b815161054a81612049565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f8060408385031215612453575f80fd5b505080516020909101519092909150565b601f8211156124ad575f81815260208120601f850160051c8101602086101561248a5750805b601f850160051c820191505b818110156124a957828155600101612496565b5050505b505050565b815167ffffffffffffffff8111156124cc576124cc612165565b6124e0816124da84546122d6565b84612464565b602080601f831160018114612513575f84156124fc5750858301515b5f19600386901b1c1916600185901b1785556124a9565b5f85815260208120601f198616915b8281101561254157888601518255948401946001909101908401612522565b508582101561255e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561048d5761048d612308565b600181815b808511156125bb57815f19048211156125a1576125a1612308565b808516156125ae57918102915b93841c9390800290612586565b509250929050565b5f826125d15750600161048d565b816125dd57505f61048d565b81600181146125f357600281146125fd57612619565b600191505061048d565b60ff84111561260e5761260e612308565b50506001821b61048d565b5060208310610133831016604e8410600b841016171561263c575081810a61048d565b6126468383612581565b805f190482111561265957612659612308565b029392505050565b5f61048a83836125c3565b634e487b7160e01b5f52601260045260245ffd5b5f8261268e5761268e61266c565b500490565b5f600182016126a4576126a4612308565b5060010190565b8082018082111561048d5761048d612308565b5f826126cc576126cc61266c565b500690565b60ff818116838216019081111561048d5761048d612308565b634e487b7160e01b5f52603260045260245ffd5b5f835161270f818460208801611ff5565b835190830190612723818360208801611ff5565b01949350505050565b5f825161273d818460208701611ff5565b600b60fa1b920191825250600101919050565b5f8251612761818460208701611ff5565b601760f91b920191825250600101919050565b81516001600160a01b03168152610160810160208301516127a060208401826001600160a01b03169052565b5060408301516127b7604084018262ffffff169052565b5060608301516127cc606084018260020b9052565b5060808301516127e1608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151612827828501826001600160a01b03169052565b505061014092830151919092015290565b5f805f806080858703121561284b575f80fd5b8451935060208501516001600160801b0381168114612868575f80fd5b6040860151606090960151949790965092505050565b5f6020828403121561288e575f80fd5b5051919050565b5f8260020b806128a7576128a761266c565b808360020b0791505092915050565b600282810b9082900b03627fffff198112627fffff8213171561048d5761048d61230856fe608060405234801561000f575f80fd5b5061084d8061001d5f395ff3fe60806040526004361061007c575f3560e01c8063894760691161004c5780638947606914610117578063c4d66de814610136578063e086e5ec14610155578063fc0c546a14610169575f80fd5b80633a98ef3914610087578063476343ee146100af5780634c02f62e146100c557806357a858fc146100d9575f80fd5b3661008357005b5f80fd5b348015610092575f80fd5b5061009c60015481565b6040519081526020015b60405180910390f35b3480156100ba575f80fd5b506100c36101a0565b005b3480156100d0575f80fd5b506100c36101bf565b3480156100e4575f80fd5b506100f86100f33660046106ea565b610236565b604080516001600160a01b0390931683526020830191909152016100a6565b348015610122575f80fd5b506100c3610131366004610715565b61026b565b348015610141575f80fd5b506100c3610150366004610715565b61052f565b348015610160575f80fd5b506100c3610599565b348015610174575f80fd5b50600254610188906001600160a01b031681565b6040516001600160a01b0390911681526020016100a6565b6101a86101bf565b6002546101bd906001600160a01b031661026b565b565b6101bd7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610212573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101319190610737565b5f8181548110610244575f80fd5b5f918252602090912060029091020180546001909101546001600160a01b03909116915082565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e09190610737565b9050806001600160a01b0316826001600160a01b0316036103c0576040516370a0823160e01b81523060048201526001600160a01b03821690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015610345573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103699190610752565b6040518263ffffffff1660e01b815260040161038791815260200190565b5f604051808303815f87803b15801561039e575f80fd5b505af11580156103b0573d5f803e3d5ffd5b505050506103bc610599565b5050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610404573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104289190610752565b9050801561052a575f5b5f54811015610528575f80828154811061044e5761044e610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03908116808452600192830154948401859052915492945088169263a9059cbb929061049d9088610791565b6104a791906107ae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156104ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051391906107cd565b50508080610520906107ec565b915050610432565b505b505050565b6001541561053b575f80fd5b600280546001600160a01b0319163317905561055881600361063c565b61057773e6c791fbd46db3f4eda5f7bb76474f4fa530733e600261063c565b61059673c28c9da0f8a500dffc16ff09a3dd1cc4c530d346600161063c565b50565b478015610596575f5b5f548110156103bc575f8082815481106105be576105be610769565b5f9182526020918290206040805180820190915260029092020180546001600160a01b03168083526001918201549383018490529054919350916108fc91906106079087610791565b61061191906107ae565b6040518115909202915f818181858888f1935050505050508080610634906107ec565b9150506105a2565b604080518082019091526001600160a01b038381168252602082018381525f80546001808201835582805294517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563600290920291820180546001600160a01b031916919095161790935590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564909201919091558154839291906106e1908490610804565b90915550505050565b5f602082840312156106fa575f80fd5b5035919050565b6001600160a01b0381168114610596575f80fd5b5f60208284031215610725575f80fd5b813561073081610701565b9392505050565b5f60208284031215610747575f80fd5b815161073081610701565b5f60208284031215610762575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107a8576107a861077d565b92915050565b5f826107c857634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156107dd575f80fd5b81518015158114610730575f80fd5b5f600182016107fd576107fd61077d565b5060010190565b808201808211156107a8576107a861077d56fea26469706673582212205a7d6207f78ca60fa96c729b5948f291193052a1303377654ac9c3ef10d5ae3a64736f6c6343000815003343726561746564207769746820426f73736d616e27732042616b657279202862616b6572792e6d756c6c65742e6361706974616c2921a2646970667358221220d15a9c359bb5a5fd7a5ffce6c29d3ea55d4d85e9848f95dfc71def0599c5044e64736f6c63430008150033a26469706673582212206fbb11124a4c98cc46e2c52e2a508beab1f8034dc29e64fc4245137e1b2d92a064736f6c63430008150033

Deployed Bytecode Sourcemap

81:1923:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1815:100;;;;;;;;;;-1:-1:-1;1815:100:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;377:32:2;;;359:51;;347:2;332:18;1815:100:0;;;;;;;;1563:78;;;;;;;;;;-1:-1:-1;1624:13:0;;-1:-1:-1;;;;;1624:13:0;1563:78;;1918:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1726:86::-;;;;;;;;;;-1:-1:-1;1770:7:0;1790:18;1726:86;;;1452:25:2;;;1440:2;1425:18;1726:86:0;1306:177:2;558:1001:0;;;;;;:::i;:::-;;:::i;434:121::-;;;;;;;;;;;;;:::i;1644:78::-;;;;;;;;;;-1:-1:-1;1709:9:0;;-1:-1:-1;;;;;1709:9:0;1644:78;;1815:100;1874:5;1892:4;:11;;1904:6;1892:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1892:19:0;;1815:100;-1:-1:-1;;1815:100:0:o;1918:84::-;1960:14;1987:4;:11;;1980:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1980:18:0;;;;;;;;;;;;;;;;;;;;;;;1918:84;:::o;558:1001::-;788:7;801:12;822:13;838:6;:4;:6::i;:::-;822:22;;853:12;849:498;;;921:13;;977:4;971:11;-1:-1:-1;;;988:82:0;;913:22;;;;;-1:-1:-1;;913:22:0;1095:4;1083:17;;1076:36;;;-1:-1:-1;;;1137:4:0;1125:17;;1118:93;-1:-1:-1;;1252:5:0;1246:4;971:11;-1:-1:-1;1227:31:0;1217:41;-1:-1:-1;849:498:0;;-1:-1:-1;;;849:498:0;;1333:5;1318:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1309:32;;849:498;-1:-1:-1;1354:147:0;;-1:-1:-1;;;1354:147:0;;-1:-1:-1;;;;;1354:17:0;;;;;1378:9;;1354:147;;1389:10;;1401:5;;1408:7;;1417:12;;1431:17;;1450:15;;1467:20;;1489:11;;1354:147;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1505:4:0;:24;;;;;;;;;;;;;;-1:-1:-1;;;;;;1505:24:0;-1:-1:-1;;;;;1505:24:0;;;;;-1:-1:-1;1505:24:0;;558:1001;-1:-1:-1;;;;;;;;;;;558:1001:0:o;434:121::-;513:10;466:7;525:22;;;:10;:22;;;;;:24;;466:7;;513:10;525:24;466:7;525:24;;;:::i;:::-;;;;-1:-1:-1;496:54:0;;5420:2:2;5416:15;;;;-1:-1:-1;;5412:53:2;496:54:0;;;5400:66:2;5482:12;;;5475:28;5519:12;;496:54:0;;;;;;;;;;;;486:65;;;;;;479:72;;434:121;:::o;-1:-1:-1:-;;;;;;;;:::o;14:180:2:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:2;;14:180;-1:-1:-1;14:180:2:o;629:672::-;814:2;866:21;;;936:13;;839:18;;;958:22;;;785:4;;814:2;1037:15;;;;1011:2;996:18;;;785:4;1080:195;1094:6;1091:1;1088:13;1080:195;;;1159:13;;-1:-1:-1;;;;;1155:39:2;1143:52;;1250:15;;;;1215:12;;;;1191:1;1109:9;1080:195;;;-1:-1:-1;1292:3:2;;629:672;-1:-1:-1;;;;;;629:672:2:o;1488:127::-;1549:10;1544:3;1540:20;1537:1;1530:31;1580:4;1577:1;1570:15;1604:4;1601:1;1594:15;1620:719;1663:5;1716:3;1709:4;1701:6;1697:17;1693:27;1683:55;;1734:1;1731;1724:12;1683:55;1770:6;1757:20;1796:18;1833:2;1829;1826:10;1823:36;;;1839:18;;:::i;:::-;1914:2;1908:9;1882:2;1968:13;;-1:-1:-1;;1964:22:2;;;1988:2;1960:31;1956:40;1944:53;;;2012:18;;;2032:22;;;2009:46;2006:72;;;2058:18;;:::i;:::-;2098:10;2094:2;2087:22;2133:2;2125:6;2118:18;2179:3;2172:4;2167:2;2159:6;2155:15;2151:26;2148:35;2145:55;;;2196:1;2193;2186:12;2145:55;2260:2;2253:4;2245:6;2241:17;2234:4;2226:6;2222:17;2209:54;2307:1;2300:4;2295:2;2287:6;2283:15;2279:26;2272:37;2327:6;2318:15;;;;;;1620:719;;;;:::o;2344:1049::-;2483:6;2491;2499;2507;2515;2523;2531;2539;2592:3;2580:9;2571:7;2567:23;2563:33;2560:53;;;2609:1;2606;2599:12;2560:53;2648:9;2635:23;2701:5;2694:13;2687:21;2680:5;2677:32;2667:60;;2723:1;2720;2713:12;2667:60;2746:5;-1:-1:-1;2802:2:2;2787:18;;2774:32;2825:18;2855:14;;;2852:34;;;2882:1;2879;2872:12;2852:34;2905:50;2947:7;2938:6;2927:9;2923:22;2905:50;:::i;:::-;2895:60;;3008:2;2997:9;2993:18;2980:32;2964:48;;3037:2;3027:8;3024:16;3021:36;;;3053:1;3050;3043:12;3021:36;;3076:52;3120:7;3109:8;3098:9;3094:24;3076:52;:::i;:::-;2344:1049;;;;-1:-1:-1;3066:62:2;;3175:2;3160:18;;3147:32;;-1:-1:-1;3226:3:2;3211:19;;3198:33;;3278:3;3263:19;;3250:33;;-1:-1:-1;3330:3:2;3315:19;;3302:33;;-1:-1:-1;3382:3:2;3367:19;;;3354:33;;-1:-1:-1;2344:1049:2;-1:-1:-1;;;2344:1049:2:o;3580:127::-;3641:10;3636:3;3632:20;3629:1;3622:31;3672:4;3669:1;3662:15;3696:4;3693:1;3686:15;3712:423;3754:3;3792:5;3786:12;3819:6;3814:3;3807:19;3844:1;3854:162;3868:6;3865:1;3862:13;3854:162;;;3930:4;3986:13;;;3982:22;;3976:29;3958:11;;;3954:20;;3947:59;3883:12;3854:162;;;3858:3;4061:1;4054:4;4045:6;4040:3;4036:16;4032:27;4025:38;4124:4;4117:2;4113:7;4108:2;4100:6;4096:15;4092:29;4087:3;4083:39;4079:50;4072:57;;;3712:423;;;;:::o;4140:861::-;-1:-1:-1;;;;;4527:32:2;;4509:51;;4497:3;4591:2;4576:18;;4569:30;;;4468:4;;4622:45;4648:18;;;4640:6;4622:45;:::i;:::-;4608:59;;4715:9;4707:6;4703:22;4698:2;4687:9;4683:18;4676:50;4743:33;4769:6;4761;4743:33;:::i;:::-;4807:2;4792:18;;4785:34;;;;-1:-1:-1;;4850:3:2;4835:19;;4828:35;;;;4894:3;4879:19;;4872:35;;;;4938:3;4923:19;;4916:35;4982:3;4967:19;;;4960:35;4735:41;4140:861;-1:-1:-1;;;4140:861:2:o;5006:232::-;5045:3;5066:17;;;5063:140;;5125:10;5120:3;5116:20;5113:1;5106:31;5160:4;5157:1;5150:15;5188:4;5185:1;5178:15;5063:140;-1:-1:-1;5230:1:2;5219:13;;5006:232::o

Swarm Source

ipfs://5a7d6207f78ca60fa96c729b5948f291193052a1303377654ac9c3ef10d5ae3a

Block Transaction Difficulty 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
Loading...
Loading
[ 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.