| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x283e44…557438 | 33 days agoThu, 16 Jul 2026 03:24:16 UTC | 0x7f26b8…2498 | data: 0x000000000000000000…000000ff |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 13,534,964 | 30 days agoSun, 19 Jul 2026 03:56:15 UTC | 0xdc5036…31448f | DELEGATECALL | createAndInitPurchase | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.002 ETH |
| 11,960,983 | 32 days agoFri, 17 Jul 2026 08:03:19 UTC | 0xe67edc…402055 | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.0025 ETH |
| 11,904,417 | 32 days agoFri, 17 Jul 2026 06:28:33 UTC | 0xe8355c…3bc8ce | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.01 ETH |
| 11,904,298 | 32 days agoFri, 17 Jul 2026 06:28:21 UTC | 0x6353bf…d4f7ab | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
| 11,874,676 | 32 days agoFri, 17 Jul 2026 05:38:47 UTC | 0xfb1cc9…1fdd21 | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
| 11,874,299 | 32 days agoFri, 17 Jul 2026 05:38:09 UTC | 0x945182…c1e60c | DELEGATECALL | createToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
| 11,853,808 | 32 days agoFri, 17 Jul 2026 05:03:55 UTC | 0xfacfc3…1f2794 | DELEGATECALL | createToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
| 11,786,557 | 32 days agoFri, 17 Jul 2026 03:11:30 UTC | 0x9f3586…f87782 | DELEGATECALL | createAndInitPurchase | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.011 ETH |
| 11,126,460 | 32 days agoThu, 16 Jul 2026 08:50:29 UTC | 0xf085af…a21dac | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.02 ETH |
| 11,119,245 | 32 days agoThu, 16 Jul 2026 08:38:26 UTC | 0x6a18bf…70f9ea | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.0185 ETH |
| 11,112,618 | 32 days agoThu, 16 Jul 2026 08:27:21 UTC | 0x106d6f…a68da3 | DELEGATECALL | createToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
| 10,980,882 | 33 days agoThu, 16 Jul 2026 04:47:16 UTC | 0x0b7d3a…81ca19 | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.02 ETH |
| 10,935,356 | 33 days agoThu, 16 Jul 2026 03:31:17 UTC | 0x13d44b…ab1e5d | DELEGATECALL | purchaseToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
| 10,933,710 | 33 days agoThu, 16 Jul 2026 03:28:33 UTC | 0xd4c411…cd1a53 | DELEGATECALL | createToken | 0x58e5…56c1 | IN | 0x1bc2…00bb | 0.001 ETH |
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "./interfaces/INonfungiblePositionManager.sol";
import "./interfaces/IWETH9.sol";
import "./LaunchTokenV1.sol";
import "./RobinVaultV1.sol";
import "./LPLockerV1.sol";
import "forge-std/console2.sol";
contract RobinLaunchpadV1 is
Initializable,
ReentrancyGuardUpgradeable,
PausableUpgradeable,
Ownable2StepUpgradeable,
UUPSUpgradeable
{
using SafeERC20 for IERC20;
// ---------- constants ----------
uint256 public constant TOKEN_SUPPLY = 1_000_000_000e18; // 代币总供应量
uint256 public constant LAUNCH_THRESHOLD = 800_000_000e18; // 启动阈值(进入 LP 的代币量)
uint256 public constant TOTAL_SALE = 200_000_000e18; // 总发售量
uint256 public constant BASE_FEE = 10_000; // 费率基数(用于百分比计算)
uint24 public constant POOL_FEE = 10_000; // 池子手续费 1%
int24 public constant TICK_LOWER = -887200; // 流动性 tick 下限(全范围)
int24 public constant TICK_UPPER = 887200; // 流动性 tick 上限(全范围)
// ---------- launch parameters (set in initialize) ----------
uint256 public launchFee; // 启动费
uint256 public virtualOKReserveAmount; // 虚拟 ETH 储备量
uint256 public launchOKReserve; // 启动 ETH 储备目标
uint256 public virtualTokenReserveAmount; // 虚拟代币储备量
// ---------- structs ----------
struct VirtualPool {
uint256 ethReserve;
uint256 tokenReserve;
bool launched;
}
// ---------- state ----------
uint256 public tokenCount;
address public vault;
address public operator;
/// @dev Deprecated: launcher role is no longer used for access control.
/// Kept for storage-layout compatibility across upgrades.
address public launcher;
address public positionManager;
address public weth9;
address public lpLocker;
uint256 public saleFee;
uint256 public purchaseFee;
uint256 public mintFee;
uint256 public minTxFee;
mapping(uint256 => address) public tokenAddress;
mapping(address => address) public tokenCreator;
mapping(address => VirtualPool) public virtualPools;
mapping(address => bool) public whitelist;
bool public whitelistEnabled;
// ---------- events ----------
event TokenCreate(address indexed tokenAddress, uint256 indexed tokenIndex, address indexed creator);
event TokenPurchased(
address indexed token,
address indexed buyer,
uint256 ethAmount,
uint256 fee,
uint256 tokenAmount,
uint256 tokenReserve
);
event TokenSold(address indexed token, address indexed seller, uint256 ethAmount, uint256 fee, uint256 tokenAmount);
event TokenLaunched(address indexed token);
event LaunchPending(address indexed token);
event OperatorChanged(address indexed oldOperator, address indexed newOperator);
/// @dev Deprecated: launcher role is no longer used; event kept for interface compatibility.
event LauncherChanged(address indexed oldLauncher, address indexed newLauncher);
event PurchaseFeeSet(uint256 oldFee, uint256 newFee);
event SaleFeeSet(uint256 oldFee, uint256 newFee);
event MinTxFeeSet(uint256 oldFee, uint256 newFee);
event MintFeeSet(uint256 oldFee, uint256 newFee);
// ---------- modifiers ----------
modifier onlyOperator() {
require(msg.sender == operator, "RobinLaunchpad: not operator");
_;
}
modifier onlyWhitelisted() {
require(!whitelistEnabled || whitelist[msg.sender], "RobinLaunchpad: not whitelisted");
_;
}
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
// ---------- initializer ----------
function initialize(
address vault_,
address launcher_,
address operator_,
address positionManager_,
address weth9_,
address lpLocker_,
uint256 purchaseFee_,
uint256 saleFee_,
uint256 mintFee_,
uint256 minTxFee_,
uint256 launchFee_,
uint256 virtualOKReserveAmount_,
uint256 launchOKReserve_,
uint256 virtualTokenReserveAmount_
) external initializer {
require(vault_ != address(0), "RobinLaunchpad: zero vault");
require(positionManager_ != address(0), "RobinLaunchpad: zero position manager");
require(weth9_ != address(0), "RobinLaunchpad: zero weth");
require(lpLocker_ != address(0), "RobinLaunchpad: zero lp locker");
__ReentrancyGuard_init();
__Pausable_init();
__Ownable2Step_init();
__UUPSUpgradeable_init();
vault = vault_;
launcher = launcher_;
operator = operator_;
positionManager = positionManager_;
weth9 = weth9_;
lpLocker = lpLocker_;
purchaseFee = purchaseFee_;
saleFee = saleFee_;
mintFee = mintFee_;
minTxFee = minTxFee_;
launchFee = launchFee_;
virtualOKReserveAmount = virtualOKReserveAmount_;
launchOKReserve = launchOKReserve_;
virtualTokenReserveAmount = virtualTokenReserveAmount_;
whitelist[msg.sender] = true;
}
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
// ---------- whitelist ----------
function setWhitelistEnabled(bool enabled) external onlyOwner {
whitelistEnabled = enabled;
}
function addToWhitelist(address user) external onlyOwner {
whitelist[user] = true;
}
function removeFromWhitelist(address user) external onlyOwner {
whitelist[user] = false;
}
// ---------- core: create token ----------
function createAndInitPurchase(string memory name, string memory symbol, uint256 salt)
external
payable
nonReentrant
whenNotPaused
onlyWhitelisted
returns (address)
{
require(msg.value >= mintFee, "RobinLaunchpad: insufficient mint fee");
LaunchTokenV1 token = _createToken(name, symbol, salt);
tokenCreator[address(token)] = msg.sender;
// send mint fee to vault
_transferETH(vault, mintFee);
uint256 remaining = msg.value - mintFee;
if (remaining > 0) {
_purchase(address(token), remaining, 0, msg.sender);
}
return address(token);
}
function createToken(string memory name, string memory symbol, uint256 salt)
external
payable
nonReentrant
whenNotPaused
onlyWhitelisted
returns (address)
{
require(msg.value >= mintFee, "RobinLaunchpad: insufficient mint fee");
LaunchTokenV1 token = _createToken(name, symbol, salt);
tokenCreator[address(token)] = msg.sender;
uint256 refund = msg.value - mintFee;
_transferETH(vault, mintFee);
if (refund > 0) {
_transferETH(msg.sender, refund);
}
return address(token);
}
function _createToken(string memory name, string memory symbol, uint256 salt) internal returns (LaunchTokenV1) {
LaunchTokenV1 token = new LaunchTokenV1{salt: bytes32(salt)}(name, symbol, TOKEN_SUPPLY, address(this));
address tokenAddr = address(token);
token.setMode(2);
tokenAddress[tokenCount] = tokenAddr;
tokenCount++;
virtualPools[tokenAddr] = VirtualPool({
ethReserve: virtualOKReserveAmount, tokenReserve: TOKEN_SUPPLY + virtualTokenReserveAmount, launched: false
});
emit TokenCreate(tokenAddr, tokenCount - 1, msg.sender);
return token;
}
function getBytecode(string memory name, string memory symbol, address initialHolder)
public
pure
returns (bytes memory)
{
bytes memory bytecode = type(LaunchTokenV1).creationCode;
return abi.encodePacked(bytecode, abi.encode(name, symbol, TOKEN_SUPPLY, initialHolder));
}
function getAddress(uint256 salt, string memory name, string memory symbol) public view returns (address) {
bytes32 hash = keccak256(
abi.encodePacked(bytes1(0xff), address(this), salt, keccak256(getBytecode(name, symbol, address(this))))
);
return address(uint160(uint256(hash)));
}
// ---------- core: purchase ----------
function purchaseToken(address token, uint256 amountOutMin) external payable nonReentrant whenNotPaused {
require(getTokenState(token) == 1, "RobinLaunchpad: not on sale");
require(msg.value >= minTxFee, "RobinLaunchpad: insufficient tx value");
_purchase(token, msg.value, amountOutMin, msg.sender);
}
function _purchase(address token, uint256 ethIn, uint256 amountOutMin, address buyer) internal {
uint256 fee = _calculateFee(ethIn, purchaseFee);
uint256 ethCost = ethIn - fee;
uint256 distETH = 0;
uint256 amountOut = getTokenAmountByPurchase(token, ethCost);
VirtualPool storage pool = virtualPools[token];
bool reachedThreshold = pool.ethReserve + ethCost >= launchOKReserve;
if (reachedThreshold) {
distETH = pool.ethReserve + ethCost - launchOKReserve;
amountOut = getTokenAmountByPurchase(token, ethCost - distETH);
pool.ethReserve = launchOKReserve;
emit LaunchPending(token);
} else {
pool.ethReserve += ethCost;
require(amountOut >= amountOutMin, "RobinLaunchpad: insufficient output");
}
pool.tokenReserve -= amountOut;
IERC20(token).safeTransfer(buyer, amountOut);
if (distETH != 0) {
_transferETH(buyer, distETH);
}
_transferETH(vault, fee);
emit TokenPurchased(token, buyer, ethCost - distETH, fee, amountOut, pool.tokenReserve);
if (reachedThreshold) {
_launchToDEX(token);
}
}
// ---------- core: sale ----------
function saleToken(address token, uint256 tokenAmount, uint256 amountOutMin) external nonReentrant whenNotPaused {
require(getTokenState(token) == 1, "RobinLaunchpad: not on sale");
require(tokenAmount > 0, "RobinLaunchpad: zero amount");
IERC20(token).safeTransferFrom(msg.sender, address(this), tokenAmount);
VirtualPool storage pool = virtualPools[token];
uint256 ethOut = getETHAmountBySale(token, tokenAmount);
uint256 tokenUnused;
uint256 tokenUsed = tokenAmount;
if (pool.ethReserve - ethOut < virtualOKReserveAmount) {
ethOut = pool.ethReserve - virtualOKReserveAmount;
tokenUsed = getExactETHAmountForSale(token, ethOut);
tokenUnused = tokenAmount - tokenUsed;
}
require(ethOut >= minTxFee, "RobinLaunchpad: sale amount too low");
uint256 fee = _calculateFee(ethOut, saleFee);
uint256 ethGet = ethOut - fee;
require(ethGet >= amountOutMin, "RobinLaunchpad: insufficient output");
_transferETH(vault, fee);
_transferETH(msg.sender, ethGet);
if (tokenUnused > 0) {
IERC20(token).safeTransfer(msg.sender, tokenUnused);
}
pool.ethReserve -= ethOut;
pool.tokenReserve += tokenUsed;
emit TokenSold(token, msg.sender, ethGet, fee, tokenUsed);
}
// ---------- core: launch ----------
function _launchToDEX(address token) internal {
VirtualPool storage pool = virtualPools[token];
// launch fee to vault
_transferETH(vault, launchFee);
// ETH available for liquidity
uint256 ethForLiquidity = pool.ethReserve - launchFee - virtualOKReserveAmount;
uint256 tokenForLiquidity = LAUNCH_THRESHOLD;
// approve token to position manager
IERC20(token).safeApprove(positionManager, tokenForLiquidity);
// ensure pool exists and is initialized
// token0/token1 ordering matters for sqrtPriceX96
uint256 desiredAmount0 = token < weth9 ? tokenForLiquidity : ethForLiquidity;
uint256 desiredAmount1 = token < weth9 ? ethForLiquidity : tokenForLiquidity;
console2.log("ethForLiquidity", ethForLiquidity);
console2.log("tokenForLiquidity", tokenForLiquidity);
console2.log("desiredAmount0", desiredAmount0);
console2.log("desiredAmount1", desiredAmount1);
uint160 sqrtPriceX96 = _calculateSqrtPriceX96(desiredAmount0, desiredAmount1);
console2.log("sqrtPriceX96", sqrtPriceX96);
INonfungiblePositionManager(positionManager)
.createAndInitializePoolIfNecessary(
token < weth9 ? token : weth9, token < weth9 ? weth9 : token, POOL_FEE, sqrtPriceX96
);
console2.log("pool initialized");
// mint V3 position
INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({
token0: token < weth9 ? token : weth9,
token1: token < weth9 ? weth9 : token,
fee: POOL_FEE,
tickLower: TICK_LOWER,
tickUpper: TICK_UPPER,
amount0Desired: desiredAmount0,
amount1Desired: desiredAmount1,
amount0Min: 0,
amount1Min: 0,
recipient: lpLocker,
deadline: block.timestamp + 600
});
(uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1) =
INonfungiblePositionManager(positionManager).mint{value: ethForLiquidity}(params);
console2.log("tokenId", tokenId);
console2.log("liquidity", uint256(liquidity));
console2.log("amount0", amount0);
console2.log("amount1", amount1);
// refund unused token if any (position manager keeps any unused ETH dust)
uint256 unusedToken = tokenForLiquidity - (token < weth9 ? amount0 : amount1);
if (unusedToken > 0) {
IERC20(token).safeTransfer(vault, unusedToken);
}
pool.ethReserve = 0;
pool.tokenReserve = 0;
pool.launched = true;
LaunchTokenV1(token).setMode(0);
LaunchTokenV1(token).renounceOwnership();
emit TokenLaunched(token);
// avoid compiler warning
tokenId;
}
function _calculateSqrtPriceX96(uint256 amount0, uint256 amount1) internal pure returns (uint160) {
// sqrtPriceX96 = sqrt(amount1/amount0) * 2^96
// To avoid overflow: compute sqrt((amount1 << 96) / amount0), then shift left by 48.
require(amount0 > 0 && amount1 > 0, "RobinLaunchpad: zero amounts");
uint256 ratio = (amount1 << 96) / amount0;
uint256 sqrtRatio = _sqrt(ratio);
uint256 sqrtPriceX96 = sqrtRatio << 48;
require(sqrtPriceX96 <= type(uint160).max, "RobinLaunchpad: sqrt price overflow");
// forge-lint: disable-next-line(unsafe-typecast)
return uint160(sqrtPriceX96);
}
function _sqrt(uint256 x) internal pure returns (uint256 y) {
uint256 z = (x + 1) / 2;
y = x;
while (z < y) {
y = z;
z = (x / z + z) / 2;
}
}
// ---------- view functions ----------
function getTokenState(address token) public view returns (uint256) {
VirtualPool memory pool = virtualPools[token];
// 0 -> never created; 1 -> on sale; 2 -> pending; 3 -> launched
if (pool.launched) {
return 3;
} else if (pool.ethReserve >= launchOKReserve) {
return 2;
} else if (pool.ethReserve >= virtualOKReserveAmount) {
return 1;
} else {
return 0;
}
}
function getPrice(address token) external view returns (uint256) {
VirtualPool memory pool = virtualPools[token];
if (pool.launched) {
return 0;
} else if (pool.tokenReserve != TOKEN_SUPPLY + virtualTokenReserveAmount && pool.tokenReserve > 0) {
return (pool.tokenReserve * 1e6) / pool.ethReserve;
} else {
return ((TOKEN_SUPPLY + virtualTokenReserveAmount) * 1e6) / virtualOKReserveAmount;
}
}
function getTokenAmountByPurchase(address token, uint256 ethAmount) public view returns (uint256) {
VirtualPool memory pool = virtualPools[token];
return (ethAmount * pool.tokenReserve) / (pool.ethReserve + ethAmount);
}
function getExactTokenAmountForPurchase(address token, uint256 tokenAmount) public view returns (uint256) {
VirtualPool memory pool = virtualPools[token];
return (tokenAmount * pool.ethReserve) / (pool.tokenReserve - tokenAmount) + 1;
}
function getETHAmountBySale(address token, uint256 tokenAmount) public view returns (uint256) {
VirtualPool memory pool = virtualPools[token];
return (tokenAmount * pool.ethReserve) / (pool.tokenReserve + tokenAmount);
}
function getExactETHAmountForSale(address token, uint256 ethAmount) public view returns (uint256) {
VirtualPool memory pool = virtualPools[token];
return (ethAmount * pool.tokenReserve) / (pool.ethReserve - ethAmount) + 1;
}
function getTokenAmountByPurchaseWithFee(address token, uint256 ethAmount)
external
view
returns (uint256 tokenAmount, uint256 fee)
{
if (ethAmount <= minTxFee) {
return (0, 0);
}
fee = _calculateFee(ethAmount, purchaseFee);
uint256 ethUsed = ethAmount - fee;
VirtualPool memory pool = virtualPools[token];
uint256 ethReserve = pool.ethReserve;
uint256 tokenReserve = pool.tokenReserve;
if (tokenReserve == 0) {
ethReserve = virtualOKReserveAmount;
tokenReserve = TOKEN_SUPPLY + virtualTokenReserveAmount;
} else if (ethReserve + ethUsed > launchOKReserve) {
// Mirror _purchase: ETH beyond the launch target is refunded, not spent.
ethUsed = launchOKReserve - ethReserve;
}
tokenAmount = (ethUsed * tokenReserve) / (ethReserve + ethUsed);
}
function getExactTokenAmountForPurchaseWithFee(address token, uint256 tokenAmount)
external
view
returns (uint256 ethAmount, uint256 fee)
{
VirtualPool memory pool = virtualPools[token];
ethAmount = (tokenAmount * pool.ethReserve) / (pool.tokenReserve - tokenAmount) + 1;
fee = (ethAmount * purchaseFee) / (BASE_FEE - purchaseFee) + 1;
if (fee < minTxFee) {
fee = minTxFee;
}
ethAmount += fee;
}
function getETHAmountBySaleWithFee(address token, uint256 tokenAmount)
external
view
returns (uint256 ethAmount, uint256 fee)
{
VirtualPool memory pool = virtualPools[token];
ethAmount = (tokenAmount * pool.ethReserve) / (pool.tokenReserve + tokenAmount);
fee = _calculateFee(ethAmount, saleFee);
require(ethAmount >= fee, "RobinLaunchpad: insufficient for fee");
ethAmount -= fee;
}
function getExactETHAmountForSaleWithFee(address token, uint256 ethAmount)
external
view
returns (uint256 tokenAmount, uint256 fee)
{
fee = (ethAmount * saleFee) / (BASE_FEE - saleFee) + 1;
if (fee < minTxFee) {
fee = minTxFee;
}
ethAmount += fee;
VirtualPool memory pool = virtualPools[token];
tokenAmount = (ethAmount * pool.tokenReserve) / (pool.ethReserve - ethAmount) + 1;
}
// ---------- admin ----------
function setOperator(address newOperator) external onlyOwner {
emit OperatorChanged(operator, newOperator);
operator = newOperator;
}
/// @dev Deprecated: launcher role is no longer used. Function kept for storage/interface compatibility.
function setLauncher(address newLauncher) external onlyOwner {
emit LauncherChanged(launcher, newLauncher);
launcher = newLauncher;
}
function setPurchaseFee(uint256 newFee) external onlyOperator {
require(newFee < BASE_FEE, "RobinLaunchpad: fee too high");
emit PurchaseFeeSet(purchaseFee, newFee);
purchaseFee = newFee;
}
function setSaleFee(uint256 newFee) external onlyOperator {
require(newFee < BASE_FEE, "RobinLaunchpad: fee too high");
emit SaleFeeSet(saleFee, newFee);
saleFee = newFee;
}
function setMintFee(uint256 newFee) external onlyOperator {
emit MintFeeSet(mintFee, newFee);
mintFee = newFee;
}
function setMinTxFee(uint256 newFee) external onlyOperator {
emit MinTxFeeSet(minTxFee, newFee);
minTxFee = newFee;
}
function setVault(address newVault) external onlyOwner {
require(newVault != address(0), "RobinLaunchpad: zero vault");
vault = newVault;
}
function setPositionManager(address newPositionManager) external onlyOwner {
require(newPositionManager != address(0), "RobinLaunchpad: zero position manager");
positionManager = newPositionManager;
}
function setLPLocker(address newLPLocker) external onlyOwner {
require(newLPLocker != address(0), "RobinLaunchpad: zero lp locker");
lpLocker = newLPLocker;
}
function pause() external onlyOperator {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
// ---------- internals ----------
function _calculateFee(uint256 amount, uint256 feeRate) internal view returns (uint256) {
uint256 fee = (amount * feeRate) / BASE_FEE;
if (fee < minTxFee) {
fee = minTxFee;
}
return fee;
}
function _transferETH(address to, uint256 amount) internal {
(bool success,) = payable(to).call{value: amount}("");
require(success, "RobinLaunchpad: ETH transfer failed");
}
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [],
"stateMutability": "nonpayable"
},
{
"name": "AdminChanged",
"type": "event",
"inputs": [
{
"name": "previousAdmin",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "newAdmin",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "BeaconUpgraded",
"type": "event",
"inputs": [
{
"name": "beacon",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Initialized",
"type": "event",
"inputs": [
{
"name": "version",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "LaunchPending",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "LauncherChanged",
"type": "event",
"inputs": [
{
"name": "oldLauncher",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newLauncher",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MinTxFeeSet",
"type": "event",
"inputs": [
{
"name": "oldFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MintFeeSet",
"type": "event",
"inputs": [
{
"name": "oldFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OperatorChanged",
"type": "event",
"inputs": [
{
"name": "oldOperator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOperator",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Paused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PurchaseFeeSet",
"type": "event",
"inputs": [
{
"name": "oldFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "SaleFeeSet",
"type": "event",
"inputs": [
{
"name": "oldFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TokenCreate",
"type": "event",
"inputs": [
{
"name": "tokenAddress",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenIndex",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenLaunched",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenPurchased",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenReserve",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TokenSold",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "seller",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Unpaused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Upgraded",
"type": "event",
"inputs": [
{
"name": "implementation",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "BASE_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "LAUNCH_THRESHOLD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "POOL_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_LOWER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_UPPER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TOKEN_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_SALE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "addToWhitelist",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "createAndInitPurchase",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "salt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "createToken",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "salt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "getAddress",
"type": "function",
"inputs": [
{
"name": "salt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getBytecode",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "initialHolder",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "pure"
},
{
"name": "getETHAmountBySale",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getETHAmountBySaleWithFee",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getExactETHAmountForSale",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getExactETHAmountForSaleWithFee",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getExactTokenAmountForPurchase",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getExactTokenAmountForPurchaseWithFee",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getPrice",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getTokenAmountByPurchase",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getTokenAmountByPurchaseWithFee",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getTokenState",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "initialize",
"type": "function",
"inputs": [
{
"name": "vault_",
"type": "address",
"internalType": "address"
},
{
"name": "launcher_",
"type": "address",
"internalType": "address"
},
{
"name": "operator_",
"type": "address",
"internalType": "address"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "address"
},
{
"name": "weth9_",
"type": "address",
"internalType": "address"
},
{
"name": "lpLocker_",
"type": "address",
"internalType": "address"
},
{
"name": "purchaseFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "saleFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mintFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minTxFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "launchFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "virtualOKReserveAmount_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "launchOKReserve_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "virtualTokenReserveAmount_",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "launchFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "launchOKReserve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "launcher",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "lpLocker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "minTxFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "mintFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "operator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "proxiableUUID",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "purchaseFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "purchaseToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amountOutMin",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "removeFromWhitelist",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "saleFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "saleToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amountOutMin",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLPLocker",
"type": "function",
"inputs": [
{
"name": "newLPLocker",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLauncher",
"type": "function",
"inputs": [
{
"name": "newLauncher",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinTxFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMintFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOperator",
"type": "function",
"inputs": [
{
"name": "newOperator",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPositionManager",
"type": "function",
"inputs": [
{
"name": "newPositionManager",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPurchaseFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSaleFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setVault",
"type": "function",
"inputs": [
{
"name": "newVault",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setWhitelistEnabled",
"type": "function",
"inputs": [
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tokenAddress",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "tokenCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tokenCreator",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unpause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "upgradeTo",
"type": "function",
"inputs": [
{
"name": "newImplementation",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "upgradeToAndCall",
"type": "function",
"inputs": [
{
"name": "newImplementation",
"type": "address",
"internalType": "address"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "vault",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "virtualOKReserveAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "virtualPools",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "ethReserve",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tokenReserve",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "launched",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "virtualTokenReserveAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "weth9",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "whitelist",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "whitelistEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60a0806040523460d657306080525f549060ff8260081c166084575060ff80821610604b575b60405161573790816100db8239608051818181611fe10152818161212b01526125560152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a15f6025565b62461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fdfe608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816303fc20131461343d57508063052d9e7e146134035780630b3eb970146133e05780630b4b8aa5146133625780630bce38611461332f5780630f9baddc1461331157806313966db5146132f357806314b5e981146132d557806316eebd1e146132ac578063178021e31461328e5780631cc2c911146129a35780631d32c2da1461297d5780631e105689146129555780631e228192146128fe57806320160b071461289957806323774af214612857578063239f3af7146128395780633659cfe6146125375780633d18651e146106275780633ee09daa146124ef5780633f4ba83a1461245a5780633f9d7c9e1461243b57806341976e091461241757806347377d92146123f85780634f1ef286146120df57806350879c1c146120b557806351fb012d1461209157806352d1902d14611fce578063570ca73514611fa45780635760f2e314611f565780635b06053014611ea15780635c975abb14611e7e5780636402cdc314611e0c5780636817031b14611dbe5780636889793614611cc8578063715018a614611c61578063791b98bc14611c3757806379ba509714611baf5780637c06fc7714611b905780638456cb5914611b275780638ab1d68114611ae55780638da5cb5b14611abc5780638e109af61461178e5780638fc0ba03146116cd578063910cffe0146116a75780639b19251a146116675780639bcd221f146115b75780639e6b26ba146115835780639f181b5e14611564578063a2397a021461153c578063a800cb8514610a33578063b152f6cf14610a0d578063b3ab15fb146109a1578063b524f87b14610953578063bdcafc55146108e1578063cf3cf573146108c2578063d19aa2b914610674578063d3b23c4314610644578063dd1b9c4a14610627578063e30c3978146105fe578063e43252d7146105b9578063ec1f743b1461048f578063eddd0d9c1461042a578063f2fde38b146103bc578063f4c094c814610350578063fbfa77cf146103265763fe29b4e80361000f5734610323578060031936011261032357602061016d54604051908152f35b80fd5b5034610323578060031936011261032357610164546040516001600160a01b039091168152602090f35b50346103235760203660031901126103235761036a613461565b610372613d45565b610166546001600160a01b0391821691829082167f349b3ca858f1d049aa7b4e826494f79354dbe5f1125ec5442e2d309d21646ec28580a36001600160a01b031916176101665580f35b5034610323576020366003190112610323576103d6613461565b6103de613d45565b60c980546001600160a01b0319166001600160a01b039283169081179091556097549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103235760203660031901126103235760043561045560018060a01b03610165541633146138c0565b7f387269377ae17304805d5f88cea4252e5ca47346783c279aeb9e8627335a49ac604061016c548151908152836020820152a161016c5580f35b50346103235760403660031901126103235761050d6104ac613461565b6001600160a01b03168252610170602052604080832090516105079060243590610500906104d98161348d565b845490818152604060ff600260018901549860208501998a52015416151591015282613721565b9251613707565b90613734565b600181018091116105a55761016b546105268183613721565b9061271003906127108211610591579061053f91613734565b906001820180921161057d5761016d5460409350808310610573575b508161056691613714565b9082519182526020820152f35b915061056661055b565b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b82526011600452602482fd5b5034610323576020366003190112610323576105d3613461565b6105db613d45565b6001600160a01b0316815261017160205260408120805460ff1916600117905580f35b503461032357806003193601126103235760c9546040516001600160a01b039091168152602090f35b503461032357806003193601126103235760206040516127108152f35b503461032357604036600319011261032357602061066c610663613461565b60243590613d0a565b604051908152f35b50346103235760603660031901126103235761068e613461565b6024359061069a613dbf565b6106a2613e15565b6106b660016106b0836135e3565b14613847565b811561087d576040516323b872dd60e01b6020820152336024820152306044820152606480820184905281526001600160a01b0382169190610703906106fd6084826134da565b836141f7565b8184526101706020526040842061071a8483613c86565b9085948093825461072b8582613707565b906101605480921061084e575b5050505061016d5482106107fd5760019061079f61075961016a5485613d9d565b936107648582613707565b976107736044358a1015613cb2565b61078786868060a01b036101645416613ff7565b6107918933613ff7565b806107ec575b508254613707565b8155016107ad838254613714565b9055604051938452602084015260408301527f9387a595ac4be9038bbb9751abad8baa3dcf219dd9e19abb81552bd521fe354660603393a36001805580f35b6107f790338961411e565b5f610797565b60405162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a2073616c6520616d6f756e7420746f6f206044820152626c6f7760e81b6064820152608490fd5b61087394985061086c939650610865929550613707565b8093613d0a565b8093613707565b935f808080610738565b60405162461bcd60e51b815260206004820152601b60248201527f526f62696e4c61756e63687061643a207a65726f20616d6f756e7400000000006044820152606490fd5b5034610323578060031936011261032357602061015f54604051908152f35b50346103235760203660031901126103235760043561090c60018060a01b03610165541633146138c0565b6109196127108210613ba2565b7f3063d3516a6a2d04f3fcbbb8096b055b0976989088fe108ad8081c526a594abd604061016a548151908152836020820152a161016a5580f35b50346103235760203660031901126103235761096d613461565b610975613d45565b6001600160a01b0316610989811515613c3a565b6001600160601b0360a01b6101695416176101695580f35b5034610323576020366003190112610323576109bb613461565b6109c3613d45565b610165546001600160a01b0391821691829082167fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c8580a36001600160a01b031916176101655580f35b50346103235780600319360112610323576020604051676765c793fa10079d601b1b8152f35b50610a89610a4036613590565b90610a4c939293613dbf565b610a54613e15565b60ff6101725416158015611525575b610a6c90613afc565b610a7b61016c54341015613b48565b6001600160a01b0393613e59565b1680825261016f6020526040822080546001600160a01b031916331790556101645461016c54610ac1916001600160a01b0316613ff7565b610ace61016c5434613707565b80610ae3575b60208260018055604051908152f35b610afa610af361016b5483613d9d565b8092613707565b8391610b068285613893565b848652610170602052604086209081549484610b228188613714565b6101615411801597906115045750610bcc9250610b4191508354613714565b916001610b52610161548095613707565b91610b66610b608489613707565b8a613893565b948155887fff274cd97aba8af276149429fbc7ea387e14da22dcd51779c691af908f4feb648b80a25b0194610b9c848754613707565b8655610ba984338a61411e565b816114f5575b61016454610bc79086906001600160a01b0316613ff7565b613707565b925491604051938452602084015260408301526060820152827f63abb62535c21a5d221cf9c15994097b8880cc986d82faf80f57382b998dbae560803393a3610c16575b81610ad4565b808252610170602052604082206101645461015f54610c3d916001600160a01b0316613ff7565b610c59610c4f825461015f5490613707565b6101605490613707565b9060018060a01b036101675416604051636eb1769f60e11b8152306004820152816024820152602081604481885afa9081156114ea5786916114b4575b506114505760405163095ea7b360e01b60208201526001600160a01b0390911660248201526714adf4b7320334b9601d1b6044820152610ced90610ce781606481015b03601f1981018352826134da565b846141f7565b610168546001600160a01b031691828410908115611449576714adf4b7320334b9601d1b915b80156114375781905b604095610d50848851610d2f8a826134da565b600f81526e657468466f724c697175696469747960881b602082015261433d565b610d828751610d5f89826134da565b6011815270746f6b656e466f724c697175696469747960781b60208201526142da565b610db2858851610d928a826134da565b600e81526d064657369726564416d6f756e74360941b602082015261433d565b610de2838851610dc28a826134da565b600e81526d64657369726564416d6f756e743160901b602082015261433d565b8415158061142e575b156113ea57610dfd858460601b613734565b600181018082116113005760011c815b8282106113cb57505060301b6001600160a01b03811161137b5790608460209260018060a01b031693610e63858b51610e468d826134da565b600c81526b39b8b93a283934b1b2ac1c9b60a11b8782015261433d565b610167546001600160a01b0316928c908215611374578c925b1561136c57935b8b516309f56ab160e11b81526001600160a01b039384166004820152929094166024830152612710604483015260648201959095529384928391905af1801561136257611323575b505f80610cd9610f208851610ee08a826134da565b601081526f1c1bdbdb081a5b9a5d1a585b1a5e995960821b6020820152895192839163104c13eb60e21b602084015260206024840152604483019061356c565b6020815191016a636f6e736f6c652e6c6f675afa50610168546001600160a01b03168087109190821561131c5787925b1561131457935b60018060a01b0361016954169061025842019283421161130057889392918b91855196610f83886134bd565b6001600160a01b03908116885298891660208801908152612710878901908152620d899f1960608a01908152620d89a060808b0190815260a08b0195865260c08b0194855260e08b018781526101008c019788526101208c019889526101408c01998a52610167549a51634418b22b60e11b81529b518e1660048d015293518d1660248c0152915162ffffff1660448b015251600290810b60648b01529051900b6084890152915160a48801525160c48701525160e486015251610104850152518516610124840152516101448301529092839116815a9361016492608095f180156112f65785869087938893611290575b50906110a36110d592875161108a89826134da565b60078152661d1bdad95b925960ca1b602082015261433d565b6001600160801b038651916110b888846134da565b60098352686c697175696469747960b81b6020840152169061433d565b6110fe8285516110e587826134da565b60078152660616d6f756e74360cc1b602082015261433d565b61112781855161110e87826134da565b6007815266616d6f756e743160c81b602082015261433d565b610168546001600160a01b031685101561128957505b806714adf4b7320334b9601d1b03906714adf4b7320334b9601d1b82116112755790600292916714adf4b7320334b9601d1b03611257575b5084815584600182015501600160ff19825416179055813b15611234578281516335cb74ed60e21b8152816004820152818160248183885af1801561124d57611238575b5050813b156112345780516338a80c5360e11b815290838260048183875af190811561122b5750611212575b50807f2ab676eef3f76f1bd4e765a352c6cd81e62702f7ad3d363291c8b60582a4525083602094a2610c10565b61121d8380926134da565b611227575f6111e5565b5080fd5b513d85823e3d90fd5b8280fd5b81611242916134da565b61123457825f6111b9565b83513d84823e3d90fd5b6101645461126f91906001600160a01b03168661411e565b5f611175565b634e487b7160e01b86526011600452602486fd5b905061113d565b93505050506080813d6080116112ee575b816112ae608093836134da565b810103126112ea578051906020810151906001600160801b03821682036112e6578481015160609091015190929091906110a3611075565b8680fd5b8480fd5b3d91506112a1565b83513d87823e3d90fd5b634e487b7160e01b8b52601160045260248bfd5b508693610f57565b8092610f50565b6020813d60201161135a575b8161133c602093836134da565b8101031261135657516001600160a01b0381168114610ecb575b8780fd5b3d915061132f565b86513d8a823e3d90fd5b508b93610e83565b8092610e7c565b875162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a2073717274207072696365206f766572666044820152626c6f7760e81b6064820152608490fd5b9091506113e1826113dc8184613734565b613714565b60011c90610e0d565b865162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a207a65726f20616d6f756e7473000000006044820152606490fd5b50821515610deb565b6714adf4b7320334b9601d1b90610d1c565b8091610d13565b60405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608490fd5b90506020813d6020116114e2575b816114cf602093836134da565b810103126114de57515f610c96565b8580fd5b3d91506114c2565b6040513d88823e3d90fd5b6114ff8233613ff7565b610baf565b93611515600192610bcc9596613714565b815561152082613cb2565b610b8f565b50338552610171602052604085205460ff16610a63565b503461032357604036600319011261032357602061066c61155b613461565b60243590613c86565b5034610323578060031936011261032357602061016354604051908152f35b503461032357602036600319011261032357602090600435815261016e8252604060018060a01b0391205416604051908152f35b50346103235760603660031901126103235760243567ffffffffffffffff8111611227576115e990369060040161354e565b906044359067ffffffffffffffff821161032357602061161784611610366004870161354e565b309161369b565b818151910120604051908282019060ff60f81b82523060601b602184015260043560358401526055830152605582526116516075836134da565b905190206040516001600160a01b039091168152f35b50346103235760203660031901126103235760209060ff906040906001600160a01b03611692613461565b16815261017184522054166040519015158152f35b503461032357806003193601126103235760206040516aa56fa5b99019a5c80000008152f35b50346103235760403660031901126103235761171d9061050760406116f0613461565b926024359360018060a01b0316815261017060205220916117166040516104d98161348d565b9251613714565b61172a61016a5482613d9d565b80821061173d5761056681604093613707565b60405162461bcd60e51b8152602060048201526024808201527f526f62696e4c61756e63687061643a20696e73756666696369656e7420666f726044820152632066656560e01b6064820152608490fd5b5034610323576101c0366003190112610323576117a9613461565b6024356001600160a01b03811690819003611234576117c6613477565b6064356001600160a01b038116908190036112ea576084356001600160a01b03811692908390036114de5760a4356001600160a01b03811694908590036112e65786549560ff8760081c161596878098611aaf575b8015611a98575b15611a3c5760ff198116600117895587611a2b575b506001600160a01b031661184c811515613bee565b611857841515613aa2565b84156119e657611868861515613c3a565b6118b360ff895460081c1661187c816140be565b611885816140be565b60018055611892816140be565b61189b816140be565b60ff19606554166065556118ae816140be565b6140be565b6118bc3361406b565b6118cc60ff895460081c166140be565b6001600160601b0360a01b610164541617610164556001600160601b0360a01b6101665416176101665560018060a01b03166001600160601b0360a01b610165541617610165556001600160601b0360a01b610167541617610167556001600160601b0360a01b610168541617610168556001600160601b0360a01b6101695416176101695560c43561016b5560e43561016a556101043561016c556101243561016d556101443561015f55610164356101605561018435610161556101a4356101625533825261017160205260408220600160ff198254161790556119af5780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b60405162461bcd60e51b815260206004820152601960248201527f526f62696e4c61756e63687061643a207a65726f2077657468000000000000006044820152606490fd5b61ffff19166101011788555f611837565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156118225750600160ff821614611822565b50600160ff82161061181b565b50346103235780600319360112610323576097546040516001600160a01b039091168152602090f35b503461032357602036600319011261032357611aff613461565b611b07613d45565b6001600160a01b0316815261017160205260408120805460ff1916905580f35b5034610323578060031936011261032357611b4e60018060a01b03610165541633146138c0565b611b56613e15565b600160ff1960655416176065557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b5034610323578060031936011261032357602061016254604051908152f35b503461032357806003193601126103235760c954336001600160a01b0390911603611be057611bdd3361406b565b80f35b60405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608490fd5b5034610323578060031936011261032357610167546040516001600160a01b039091168152602090f35b5034610323578060031936011261032357611c7a613d45565b60c980546001600160a01b031990811690915560978054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461032357604036600319011261032357611ce2613461565b6024359061016a54611cf48184613721565b9061271003906127108211611daa5790611d0d91613734565b90600182018092116105915761016d54808310611da0575b50611d3482611d849394613714565b6001600160a01b03909116845261017060205260408085209051916105079161050090611d608561348d565b8054855260ff60026001830154928360208901520154161515604086015282613721565b906001820180921161057d576040809350519182526020820152f35b9150611d34611d25565b634e487b7160e01b85526011600452602485fd5b503461032357602036600319011261032357611dd8613461565b611de0613d45565b6001600160a01b0316611df4811515613bee565b6001600160601b0360a01b6101645416176101645580f35b503461032357602036600319011261032357600435611e3760018060a01b03610165541633146138c0565b611e446127108210613ba2565b7f525ad74c8a8eb66a2372d62022c6d2813136ef0f41574506841342146cf694db604061016b548151908152836020820152a161016b5580f35b5034610323578060031936011261032357602060ff606554166040519015158152f35b6020826040611edd611eb236613590565b90611ebe939293613dbf565b611ec6613e15565b60ff6101725416158015611f4157610a6c90613afc565b1680835261016f8452912080546001600160a01b0319163317905561016c54611f1e611f098234613707565b610164549092906001600160a01b0316613ff7565b80611f31575b5060018055604051908152f35b611f3b9033613ff7565b82611f24565b5033865261017187528486205460ff16610a63565b503461032357602036600319011261032357611f70613461565b611f78613d45565b6001600160a01b0316611f8c811515613aa2565b6001600160601b0360a01b6101675416176101675580f35b5034610323578060031936011261032357610165546040516001600160a01b039091168152602090f35b50346103235780600319360112610323577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036120265760206040515f805160206156e28339815191528152f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b5034610323578060031936011261032357602060ff61017254166040519015158152f35b5034610323578060031936011261032357610168546040516001600160a01b039091168152602090f35b506040366003190112610323576120f4613461565b60243567ffffffffffffffff8111611234573660238201121561123457612125903690602481600401359101613518565b9061217d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661215f3082141561390c565b5f805160206156e2833981519152546001600160a01b03161461396d565b612185613d45565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156121b957611bdd9150614160565b6040516352d1902d60e01b81526001600160a01b03821690602081600481855afa8591816123c4575b506122435760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b5f805160206156e28339815191520361236d5761225f82614160565b604051907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2825115801590612365575b61229d575b50505080f35b813b15612314575082828192602061230b95519201905af46122bd613fc8565b604051916122cc6060846134da565b602783527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c6020840152660819985a5b195960ca1b6040840152614380565b505f8080612297565b62461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b506001612292565b60405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091506020813d6020116123f0575b816123e0602093836134da565b810103126114de5751905f6121e2565b3d91506123d3565b50346103235780600319360112610323576020604051620d899f198152f35b503461032357602036600319011261032357602061066c612436613461565b6139ce565b5034610323578060031936011261032357602061016054604051908152f35b5034610323578060031936011261032357612473613d45565b60655460ff8116156124b35760ff19166065557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b50346103235760403660031901126103235761250c6104ac613461565b906001820180921161252357602082604051908152f35b634e487b7160e01b81526011600452602490fd5b503461032357602036600319011261032357612551613461565b61258a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661215f3082141561390c565b612592613d45565b60206040516125a182826134da565b83815281810190601f1983013683377f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156125e657505050611bdd90614160565b6040516352d1902d60e01b8152939492936001600160a01b038616908581600481855afa85918161280a575b506126735760405162461bcd60e51b815260048101879052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b9394937fc9f76b5ec45e5cdef99837d7b6d2467235c1df8933c8ca56df5c35afa2c7d444016127b3576126a586614160565b604051907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8680a28151158015906127ac575b6126e6575b50505050905080f35b853b1561275b575092809481926127509551915af4612703613fc8565b907f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c604051936127346060866134da565b60278552840152660819985a5b195960ca1b6040840152614380565b50805f8080806126dd565b62461bcd60e51b815260048101849052602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b50846126d8565b60405162461bcd60e51b815260048101859052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508681813d8311612832575b61282281836134da565b810103126114de5751905f612612565b503d612818565b50346103235780600319360112610323576020604051620d89a08152f35b5034610323576020366003190112610323576020906001600160a01b0361287c613461565b16815261016f8252604060018060a01b0391205416604051908152f35b5034610323576020366003190112610323576004356128c460018060a01b03610165541633146138c0565b7f091f43688ad4f42d7f02fb81c7e28b693ca4d5d825c27572437bc308cc46aba2604061016d548151908152836020820152a161016d5580f35b5034610323576020366003190112610323576060906040906001600160a01b03612926613461565b1681526101706020522080549060ff600260018301549201541690604051928352602083015215156040820152f35b503461032357604036600319011261032357602061066c612974613461565b60243590613893565b503461032357806003193601126103235760206040516714adf4b7320334b9601d1b8152f35b506040366003190112612ffc576129b8613461565b6129c0613dbf565b6129c8613e15565b6129d660016106b0836135e3565b61016d54341061323b576129ed61016b5434613d9d565b906129f88234613707565b5f90612a048184613893565b9360018060a01b03841694855f5261017060205260405f209081549484612a2b8188613714565b6101615411801597906132155750612aac9250612a4a91508354613714565b916001612a5b610161548095613707565b91612a69610b608489613707565b948155897fff274cd97aba8af276149429fbc7ea387e14da22dcd51779c691af908f4feb645f80a25b0194612a9f848754613707565b8655610ba984338b61411e565b925491604051938452602084015260408301526060820152837f63abb62535c21a5d221cf9c15994097b8880cc986d82faf80f57382b998dbae560803393a3612af8575b826001805580f35b5f828152610170602052604090206101645461015f54612b20916001600160a01b0316613ff7565b612b32610c4f825461015f5490613707565b9160018060a01b036101675416604051636eb1769f60e11b8152306004820152816024820152602081604481895afa90811561320a575f916131d8575b506114505760405163095ea7b360e01b60208201526001600160a01b0390911660248201526714adf4b7320334b9601d1b6044820152612bbc90612bb68160648101610cd9565b856141f7565b610168546001600160a01b0316928385109182156131d2576714adf4b7320334b9601d1b5b83156131c05782935b604096612bfd858951610d2f8b826134da565b612c0c8851610d5f8a826134da565b612c1c838951610d928b826134da565b612c2c868951610dc28b826134da565b821515806131b7575b1561317357612c47838760601b613734565b6001810180821161301e5760011c815b82821061315957505060301b6001600160a01b0381116131095790608460209260018060a01b031693612c91858c610e46815191826134da565b610167546001600160a01b03169281156131025787915b156130f9575f90935b8c516309f56ab160e11b81526001600160a01b039384166004820152929094166024830152612710604483015260648201959095529384928391905af180156130ef576130b1575b505f80610cd9612d4e8951612d0e8b826134da565b601081526f1c1bdbdb081a5b9a5d1a585b1a5e995960821b60208201528a5192839163104c13eb60e21b602084015260206024840152604483019061356c565b6020815191016a636f6e736f6c652e6c6f675afa50610168546001600160a01b03168088109283156130aa5780935b156130a25750935b60018060a01b03610169541661025842019182421161301e578893845195612dac876134bd565b6001600160a01b03908116875297881660208701908152612710868801908152620d899f1960608901908152620d89a060808a0190815260a08a0194855260c08a019586525f60e08b018181526101008c019182526101208c019889526101408c01998a52610167549a51634418b22b60e11b81529b518e1660048d015294518d1660248c0152925162ffffff1660448b01529051600290810b60648b01529051900b6084890152915160a4880152915160c4870152905160e486015251610104850152518516610124840152516101448301529092839116815a9361016492608095f18015613098575f805f935f9361303a575b50906110a3612eb692875161108a89826134da565b612ec68285516110e587826134da565b612ed681855161110e87826134da565b610168546001600160a01b03168510156130325750905b816714adf4b7320334b9601d1b036714adf4b7320334b9601d1b811161301e576002926714adf4b7320334b9601d1b03613000575b505f81555f600182015501600160ff19825416179055813b15612ffc5780516335cb74ed60e21b81525f600482018190528160248183875af18015612ff257612fdd575b508290823b156112275780516338a80c5360e11b815290828260048183885af1908115612fd45750612fbf575b50807f2ab676eef3f76f1bd4e765a352c6cd81e62702f7ad3d363291c8b60582a4525091a25f80612af0565b81612fc9916134da565b61122757815f612f93565b513d84823e3d90fd5b612fea9193505f906134da565b5f915f612f66565b82513d5f823e3d90fd5b5f80fd5b6101645461301891906001600160a01b03168661411e565b5f612f22565b634e487b7160e01b5f52601160045260245ffd5b905090612eed565b93505050506080813d608011613090575b81613058608093836134da565b81010312612ffc578051906020810151906001600160801b0382168203612ffc578481015160609091015190929091906110a3612ea1565b3d915061304b565b83513d5f823e3d90fd5b905093612d85565b8193612d7d565b6020813d6020116130e7575b816130ca602093836134da565b81010312612ffc57516001600160a01b0381168114612cf9575f80fd5b3d91506130bd565b87513d5f823e3d90fd5b505f8793612cb1565b8091612ca8565b885162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a2073717274207072696365206f766572666044820152626c6f7760e81b6064820152608490fd5b90915061316a826113dc8184613734565b60011c90612c57565b875162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a207a65726f20616d6f756e7473000000006044820152606490fd5b50851515612c35565b6714adf4b7320334b9601d1b93612bea565b81612be1565b90506020813d602011613202575b816131f3602093836134da565b81010312612ffc57515f612b6f565b3d91506131e6565b6040513d5f823e3d90fd5b93613226600192612aac9596613714565b8155613236602435861015613cb2565b612a92565b60405162461bcd60e51b815260206004820152602560248201527f526f62696e4c61756e63687061643a20696e73756666696369656e742074782060448201526476616c756560d81b6064820152608490fd5b34612ffc575f366003190112612ffc57602061016a54604051908152f35b34612ffc575f366003190112612ffc57610166546040516001600160a01b039091168152602090f35b34612ffc575f366003190112612ffc57602061016b54604051908152f35b34612ffc575f366003190112612ffc57602061016c54604051908152f35b34612ffc575f366003190112612ffc57602061016154604051908152f35b34612ffc576040366003190112612ffc57604061335661334d613461565b60243590613752565b82519182526020820152f35b34612ffc576060366003190112612ffc5760043567ffffffffffffffff8111612ffc5761339390369060040161354e565b60243567ffffffffffffffff8111612ffc576133dc916133ba6133c892369060040161354e565b6133c2613477565b9161369b565b60405191829160208352602083019061356c565b0390f35b34612ffc576020366003190112612ffc57602061066c6133fe613461565b6135e3565b34612ffc576020366003190112612ffc57600435801515809103612ffc57613429613d45565b60ff80196101725416911617610172555f80f35b34612ffc575f366003190112612ffc57610169546001600160a01b03168152602090f35b600435906001600160a01b0382168203612ffc57565b604435906001600160a01b0382168203612ffc57565b6060810190811067ffffffffffffffff8211176134a957604052565b634e487b7160e01b5f52604160045260245ffd5b610160810190811067ffffffffffffffff8211176134a957604052565b90601f8019910116810190811067ffffffffffffffff8211176134a957604052565b67ffffffffffffffff81116134a957601f01601f191660200190565b929192613524826134fc565b9161353260405193846134da565b829481845281830111612ffc578281602093845f960137010152565b9080601f83011215612ffc5781602061356993359101613518565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b906060600319830112612ffc5760043567ffffffffffffffff8111612ffc57826135bc9160040161354e565b916024359067ffffffffffffffff8211612ffc576135dc9160040161354e565b9060443590565b60018060a01b03165f5261017060205260405f20604080516136048161348d565b60ff600284549485845260018101546020850152015416151591829101525f1461362e5750600390565b61016154811061363e5750600290565b610160541161364c57600190565b5f90565b9161367a9061366c60609396959660808652608086019061356c565b90848203602086015261356c565b676765c793fa10079d601b1b60408401526001600160a01b03909416910152565b906020613569926112b0946136d8604051946136b9858901876134da565b878652848601976144328939610cd96040519384928784019687613650565b6040519586945180918587015e840190838201905f8252519283915e01015f815203601f1981018352826134da565b9190820391821161301e57565b9190820180921161301e57565b8181029291811591840414171561301e57565b811561373e570490565b634e487b7160e01b5f52601260045260245ffd5b61016d5482111561383f5761376d61086c61016b5484613d9d565b9060018060a01b03165f5261017060205260405f206040519061378f8261348d565b805491828152604060ff600260018501549485602086015201541615159101528181155f146137fd575050506101605461016254676765c793fa10079d601b1b0180676765c793fa10079d601b1b1161301e576137fa926137f4610507925b82613721565b92613714565b91565b926105079184613810836137fa97613714565b61016154809111613827575b50506137f4906137ee565b6137f49293509061383791613707565b91905f61381c565b50505f905f90565b1561384e57565b60405162461bcd60e51b815260206004820152601b60248201527f526f62696e4c61756e63687061643a206e6f74206f6e2073616c6500000000006044820152606490fd5b906135699160018060a01b03165f5261017060205261050760405f209161171660405193611d608561348d565b156138c757565b60405162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a206e6f74206f70657261746f72000000006044820152606490fd5b1561391357565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b1561397457565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b60018060a01b03165f5261017060205260405f20604051906139ef8261348d565b8054825260018101546020830181815260029092015460ff161580156040850152613a1b575050505f90565b61016254676765c793fa10079d601b1b019081676765c793fa10079d601b1b1161301e5781141580613a98575b15613a71575051620f4240810290808204620f4240149015171561301e57613569915190613734565b915050620f4240810290808204620f4240149015171561301e576101605461356991613734565b5081511515613a48565b15613aa957565b60405162461bcd60e51b815260206004820152602560248201527f526f62696e4c61756e63687061643a207a65726f20706f736974696f6e206d616044820152643730b3b2b960d91b6064820152608490fd5b15613b0357565b60405162461bcd60e51b815260206004820152601f60248201527f526f62696e4c61756e63687061643a206e6f742077686974656c6973746564006044820152606490fd5b15613b4f57565b60405162461bcd60e51b815260206004820152602560248201527f526f62696e4c61756e63687061643a20696e73756666696369656e74206d696e604482015264742066656560d81b6064820152608490fd5b15613ba957565b60405162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a2066656520746f6f2068696768000000006044820152606490fd5b15613bf557565b60405162461bcd60e51b815260206004820152601a60248201527f526f62696e4c61756e63687061643a207a65726f207661756c740000000000006044820152606490fd5b15613c4157565b60405162461bcd60e51b815260206004820152601e60248201527f526f62696e4c61756e63687061643a207a65726f206c70206c6f636b657200006044820152606490fd5b906135699160018060a01b03165f5261017060205261050760405f20916117166040516104d98161348d565b15613cb957565b60405162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a20696e73756666696369656e74206f75746044820152621c1d5d60ea1b6064820152608490fd5b90613d379160018060a01b03165f5261017060205261050760405f209161050060405193611d608561348d565b6001810180911161301e5790565b6097546001600160a01b03163303613d5957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61271091613daa91613721565b0461016d54808210613dba575090565b905090565b600260015414613dd0576002600155565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b60ff60655416613e2157565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b60405192916112b0908185019067ffffffffffffffff8211868310176134a9578593613e8b9361443286393092613650565b035f925ff590811561320a576001600160a01b038216803b15612ffc576040516335cb74ed60e21b8152600260048201525f8160248183865af1801561320a57613fb3575b506101638054835261016e6020526040832080546001600160a01b0319166001600160a01b038416179055545f19811461057d57600101610163556101605461016254676765c793fa10079d601b1b019081676765c793fa10079d601b1b1161059157604051600291613f428261348d565b81526020810192835260408101928584528486526101706020526040862091518255516001820155019051151560ff8019835416911617905561016354905f19820191821161057d577f1ff0a01c8968e3551472812164f233abb579247de887db8cbb18281c149bee7a339380a490565b613fc09192505f906134da565b5f905f613ed0565b3d15613ff2573d90613fd9826134fc565b91613fe760405193846134da565b82523d5f602084013e565b606090565b5f918291829182916001600160a01b03165af1614012613fc8565b501561401a57565b60405162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a20455448207472616e73666572206661696044820152621b195960ea1b6064820152608490fd5b60c980546001600160a01b0319908116909155609780549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b156140c557565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b60405163a9059cbb60e01b60208201526001600160a01b03909216602483015260448083019390935291815261415e916141596064836134da565b6141f7565b565b803b1561419c5760018060a01b03166001600160601b0360a01b5f805160206156e28339815191525416175f805160206156e283398151915255565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b906142579160018060a01b03165f80604051936142156040866134da565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af1614251613fc8565b916143c9565b805180614262575050565b8160209181010312612ffc5760200151801590811503612ffc5761428257565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b5f6143076143268293604051928391632d839cb360e21b602084015260406024840152606483019061356c565b6714adf4b7320334b9601d1b604483015203601f1981018352826134da565b6020815191016a636f6e736f6c652e6c6f675afa50565b61436c6143265f93928493604051938492632d839cb360e21b602085015260406024850152606484019061356c565b90604483015203601f1981018352826134da565b9091901561438c575090565b905b8051909190156143a15750805190602001fd5b60405162461bcd60e51b8152602060048201529081906143c590602483019061356c565b0390fd5b9192901561442b57508151156143dd575090565b3b156143e65790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8261438e56fe6080604052346104c6576112b080380380610019816104ca565b9283398101906080818303126104c65780516001600160401b0381116104c657826100459183016104ef565b602082015190926001600160401b0382116104c6576100659183016104ef565b604082015160609092015190926001600160a01b038216908183036104c6578051906001600160401b0382116103c95760035490600182811c921680156104bc575b60208310146103ab5781601f84931161044e575b50602090601f83116001146103e8575f926103dd575b50508160011b915f199060031b1c1916176003555b83516001600160401b0381116103c957600454600181811c911680156103bf575b60208210146103ab57601f8111610348575b50602094601f82116001146102e5579481929394955f926102da575b50508160011b915f199060031b1c1916176004555b61015333610540565b80156102965760075460018114610252576002146101e9575b6002548381018091116101d5577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c6955f9360025584845283825260408420818154019055604051908152a36001600755610540565b604051610d1c90816105948239f35b634e487b7160e01b5f52601160045260245ffd5b6005546001600160a01b03168015908115610248575b5061016c57606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220636f6e74726f6c6c65646044820152fd5b905081145f6101ff565b606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220726573747269637465646044820152fd5b606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207a65726f20696e697469616c20686f6c6465726044820152fd5b015190505f80610135565b601f1982169560045f52805f20915f5b88811061033057508360019596979810610318575b505050811b0160045561014a565b01515f1960f88460031b161c191690555f808061030a565b919260206001819286850151815501940192016102f5565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106103a1575b601f0160051c01905b8181106103965750610119565b5f8155600101610389565b9091508190610380565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610107565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100d1565b60035f9081528281209350601f198516905b818110610436575090846001959493921061041e575b505050811b016003556100e6565b01515f1960f88460031b161c191690555f8080610410565b929360206001819287860151815501950193016103fa565b60035f529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191602085106104b2575b90601f859493920160051c01905b8181106104a457506100bb565b5f8155849350600101610497565b9091508190610489565b91607f16916100a7565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176103c957604052565b81601f820112156104c6578051906001600160401b0382116103c95761051e601f8301601f19166020016104ca565b92828452602083830101116104c657815f9260208093018386015e8301015290565b600680546001600160a01b0319908116909155600580549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a356fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461082e57508063095ea7b31461080857806318160ddd146107eb5780631c8fc2c0146107d057806323b872dd14610713578063295a5212146106f6578063313ce567146106db57806332be6330146106c0578063395093511461065e5780633af3d7831461064457806370a082311461060d578063715018a6146105a857806379ba5097146104de5780638da5cb5b146104b657806395d89b411461039b578063a457c2d7146102f8578063a9059cbb146102c7578063d72dd3b4146101eb578063dd62ed3e1461019b578063e30c3978146101735763f2fde38b14610103575f80fd5b3461016f57602036600319011261016f5761011c610927565b610124610c8e565b600680546001600160a01b0319166001600160a01b039283169081179091556005549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b3461016f575f36600319011261016f576006546040516001600160a01b039091168152602090f35b3461016f57604036600319011261016f576101b4610927565b6101bc61093d565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461016f57602036600319011261016f57600435610207610c8e565b600754156102825780158015610278575b801561026e575b1561022957600755005b60405162461bcd60e51b815260206004820152601960248201527f4c61756e6368546f6b656e3a20696e76616c6964206d6f6465000000000000006044820152606490fd5b506002811461021f565b5060018114610218565b60405162461bcd60e51b815260206004820152601b60248201527f4c61756e6368546f6b656e3a20616c7265616479206e6f726d616c00000000006044820152606490fd5b3461016f57604036600319011261016f576102ed6102e3610927565b6024359033610a57565b602060405160018152f35b3461016f57604036600319011261016f57610311610927565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f205491808310610348576102ed92039033610953565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461016f575f36600319011261016f576040515f6004548060011c906001811680156104ac575b6020831081146104985782855290811561047c5750600114610427575b50819003601f01601f191681019067ffffffffffffffff8211818310176104135761040f829182604052826108fd565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b828210610466575060209150820101826103df565b6001816020925483858801015201910190610451565b90506020925060ff191682840152151560051b820101826103df565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103c2565b3461016f575f36600319011261016f576005546040516001600160a01b039091168152602090f35b3461016f575f36600319011261016f57600654336001600160a01b039091160361055157600680546001600160a01b0319908116909155600580543392811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608490fd5b3461016f575f36600319011261016f576105c0610c8e565b600680546001600160a01b03199081169091556005805491821690555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461016f57602036600319011261016f576001600160a01b0361062e610927565b165f525f602052602060405f2054604051908152f35b3461016f575f36600319011261016f5760206040515f8152f35b3461016f57604036600319011261016f57610677610927565b335f52600160205260405f2060018060a01b0382165f5260205260405f205460243581018091116106ac576102ed9133610953565b634e487b7160e01b5f52601160045260245ffd5b3461016f575f36600319011261016f57602060405160028152f35b3461016f575f36600319011261016f57602060405160128152f35b3461016f575f36600319011261016f576020600754604051908152f35b3461016f57606036600319011261016f5761072c610927565b61073461093d565b6001600160a01b0382165f90815260016020818152604080842033855290915290912054926044359291840161076f575b6102ed9350610a57565b82841061078b57610786836102ed95033383610953565b610765565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461016f575f36600319011261016f57602060405160018152f35b3461016f575f36600319011261016f576020600254604051908152f35b3461016f57604036600319011261016f576102ed610824610927565b6024359033610953565b3461016f575f36600319011261016f575f6003548060011c906001811680156108f3575b6020831081146104985782855290811561047c575060011461089e5750819003601f01601f191681019067ffffffffffffffff8211818310176104135761040f829182604052826108fd565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106108dd575060209150820101826103df565b60018160209254838588010152019101906108c8565b91607f1691610852565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361016f57565b602435906001600160a01b038216820361016f57565b6001600160a01b0316908115610a06576001600160a01b03169182156109b65760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b0316908115610c3b576001600160a01b0316918215610bea5760075460018114610ba657600214610b3c575b815f525f60205260405f2054818110610ae857817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b6005546001600160a01b0316828114908115610b9c575b50610a8a57606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220636f6e74726f6c6c65646044820152fd5b905083145f610b53565b606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220726573747269637465646044820152fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6005546001600160a01b03163303610ca257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fdfea2646970667358221220a629d24973375f2830e4c37a098bc52b41352a17ca873c1bd6aa19328ace772764736f6c634300081a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220cb9116dae24b81e3dbf4d6c18d922e396d7a29c6bc16dbfb02e3cd4437af9eaf64736f6c634300081a0033
0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816303fc20131461343d57508063052d9e7e146134035780630b3eb970146133e05780630b4b8aa5146133625780630bce38611461332f5780630f9baddc1461331157806313966db5146132f357806314b5e981146132d557806316eebd1e146132ac578063178021e31461328e5780631cc2c911146129a35780631d32c2da1461297d5780631e105689146129555780631e228192146128fe57806320160b071461289957806323774af214612857578063239f3af7146128395780633659cfe6146125375780633d18651e146106275780633ee09daa146124ef5780633f4ba83a1461245a5780633f9d7c9e1461243b57806341976e091461241757806347377d92146123f85780634f1ef286146120df57806350879c1c146120b557806351fb012d1461209157806352d1902d14611fce578063570ca73514611fa45780635760f2e314611f565780635b06053014611ea15780635c975abb14611e7e5780636402cdc314611e0c5780636817031b14611dbe5780636889793614611cc8578063715018a614611c61578063791b98bc14611c3757806379ba509714611baf5780637c06fc7714611b905780638456cb5914611b275780638ab1d68114611ae55780638da5cb5b14611abc5780638e109af61461178e5780638fc0ba03146116cd578063910cffe0146116a75780639b19251a146116675780639bcd221f146115b75780639e6b26ba146115835780639f181b5e14611564578063a2397a021461153c578063a800cb8514610a33578063b152f6cf14610a0d578063b3ab15fb146109a1578063b524f87b14610953578063bdcafc55146108e1578063cf3cf573146108c2578063d19aa2b914610674578063d3b23c4314610644578063dd1b9c4a14610627578063e30c3978146105fe578063e43252d7146105b9578063ec1f743b1461048f578063eddd0d9c1461042a578063f2fde38b146103bc578063f4c094c814610350578063fbfa77cf146103265763fe29b4e80361000f5734610323578060031936011261032357602061016d54604051908152f35b80fd5b5034610323578060031936011261032357610164546040516001600160a01b039091168152602090f35b50346103235760203660031901126103235761036a613461565b610372613d45565b610166546001600160a01b0391821691829082167f349b3ca858f1d049aa7b4e826494f79354dbe5f1125ec5442e2d309d21646ec28580a36001600160a01b031916176101665580f35b5034610323576020366003190112610323576103d6613461565b6103de613d45565b60c980546001600160a01b0319166001600160a01b039283169081179091556097549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103235760203660031901126103235760043561045560018060a01b03610165541633146138c0565b7f387269377ae17304805d5f88cea4252e5ca47346783c279aeb9e8627335a49ac604061016c548151908152836020820152a161016c5580f35b50346103235760403660031901126103235761050d6104ac613461565b6001600160a01b03168252610170602052604080832090516105079060243590610500906104d98161348d565b845490818152604060ff600260018901549860208501998a52015416151591015282613721565b9251613707565b90613734565b600181018091116105a55761016b546105268183613721565b9061271003906127108211610591579061053f91613734565b906001820180921161057d5761016d5460409350808310610573575b508161056691613714565b9082519182526020820152f35b915061056661055b565b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b82526011600452602482fd5b5034610323576020366003190112610323576105d3613461565b6105db613d45565b6001600160a01b0316815261017160205260408120805460ff1916600117905580f35b503461032357806003193601126103235760c9546040516001600160a01b039091168152602090f35b503461032357806003193601126103235760206040516127108152f35b503461032357604036600319011261032357602061066c610663613461565b60243590613d0a565b604051908152f35b50346103235760603660031901126103235761068e613461565b6024359061069a613dbf565b6106a2613e15565b6106b660016106b0836135e3565b14613847565b811561087d576040516323b872dd60e01b6020820152336024820152306044820152606480820184905281526001600160a01b0382169190610703906106fd6084826134da565b836141f7565b8184526101706020526040842061071a8483613c86565b9085948093825461072b8582613707565b906101605480921061084e575b5050505061016d5482106107fd5760019061079f61075961016a5485613d9d565b936107648582613707565b976107736044358a1015613cb2565b61078786868060a01b036101645416613ff7565b6107918933613ff7565b806107ec575b508254613707565b8155016107ad838254613714565b9055604051938452602084015260408301527f9387a595ac4be9038bbb9751abad8baa3dcf219dd9e19abb81552bd521fe354660603393a36001805580f35b6107f790338961411e565b5f610797565b60405162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a2073616c6520616d6f756e7420746f6f206044820152626c6f7760e81b6064820152608490fd5b61087394985061086c939650610865929550613707565b8093613d0a565b8093613707565b935f808080610738565b60405162461bcd60e51b815260206004820152601b60248201527f526f62696e4c61756e63687061643a207a65726f20616d6f756e7400000000006044820152606490fd5b5034610323578060031936011261032357602061015f54604051908152f35b50346103235760203660031901126103235760043561090c60018060a01b03610165541633146138c0565b6109196127108210613ba2565b7f3063d3516a6a2d04f3fcbbb8096b055b0976989088fe108ad8081c526a594abd604061016a548151908152836020820152a161016a5580f35b50346103235760203660031901126103235761096d613461565b610975613d45565b6001600160a01b0316610989811515613c3a565b6001600160601b0360a01b6101695416176101695580f35b5034610323576020366003190112610323576109bb613461565b6109c3613d45565b610165546001600160a01b0391821691829082167fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c8580a36001600160a01b031916176101655580f35b50346103235780600319360112610323576020604051676765c793fa10079d601b1b8152f35b50610a89610a4036613590565b90610a4c939293613dbf565b610a54613e15565b60ff6101725416158015611525575b610a6c90613afc565b610a7b61016c54341015613b48565b6001600160a01b0393613e59565b1680825261016f6020526040822080546001600160a01b031916331790556101645461016c54610ac1916001600160a01b0316613ff7565b610ace61016c5434613707565b80610ae3575b60208260018055604051908152f35b610afa610af361016b5483613d9d565b8092613707565b8391610b068285613893565b848652610170602052604086209081549484610b228188613714565b6101615411801597906115045750610bcc9250610b4191508354613714565b916001610b52610161548095613707565b91610b66610b608489613707565b8a613893565b948155887fff274cd97aba8af276149429fbc7ea387e14da22dcd51779c691af908f4feb648b80a25b0194610b9c848754613707565b8655610ba984338a61411e565b816114f5575b61016454610bc79086906001600160a01b0316613ff7565b613707565b925491604051938452602084015260408301526060820152827f63abb62535c21a5d221cf9c15994097b8880cc986d82faf80f57382b998dbae560803393a3610c16575b81610ad4565b808252610170602052604082206101645461015f54610c3d916001600160a01b0316613ff7565b610c59610c4f825461015f5490613707565b6101605490613707565b9060018060a01b036101675416604051636eb1769f60e11b8152306004820152816024820152602081604481885afa9081156114ea5786916114b4575b506114505760405163095ea7b360e01b60208201526001600160a01b0390911660248201526714adf4b7320334b9601d1b6044820152610ced90610ce781606481015b03601f1981018352826134da565b846141f7565b610168546001600160a01b031691828410908115611449576714adf4b7320334b9601d1b915b80156114375781905b604095610d50848851610d2f8a826134da565b600f81526e657468466f724c697175696469747960881b602082015261433d565b610d828751610d5f89826134da565b6011815270746f6b656e466f724c697175696469747960781b60208201526142da565b610db2858851610d928a826134da565b600e81526d064657369726564416d6f756e74360941b602082015261433d565b610de2838851610dc28a826134da565b600e81526d64657369726564416d6f756e743160901b602082015261433d565b8415158061142e575b156113ea57610dfd858460601b613734565b600181018082116113005760011c815b8282106113cb57505060301b6001600160a01b03811161137b5790608460209260018060a01b031693610e63858b51610e468d826134da565b600c81526b39b8b93a283934b1b2ac1c9b60a11b8782015261433d565b610167546001600160a01b0316928c908215611374578c925b1561136c57935b8b516309f56ab160e11b81526001600160a01b039384166004820152929094166024830152612710604483015260648201959095529384928391905af1801561136257611323575b505f80610cd9610f208851610ee08a826134da565b601081526f1c1bdbdb081a5b9a5d1a585b1a5e995960821b6020820152895192839163104c13eb60e21b602084015260206024840152604483019061356c565b6020815191016a636f6e736f6c652e6c6f675afa50610168546001600160a01b03168087109190821561131c5787925b1561131457935b60018060a01b0361016954169061025842019283421161130057889392918b91855196610f83886134bd565b6001600160a01b03908116885298891660208801908152612710878901908152620d899f1960608a01908152620d89a060808b0190815260a08b0195865260c08b0194855260e08b018781526101008c019788526101208c019889526101408c01998a52610167549a51634418b22b60e11b81529b518e1660048d015293518d1660248c0152915162ffffff1660448b015251600290810b60648b01529051900b6084890152915160a48801525160c48701525160e486015251610104850152518516610124840152516101448301529092839116815a9361016492608095f180156112f65785869087938893611290575b50906110a36110d592875161108a89826134da565b60078152661d1bdad95b925960ca1b602082015261433d565b6001600160801b038651916110b888846134da565b60098352686c697175696469747960b81b6020840152169061433d565b6110fe8285516110e587826134da565b60078152660616d6f756e74360cc1b602082015261433d565b61112781855161110e87826134da565b6007815266616d6f756e743160c81b602082015261433d565b610168546001600160a01b031685101561128957505b806714adf4b7320334b9601d1b03906714adf4b7320334b9601d1b82116112755790600292916714adf4b7320334b9601d1b03611257575b5084815584600182015501600160ff19825416179055813b15611234578281516335cb74ed60e21b8152816004820152818160248183885af1801561124d57611238575b5050813b156112345780516338a80c5360e11b815290838260048183875af190811561122b5750611212575b50807f2ab676eef3f76f1bd4e765a352c6cd81e62702f7ad3d363291c8b60582a4525083602094a2610c10565b61121d8380926134da565b611227575f6111e5565b5080fd5b513d85823e3d90fd5b8280fd5b81611242916134da565b61123457825f6111b9565b83513d84823e3d90fd5b6101645461126f91906001600160a01b03168661411e565b5f611175565b634e487b7160e01b86526011600452602486fd5b905061113d565b93505050506080813d6080116112ee575b816112ae608093836134da565b810103126112ea578051906020810151906001600160801b03821682036112e6578481015160609091015190929091906110a3611075565b8680fd5b8480fd5b3d91506112a1565b83513d87823e3d90fd5b634e487b7160e01b8b52601160045260248bfd5b508693610f57565b8092610f50565b6020813d60201161135a575b8161133c602093836134da565b8101031261135657516001600160a01b0381168114610ecb575b8780fd5b3d915061132f565b86513d8a823e3d90fd5b508b93610e83565b8092610e7c565b875162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a2073717274207072696365206f766572666044820152626c6f7760e81b6064820152608490fd5b9091506113e1826113dc8184613734565b613714565b60011c90610e0d565b865162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a207a65726f20616d6f756e7473000000006044820152606490fd5b50821515610deb565b6714adf4b7320334b9601d1b90610d1c565b8091610d13565b60405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608490fd5b90506020813d6020116114e2575b816114cf602093836134da565b810103126114de57515f610c96565b8580fd5b3d91506114c2565b6040513d88823e3d90fd5b6114ff8233613ff7565b610baf565b93611515600192610bcc9596613714565b815561152082613cb2565b610b8f565b50338552610171602052604085205460ff16610a63565b503461032357604036600319011261032357602061066c61155b613461565b60243590613c86565b5034610323578060031936011261032357602061016354604051908152f35b503461032357602036600319011261032357602090600435815261016e8252604060018060a01b0391205416604051908152f35b50346103235760603660031901126103235760243567ffffffffffffffff8111611227576115e990369060040161354e565b906044359067ffffffffffffffff821161032357602061161784611610366004870161354e565b309161369b565b818151910120604051908282019060ff60f81b82523060601b602184015260043560358401526055830152605582526116516075836134da565b905190206040516001600160a01b039091168152f35b50346103235760203660031901126103235760209060ff906040906001600160a01b03611692613461565b16815261017184522054166040519015158152f35b503461032357806003193601126103235760206040516aa56fa5b99019a5c80000008152f35b50346103235760403660031901126103235761171d9061050760406116f0613461565b926024359360018060a01b0316815261017060205220916117166040516104d98161348d565b9251613714565b61172a61016a5482613d9d565b80821061173d5761056681604093613707565b60405162461bcd60e51b8152602060048201526024808201527f526f62696e4c61756e63687061643a20696e73756666696369656e7420666f726044820152632066656560e01b6064820152608490fd5b5034610323576101c0366003190112610323576117a9613461565b6024356001600160a01b03811690819003611234576117c6613477565b6064356001600160a01b038116908190036112ea576084356001600160a01b03811692908390036114de5760a4356001600160a01b03811694908590036112e65786549560ff8760081c161596878098611aaf575b8015611a98575b15611a3c5760ff198116600117895587611a2b575b506001600160a01b031661184c811515613bee565b611857841515613aa2565b84156119e657611868861515613c3a565b6118b360ff895460081c1661187c816140be565b611885816140be565b60018055611892816140be565b61189b816140be565b60ff19606554166065556118ae816140be565b6140be565b6118bc3361406b565b6118cc60ff895460081c166140be565b6001600160601b0360a01b610164541617610164556001600160601b0360a01b6101665416176101665560018060a01b03166001600160601b0360a01b610165541617610165556001600160601b0360a01b610167541617610167556001600160601b0360a01b610168541617610168556001600160601b0360a01b6101695416176101695560c43561016b5560e43561016a556101043561016c556101243561016d556101443561015f55610164356101605561018435610161556101a4356101625533825261017160205260408220600160ff198254161790556119af5780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b60405162461bcd60e51b815260206004820152601960248201527f526f62696e4c61756e63687061643a207a65726f2077657468000000000000006044820152606490fd5b61ffff19166101011788555f611837565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156118225750600160ff821614611822565b50600160ff82161061181b565b50346103235780600319360112610323576097546040516001600160a01b039091168152602090f35b503461032357602036600319011261032357611aff613461565b611b07613d45565b6001600160a01b0316815261017160205260408120805460ff1916905580f35b5034610323578060031936011261032357611b4e60018060a01b03610165541633146138c0565b611b56613e15565b600160ff1960655416176065557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b5034610323578060031936011261032357602061016254604051908152f35b503461032357806003193601126103235760c954336001600160a01b0390911603611be057611bdd3361406b565b80f35b60405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608490fd5b5034610323578060031936011261032357610167546040516001600160a01b039091168152602090f35b5034610323578060031936011261032357611c7a613d45565b60c980546001600160a01b031990811690915560978054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461032357604036600319011261032357611ce2613461565b6024359061016a54611cf48184613721565b9061271003906127108211611daa5790611d0d91613734565b90600182018092116105915761016d54808310611da0575b50611d3482611d849394613714565b6001600160a01b03909116845261017060205260408085209051916105079161050090611d608561348d565b8054855260ff60026001830154928360208901520154161515604086015282613721565b906001820180921161057d576040809350519182526020820152f35b9150611d34611d25565b634e487b7160e01b85526011600452602485fd5b503461032357602036600319011261032357611dd8613461565b611de0613d45565b6001600160a01b0316611df4811515613bee565b6001600160601b0360a01b6101645416176101645580f35b503461032357602036600319011261032357600435611e3760018060a01b03610165541633146138c0565b611e446127108210613ba2565b7f525ad74c8a8eb66a2372d62022c6d2813136ef0f41574506841342146cf694db604061016b548151908152836020820152a161016b5580f35b5034610323578060031936011261032357602060ff606554166040519015158152f35b6020826040611edd611eb236613590565b90611ebe939293613dbf565b611ec6613e15565b60ff6101725416158015611f4157610a6c90613afc565b1680835261016f8452912080546001600160a01b0319163317905561016c54611f1e611f098234613707565b610164549092906001600160a01b0316613ff7565b80611f31575b5060018055604051908152f35b611f3b9033613ff7565b82611f24565b5033865261017187528486205460ff16610a63565b503461032357602036600319011261032357611f70613461565b611f78613d45565b6001600160a01b0316611f8c811515613aa2565b6001600160601b0360a01b6101675416176101675580f35b5034610323578060031936011261032357610165546040516001600160a01b039091168152602090f35b50346103235780600319360112610323577f0000000000000000000000001bc22cd9192fa19a0768624c0fc62bd7d0e500bb6001600160a01b031630036120265760206040515f805160206156e28339815191528152f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b5034610323578060031936011261032357602060ff61017254166040519015158152f35b5034610323578060031936011261032357610168546040516001600160a01b039091168152602090f35b506040366003190112610323576120f4613461565b60243567ffffffffffffffff8111611234573660238201121561123457612125903690602481600401359101613518565b9061217d7f0000000000000000000000001bc22cd9192fa19a0768624c0fc62bd7d0e500bb6001600160a01b031661215f3082141561390c565b5f805160206156e2833981519152546001600160a01b03161461396d565b612185613d45565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156121b957611bdd9150614160565b6040516352d1902d60e01b81526001600160a01b03821690602081600481855afa8591816123c4575b506122435760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b5f805160206156e28339815191520361236d5761225f82614160565b604051907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8580a2825115801590612365575b61229d575b50505080f35b813b15612314575082828192602061230b95519201905af46122bd613fc8565b604051916122cc6060846134da565b602783527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c6020840152660819985a5b195960ca1b6040840152614380565b505f8080612297565b62461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b506001612292565b60405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091506020813d6020116123f0575b816123e0602093836134da565b810103126114de5751905f6121e2565b3d91506123d3565b50346103235780600319360112610323576020604051620d899f198152f35b503461032357602036600319011261032357602061066c612436613461565b6139ce565b5034610323578060031936011261032357602061016054604051908152f35b5034610323578060031936011261032357612473613d45565b60655460ff8116156124b35760ff19166065557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b50346103235760403660031901126103235761250c6104ac613461565b906001820180921161252357602082604051908152f35b634e487b7160e01b81526011600452602490fd5b503461032357602036600319011261032357612551613461565b61258a7f0000000000000000000000001bc22cd9192fa19a0768624c0fc62bd7d0e500bb6001600160a01b031661215f3082141561390c565b612592613d45565b60206040516125a182826134da565b83815281810190601f1983013683377f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156125e657505050611bdd90614160565b6040516352d1902d60e01b8152939492936001600160a01b038616908581600481855afa85918161280a575b506126735760405162461bcd60e51b815260048101879052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b9394937fc9f76b5ec45e5cdef99837d7b6d2467235c1df8933c8ca56df5c35afa2c7d444016127b3576126a586614160565b604051907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8680a28151158015906127ac575b6126e6575b50505050905080f35b853b1561275b575092809481926127509551915af4612703613fc8565b907f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c604051936127346060866134da565b60278552840152660819985a5b195960ca1b6040840152614380565b50805f8080806126dd565b62461bcd60e51b815260048101849052602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b50846126d8565b60405162461bcd60e51b815260048101859052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508681813d8311612832575b61282281836134da565b810103126114de5751905f612612565b503d612818565b50346103235780600319360112610323576020604051620d89a08152f35b5034610323576020366003190112610323576020906001600160a01b0361287c613461565b16815261016f8252604060018060a01b0391205416604051908152f35b5034610323576020366003190112610323576004356128c460018060a01b03610165541633146138c0565b7f091f43688ad4f42d7f02fb81c7e28b693ca4d5d825c27572437bc308cc46aba2604061016d548151908152836020820152a161016d5580f35b5034610323576020366003190112610323576060906040906001600160a01b03612926613461565b1681526101706020522080549060ff600260018301549201541690604051928352602083015215156040820152f35b503461032357604036600319011261032357602061066c612974613461565b60243590613893565b503461032357806003193601126103235760206040516714adf4b7320334b9601d1b8152f35b506040366003190112612ffc576129b8613461565b6129c0613dbf565b6129c8613e15565b6129d660016106b0836135e3565b61016d54341061323b576129ed61016b5434613d9d565b906129f88234613707565b5f90612a048184613893565b9360018060a01b03841694855f5261017060205260405f209081549484612a2b8188613714565b6101615411801597906132155750612aac9250612a4a91508354613714565b916001612a5b610161548095613707565b91612a69610b608489613707565b948155897fff274cd97aba8af276149429fbc7ea387e14da22dcd51779c691af908f4feb645f80a25b0194612a9f848754613707565b8655610ba984338b61411e565b925491604051938452602084015260408301526060820152837f63abb62535c21a5d221cf9c15994097b8880cc986d82faf80f57382b998dbae560803393a3612af8575b826001805580f35b5f828152610170602052604090206101645461015f54612b20916001600160a01b0316613ff7565b612b32610c4f825461015f5490613707565b9160018060a01b036101675416604051636eb1769f60e11b8152306004820152816024820152602081604481895afa90811561320a575f916131d8575b506114505760405163095ea7b360e01b60208201526001600160a01b0390911660248201526714adf4b7320334b9601d1b6044820152612bbc90612bb68160648101610cd9565b856141f7565b610168546001600160a01b0316928385109182156131d2576714adf4b7320334b9601d1b5b83156131c05782935b604096612bfd858951610d2f8b826134da565b612c0c8851610d5f8a826134da565b612c1c838951610d928b826134da565b612c2c868951610dc28b826134da565b821515806131b7575b1561317357612c47838760601b613734565b6001810180821161301e5760011c815b82821061315957505060301b6001600160a01b0381116131095790608460209260018060a01b031693612c91858c610e46815191826134da565b610167546001600160a01b03169281156131025787915b156130f9575f90935b8c516309f56ab160e11b81526001600160a01b039384166004820152929094166024830152612710604483015260648201959095529384928391905af180156130ef576130b1575b505f80610cd9612d4e8951612d0e8b826134da565b601081526f1c1bdbdb081a5b9a5d1a585b1a5e995960821b60208201528a5192839163104c13eb60e21b602084015260206024840152604483019061356c565b6020815191016a636f6e736f6c652e6c6f675afa50610168546001600160a01b03168088109283156130aa5780935b156130a25750935b60018060a01b03610169541661025842019182421161301e578893845195612dac876134bd565b6001600160a01b03908116875297881660208701908152612710868801908152620d899f1960608901908152620d89a060808a0190815260a08a0194855260c08a019586525f60e08b018181526101008c019182526101208c019889526101408c01998a52610167549a51634418b22b60e11b81529b518e1660048d015294518d1660248c0152925162ffffff1660448b01529051600290810b60648b01529051900b6084890152915160a4880152915160c4870152905160e486015251610104850152518516610124840152516101448301529092839116815a9361016492608095f18015613098575f805f935f9361303a575b50906110a3612eb692875161108a89826134da565b612ec68285516110e587826134da565b612ed681855161110e87826134da565b610168546001600160a01b03168510156130325750905b816714adf4b7320334b9601d1b036714adf4b7320334b9601d1b811161301e576002926714adf4b7320334b9601d1b03613000575b505f81555f600182015501600160ff19825416179055813b15612ffc5780516335cb74ed60e21b81525f600482018190528160248183875af18015612ff257612fdd575b508290823b156112275780516338a80c5360e11b815290828260048183885af1908115612fd45750612fbf575b50807f2ab676eef3f76f1bd4e765a352c6cd81e62702f7ad3d363291c8b60582a4525091a25f80612af0565b81612fc9916134da565b61122757815f612f93565b513d84823e3d90fd5b612fea9193505f906134da565b5f915f612f66565b82513d5f823e3d90fd5b5f80fd5b6101645461301891906001600160a01b03168661411e565b5f612f22565b634e487b7160e01b5f52601160045260245ffd5b905090612eed565b93505050506080813d608011613090575b81613058608093836134da565b81010312612ffc578051906020810151906001600160801b0382168203612ffc578481015160609091015190929091906110a3612ea1565b3d915061304b565b83513d5f823e3d90fd5b905093612d85565b8193612d7d565b6020813d6020116130e7575b816130ca602093836134da565b81010312612ffc57516001600160a01b0381168114612cf9575f80fd5b3d91506130bd565b87513d5f823e3d90fd5b505f8793612cb1565b8091612ca8565b885162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a2073717274207072696365206f766572666044820152626c6f7760e81b6064820152608490fd5b90915061316a826113dc8184613734565b60011c90612c57565b875162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a207a65726f20616d6f756e7473000000006044820152606490fd5b50851515612c35565b6714adf4b7320334b9601d1b93612bea565b81612be1565b90506020813d602011613202575b816131f3602093836134da565b81010312612ffc57515f612b6f565b3d91506131e6565b6040513d5f823e3d90fd5b93613226600192612aac9596613714565b8155613236602435861015613cb2565b612a92565b60405162461bcd60e51b815260206004820152602560248201527f526f62696e4c61756e63687061643a20696e73756666696369656e742074782060448201526476616c756560d81b6064820152608490fd5b34612ffc575f366003190112612ffc57602061016a54604051908152f35b34612ffc575f366003190112612ffc57610166546040516001600160a01b039091168152602090f35b34612ffc575f366003190112612ffc57602061016b54604051908152f35b34612ffc575f366003190112612ffc57602061016c54604051908152f35b34612ffc575f366003190112612ffc57602061016154604051908152f35b34612ffc576040366003190112612ffc57604061335661334d613461565b60243590613752565b82519182526020820152f35b34612ffc576060366003190112612ffc5760043567ffffffffffffffff8111612ffc5761339390369060040161354e565b60243567ffffffffffffffff8111612ffc576133dc916133ba6133c892369060040161354e565b6133c2613477565b9161369b565b60405191829160208352602083019061356c565b0390f35b34612ffc576020366003190112612ffc57602061066c6133fe613461565b6135e3565b34612ffc576020366003190112612ffc57600435801515809103612ffc57613429613d45565b60ff80196101725416911617610172555f80f35b34612ffc575f366003190112612ffc57610169546001600160a01b03168152602090f35b600435906001600160a01b0382168203612ffc57565b604435906001600160a01b0382168203612ffc57565b6060810190811067ffffffffffffffff8211176134a957604052565b634e487b7160e01b5f52604160045260245ffd5b610160810190811067ffffffffffffffff8211176134a957604052565b90601f8019910116810190811067ffffffffffffffff8211176134a957604052565b67ffffffffffffffff81116134a957601f01601f191660200190565b929192613524826134fc565b9161353260405193846134da565b829481845281830111612ffc578281602093845f960137010152565b9080601f83011215612ffc5781602061356993359101613518565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b906060600319830112612ffc5760043567ffffffffffffffff8111612ffc57826135bc9160040161354e565b916024359067ffffffffffffffff8211612ffc576135dc9160040161354e565b9060443590565b60018060a01b03165f5261017060205260405f20604080516136048161348d565b60ff600284549485845260018101546020850152015416151591829101525f1461362e5750600390565b61016154811061363e5750600290565b610160541161364c57600190565b5f90565b9161367a9061366c60609396959660808652608086019061356c565b90848203602086015261356c565b676765c793fa10079d601b1b60408401526001600160a01b03909416910152565b906020613569926112b0946136d8604051946136b9858901876134da565b878652848601976144328939610cd96040519384928784019687613650565b6040519586945180918587015e840190838201905f8252519283915e01015f815203601f1981018352826134da565b9190820391821161301e57565b9190820180921161301e57565b8181029291811591840414171561301e57565b811561373e570490565b634e487b7160e01b5f52601260045260245ffd5b61016d5482111561383f5761376d61086c61016b5484613d9d565b9060018060a01b03165f5261017060205260405f206040519061378f8261348d565b805491828152604060ff600260018501549485602086015201541615159101528181155f146137fd575050506101605461016254676765c793fa10079d601b1b0180676765c793fa10079d601b1b1161301e576137fa926137f4610507925b82613721565b92613714565b91565b926105079184613810836137fa97613714565b61016154809111613827575b50506137f4906137ee565b6137f49293509061383791613707565b91905f61381c565b50505f905f90565b1561384e57565b60405162461bcd60e51b815260206004820152601b60248201527f526f62696e4c61756e63687061643a206e6f74206f6e2073616c6500000000006044820152606490fd5b906135699160018060a01b03165f5261017060205261050760405f209161171660405193611d608561348d565b156138c757565b60405162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a206e6f74206f70657261746f72000000006044820152606490fd5b1561391357565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b1561397457565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b60018060a01b03165f5261017060205260405f20604051906139ef8261348d565b8054825260018101546020830181815260029092015460ff161580156040850152613a1b575050505f90565b61016254676765c793fa10079d601b1b019081676765c793fa10079d601b1b1161301e5781141580613a98575b15613a71575051620f4240810290808204620f4240149015171561301e57613569915190613734565b915050620f4240810290808204620f4240149015171561301e576101605461356991613734565b5081511515613a48565b15613aa957565b60405162461bcd60e51b815260206004820152602560248201527f526f62696e4c61756e63687061643a207a65726f20706f736974696f6e206d616044820152643730b3b2b960d91b6064820152608490fd5b15613b0357565b60405162461bcd60e51b815260206004820152601f60248201527f526f62696e4c61756e63687061643a206e6f742077686974656c6973746564006044820152606490fd5b15613b4f57565b60405162461bcd60e51b815260206004820152602560248201527f526f62696e4c61756e63687061643a20696e73756666696369656e74206d696e604482015264742066656560d81b6064820152608490fd5b15613ba957565b60405162461bcd60e51b815260206004820152601c60248201527f526f62696e4c61756e63687061643a2066656520746f6f2068696768000000006044820152606490fd5b15613bf557565b60405162461bcd60e51b815260206004820152601a60248201527f526f62696e4c61756e63687061643a207a65726f207661756c740000000000006044820152606490fd5b15613c4157565b60405162461bcd60e51b815260206004820152601e60248201527f526f62696e4c61756e63687061643a207a65726f206c70206c6f636b657200006044820152606490fd5b906135699160018060a01b03165f5261017060205261050760405f20916117166040516104d98161348d565b15613cb957565b60405162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a20696e73756666696369656e74206f75746044820152621c1d5d60ea1b6064820152608490fd5b90613d379160018060a01b03165f5261017060205261050760405f209161050060405193611d608561348d565b6001810180911161301e5790565b6097546001600160a01b03163303613d5957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61271091613daa91613721565b0461016d54808210613dba575090565b905090565b600260015414613dd0576002600155565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b60ff60655416613e2157565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b60405192916112b0908185019067ffffffffffffffff8211868310176134a9578593613e8b9361443286393092613650565b035f925ff590811561320a576001600160a01b038216803b15612ffc576040516335cb74ed60e21b8152600260048201525f8160248183865af1801561320a57613fb3575b506101638054835261016e6020526040832080546001600160a01b0319166001600160a01b038416179055545f19811461057d57600101610163556101605461016254676765c793fa10079d601b1b019081676765c793fa10079d601b1b1161059157604051600291613f428261348d565b81526020810192835260408101928584528486526101706020526040862091518255516001820155019051151560ff8019835416911617905561016354905f19820191821161057d577f1ff0a01c8968e3551472812164f233abb579247de887db8cbb18281c149bee7a339380a490565b613fc09192505f906134da565b5f905f613ed0565b3d15613ff2573d90613fd9826134fc565b91613fe760405193846134da565b82523d5f602084013e565b606090565b5f918291829182916001600160a01b03165af1614012613fc8565b501561401a57565b60405162461bcd60e51b815260206004820152602360248201527f526f62696e4c61756e63687061643a20455448207472616e73666572206661696044820152621b195960ea1b6064820152608490fd5b60c980546001600160a01b0319908116909155609780549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b156140c557565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b60405163a9059cbb60e01b60208201526001600160a01b03909216602483015260448083019390935291815261415e916141596064836134da565b6141f7565b565b803b1561419c5760018060a01b03166001600160601b0360a01b5f805160206156e28339815191525416175f805160206156e283398151915255565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b906142579160018060a01b03165f80604051936142156040866134da565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af1614251613fc8565b916143c9565b805180614262575050565b8160209181010312612ffc5760200151801590811503612ffc5761428257565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b5f6143076143268293604051928391632d839cb360e21b602084015260406024840152606483019061356c565b6714adf4b7320334b9601d1b604483015203601f1981018352826134da565b6020815191016a636f6e736f6c652e6c6f675afa50565b61436c6143265f93928493604051938492632d839cb360e21b602085015260406024850152606484019061356c565b90604483015203601f1981018352826134da565b9091901561438c575090565b905b8051909190156143a15750805190602001fd5b60405162461bcd60e51b8152602060048201529081906143c590602483019061356c565b0390fd5b9192901561442b57508151156143dd575090565b3b156143e65790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8261438e56fe6080604052346104c6576112b080380380610019816104ca565b9283398101906080818303126104c65780516001600160401b0381116104c657826100459183016104ef565b602082015190926001600160401b0382116104c6576100659183016104ef565b604082015160609092015190926001600160a01b038216908183036104c6578051906001600160401b0382116103c95760035490600182811c921680156104bc575b60208310146103ab5781601f84931161044e575b50602090601f83116001146103e8575f926103dd575b50508160011b915f199060031b1c1916176003555b83516001600160401b0381116103c957600454600181811c911680156103bf575b60208210146103ab57601f8111610348575b50602094601f82116001146102e5579481929394955f926102da575b50508160011b915f199060031b1c1916176004555b61015333610540565b80156102965760075460018114610252576002146101e9575b6002548381018091116101d5577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c6955f9360025584845283825260408420818154019055604051908152a36001600755610540565b604051610d1c90816105948239f35b634e487b7160e01b5f52601160045260245ffd5b6005546001600160a01b03168015908115610248575b5061016c57606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220636f6e74726f6c6c65646044820152fd5b905081145f6101ff565b606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220726573747269637465646044820152fd5b606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207a65726f20696e697469616c20686f6c6465726044820152fd5b015190505f80610135565b601f1982169560045f52805f20915f5b88811061033057508360019596979810610318575b505050811b0160045561014a565b01515f1960f88460031b161c191690555f808061030a565b919260206001819286850151815501940192016102f5565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106103a1575b601f0160051c01905b8181106103965750610119565b5f8155600101610389565b9091508190610380565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610107565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100d1565b60035f9081528281209350601f198516905b818110610436575090846001959493921061041e575b505050811b016003556100e6565b01515f1960f88460031b161c191690555f8080610410565b929360206001819287860151815501950193016103fa565b60035f529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191602085106104b2575b90601f859493920160051c01905b8181106104a457506100bb565b5f8155849350600101610497565b9091508190610489565b91607f16916100a7565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176103c957604052565b81601f820112156104c6578051906001600160401b0382116103c95761051e601f8301601f19166020016104ca565b92828452602083830101116104c657815f9260208093018386015e8301015290565b600680546001600160a01b0319908116909155600580549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a356fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461082e57508063095ea7b31461080857806318160ddd146107eb5780631c8fc2c0146107d057806323b872dd14610713578063295a5212146106f6578063313ce567146106db57806332be6330146106c0578063395093511461065e5780633af3d7831461064457806370a082311461060d578063715018a6146105a857806379ba5097146104de5780638da5cb5b146104b657806395d89b411461039b578063a457c2d7146102f8578063a9059cbb146102c7578063d72dd3b4146101eb578063dd62ed3e1461019b578063e30c3978146101735763f2fde38b14610103575f80fd5b3461016f57602036600319011261016f5761011c610927565b610124610c8e565b600680546001600160a01b0319166001600160a01b039283169081179091556005549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b3461016f575f36600319011261016f576006546040516001600160a01b039091168152602090f35b3461016f57604036600319011261016f576101b4610927565b6101bc61093d565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461016f57602036600319011261016f57600435610207610c8e565b600754156102825780158015610278575b801561026e575b1561022957600755005b60405162461bcd60e51b815260206004820152601960248201527f4c61756e6368546f6b656e3a20696e76616c6964206d6f6465000000000000006044820152606490fd5b506002811461021f565b5060018114610218565b60405162461bcd60e51b815260206004820152601b60248201527f4c61756e6368546f6b656e3a20616c7265616479206e6f726d616c00000000006044820152606490fd5b3461016f57604036600319011261016f576102ed6102e3610927565b6024359033610a57565b602060405160018152f35b3461016f57604036600319011261016f57610311610927565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f205491808310610348576102ed92039033610953565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461016f575f36600319011261016f576040515f6004548060011c906001811680156104ac575b6020831081146104985782855290811561047c5750600114610427575b50819003601f01601f191681019067ffffffffffffffff8211818310176104135761040f829182604052826108fd565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b828210610466575060209150820101826103df565b6001816020925483858801015201910190610451565b90506020925060ff191682840152151560051b820101826103df565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103c2565b3461016f575f36600319011261016f576005546040516001600160a01b039091168152602090f35b3461016f575f36600319011261016f57600654336001600160a01b039091160361055157600680546001600160a01b0319908116909155600580543392811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608490fd5b3461016f575f36600319011261016f576105c0610c8e565b600680546001600160a01b03199081169091556005805491821690555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461016f57602036600319011261016f576001600160a01b0361062e610927565b165f525f602052602060405f2054604051908152f35b3461016f575f36600319011261016f5760206040515f8152f35b3461016f57604036600319011261016f57610677610927565b335f52600160205260405f2060018060a01b0382165f5260205260405f205460243581018091116106ac576102ed9133610953565b634e487b7160e01b5f52601160045260245ffd5b3461016f575f36600319011261016f57602060405160028152f35b3461016f575f36600319011261016f57602060405160128152f35b3461016f575f36600319011261016f576020600754604051908152f35b3461016f57606036600319011261016f5761072c610927565b61073461093d565b6001600160a01b0382165f90815260016020818152604080842033855290915290912054926044359291840161076f575b6102ed9350610a57565b82841061078b57610786836102ed95033383610953565b610765565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461016f575f36600319011261016f57602060405160018152f35b3461016f575f36600319011261016f576020600254604051908152f35b3461016f57604036600319011261016f576102ed610824610927565b6024359033610953565b3461016f575f36600319011261016f575f6003548060011c906001811680156108f3575b6020831081146104985782855290811561047c575060011461089e5750819003601f01601f191681019067ffffffffffffffff8211818310176104135761040f829182604052826108fd565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106108dd575060209150820101826103df565b60018160209254838588010152019101906108c8565b91607f1691610852565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361016f57565b602435906001600160a01b038216820361016f57565b6001600160a01b0316908115610a06576001600160a01b03169182156109b65760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b0316908115610c3b576001600160a01b0316918215610bea5760075460018114610ba657600214610b3c575b815f525f60205260405f2054818110610ae857817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b6005546001600160a01b0316828114908115610b9c575b50610a8a57606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220636f6e74726f6c6c65646044820152fd5b905083145f610b53565b606460405162461bcd60e51b815260206004820152602060248201527f4c61756e6368546f6b656e3a207472616e7366657220726573747269637465646044820152fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6005546001600160a01b03163303610ca257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fdfea2646970667358221220a629d24973375f2830e4c37a098bc52b41352a17ca873c1bd6aa19328ace772764736f6c634300081a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220cb9116dae24b81e3dbf4d6c18d922e396d7a29c6bc16dbfb02e3cd4437af9eaf64736f6c634300081a0033