Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- FamilyFactory
- Optimization enabled
- false
- Compiler version
- v0.8.24+commit.e11b9ed9
- EVM Version
- Verified at
- 2026-09-02T11:52:02.036490Z
Constructor Arguments
0000000000000000000000009ed4801d002fd7b694ef9fc46cc2caa58f80203c00000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f74200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000e3aeb5737240a0000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000948694d1a0c80031e678dbebb4705d8ea47bf3250000000000000000000000007cc05e3ad8f3e5711a20871e690501e2dd29e736
src/FamilyFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import { FamilyLaunch, IERC20M } from "./FamilyLaunch.sol";
/// @title FamilyFactory — one transaction, one token, one locked pool
/// @notice Pons's launch flow: pay the launch fee, name the token, pick the
/// paired asset, optionally developer-buy in the same breath — and the
/// token is trading before the next block, in a pool nothing can
/// unlock. Parameters here are immutable; changing the deal means
/// deploying a new factory version, in public, not turning a knob.
contract FamilyFactory {
address public immutable sink; // MoonxSink — the 30% destination
address public immutable ops; // launch fees land here (native PLS)
uint256 public immutable launchFeePls;
/// @dev PF-3: only canonical assets may back a pool. An arbitrary paired
/// token is an arbitrary external contract inside every trade —
/// fee-on-transfer tokens would corrupt reserve accounting, hooked
/// tokens invite reentrancy games. The list is immutable; widening
/// it means a new factory version, in public.
mapping(address => bool) public pairedAllowed;
uint256 public immutable virtualPaired;
uint256 public immutable snipeBlocks;
uint256 public immutable gradThreshold;
uint256 public totalLaunched; // the "4,228,127 launched" counter — real
address[] public launches;
mapping(address => bool) public isFamily;
/// @dev Everything the Explore grid needs rides the EVENT, not storage —
/// the indexer reads logs; the chain stores only what the contracts
/// themselves must know.
event Launched(
address indexed token,
address indexed creator,
address indexed pairedAsset,
string name,
string symbol,
string imageURI,
string metaURI,
bool holderMode,
uint256 devBuyPaired,
uint256 launchIndex
);
constructor(address _sink, address _ops, uint256 _launchFeePls, uint256 _virtualPaired, uint256 _snipeBlocks, uint256 _gradThreshold, address[] memory _pairedAssets) {
require(_sink != address(0) && _ops != address(0), "zero addr");
require(_pairedAssets.length > 0, "no paired assets");
for (uint256 i = 0; i < _pairedAssets.length; i++) {
pairedAllowed[_pairedAssets[i]] = true;
}
sink = _sink;
ops = _ops;
launchFeePls = _launchFeePls;
virtualPaired = _virtualPaired;
snipeBlocks = _snipeBlocks;
gradThreshold = _gradThreshold;
}
/// @notice Launch a token. `devBuyPaired` > 0 executes the developer buy
/// atomically — approve this factory on the paired asset first.
function launch(
string calldata name_,
string calldata symbol_,
IERC20M pairedAsset,
bool holderMode,
uint256 devBuyPaired,
uint256 devBuyMinOut,
string calldata imageURI,
string calldata metaURI
) external payable returns (address token) {
require(msg.value == launchFeePls, "launch fee");
require(pairedAllowed[address(pairedAsset)], "pair not allowed");
// PF-5: bounded metadata. Unbounded strings are a gas grief on every
// indexer and explorer that ever reads the event.
require(bytes(name_).length > 0 && bytes(name_).length <= 48, "name 1-48");
require(bytes(symbol_).length > 0 && bytes(symbol_).length <= 16, "symbol 1-16");
require(bytes(imageURI).length <= 256 && bytes(metaURI).length <= 512, "uri too long");
FamilyLaunch t = new FamilyLaunch(
name_, symbol_, pairedAsset, msg.sender, sink,
virtualPaired, snipeBlocks, gradThreshold, holderMode
);
token = address(t);
launches.push(token);
isFamily[token] = true;
uint256 idx = ++totalLaunched;
// Developer buy: pull the paired asset, buy through the same public
// path everyone else uses — the dev gets no special price, only the
// first slot.
if (devBuyPaired > 0) {
require(pairedAsset.transferFrom(msg.sender, address(this), devBuyPaired), "dev pull");
require(pairedAsset.approve(token, devBuyPaired), "dev approve");
t.buy(devBuyPaired, devBuyMinOut, msg.sender);
}
// Fee to ops last, so a reverting launch never strands value here.
(bool ok, ) = ops.call{ value: msg.value }("");
require(ok, "fee xfer");
emit Launched(token, msg.sender, address(pairedAsset), name_, symbol_, imageURI, metaURI, holderMode, devBuyPaired, idx);
}
function launchCount() external view returns (uint256) {
return launches.length;
}
}
src/FamilyLaunch.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IERC20M {
function transfer(address to, uint256 amt) external returns (bool);
function transferFrom(address from, address to, uint256 amt) external returns (bool);
function approve(address spender, uint256 amt) external returns (bool);
}
/// @title FamilyLaunch — a token that IS its own locked pool
/// @notice The Pons architecture, made literal. One contract is the ERC20,
/// the AMM, the fee splitter and (optionally) the holder-dividend
/// distributor. There is no LP token, no migration event, and no
/// admin function of any kind: "liquidity locked" is not a promise
/// here, it is the shape of the bytecode.
///
/// Mechanics adopted from Pons as-is:
/// - fixed 1,000,000,000 supply, all minted into the pool at birth
/// - constant-product pricing over a VIRTUAL paired reserve, so the
/// token trades from its first block with a sane starting price
/// - 1% trade fee: 70% to the creator (or to holders, chosen once
/// at launch), 30% pushed to the protocol sink every trade
/// - a snipe window: for the first N blocks, sells keep only 1% —
/// the other 99% stays in the pool, deepening liquidity for the
/// people the sniper tried to farm
/// - graduation at a reserve threshold — a milestone flag and an
/// event; it changes NOTHING mechanical, and it is not a quality
/// signal
contract FamilyLaunch {
// ---------------------------------------------------------------- ERC20
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public constant totalSupply = 1_000_000_000e18;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 amt);
event Approval(address indexed owner, address indexed spender, uint256 amt);
// ----------------------------------------------------------------- pool
IERC20M public immutable paired;
address public immutable creator;
address public immutable sink;
uint256 public immutable virtualPaired; // phantom depth: sets launch price
uint256 public immutable launchBlock;
uint256 public immutable snipeBlocks;
uint256 public immutable gradThreshold; // real paired reserve that flips the flag
bool public immutable holderMode; // true = creator fees stream to holders
uint256 private _lock = 1; // PF-1: reentrancy guard state
uint256 public realPaired; // paired asset actually owned by the POOL
uint256 public creatorFees; // accrued, claimable by the creator (creator mode)
uint256 public circulating; // supply outside the pool — the dividend base
bool public graduated;
uint256 public constant FEE_BPS = 100; // 1% of trade notional
uint256 public constant CREATOR_SHARE_BPS = 7000; // of the fee
uint256 public constant SNIPE_KEEP_BPS = 100; // seller keeps 1% in the window
event Buy(address indexed who, uint256 pairedIn, uint256 tokensOut, uint256 fee);
event Sell(address indexed who, uint256 tokensIn, uint256 pairedOut, uint256 fee, bool sniped);
event CreatorFeesClaimed(address indexed creator, uint256 amount);
event Graduated(uint256 realReserve);
// ------------------------------------------------- holder-dividend rail
// The magnified-dividend pattern: an accumulator of paired-asset-per-token
// over CIRCULATING supply only. The pool never earns from itself — its
// balance is excluded by construction, because circulating moves exactly
// when tokens cross the pool boundary.
uint256 private constant MAG = 1e18; // PF-2: bounded magnification
uint256 public constant DIVIDEND_MIN_CIRC = 1e15; // dust floor for accrual
uint256 public magDividendPerShare;
mapping(address => int256) private magCorrections;
mapping(address => uint256) public withdrawnDividends;
event HolderDividendsAccrued(uint256 amount);
event HolderDividendsClaimed(address indexed who, uint256 amount);
/// @dev PF-1: every path that moves value takes the lock. The paired
/// asset is an external contract; its transfer hooks must find this
/// pool closed for business mid-trade.
modifier lock() {
require(_lock == 1, "reentrancy");
_lock = 2;
_;
_lock = 1;
}
constructor(
string memory _name,
string memory _symbol,
IERC20M _paired,
address _creator,
address _sink,
uint256 _virtualPaired,
uint256 _snipeBlocks,
uint256 _gradThreshold,
bool _holderMode
) {
require(_virtualPaired > 0 && _creator != address(0) && _sink != address(0), "bad params");
name = _name;
symbol = _symbol;
paired = _paired;
creator = _creator;
sink = _sink;
virtualPaired = _virtualPaired;
launchBlock = block.number;
snipeBlocks = _snipeBlocks;
gradThreshold = _gradThreshold;
holderMode = _holderMode;
balanceOf[address(this)] = totalSupply;
emit Transfer(address(0), address(this), totalSupply);
}
// ------------------------------------------------------- ERC20 plumbing
function approve(address spender, uint256 amt) external returns (bool) {
allowance[msg.sender][spender] = amt;
emit Approval(msg.sender, spender, amt);
return true;
}
function transfer(address to, uint256 amt) external returns (bool) {
_move(msg.sender, to, amt);
return true;
}
function transferFrom(address from, address to, uint256 amt) external returns (bool) {
uint256 a = allowance[from][msg.sender];
require(a >= amt, "allowance");
if (a != type(uint256).max) allowance[from][msg.sender] = a - amt;
_move(from, to, amt);
return true;
}
/// @dev Wallet-to-wallet moves carry dividend entitlement with the usual
/// corrections. Nobody may transfer directly to or from the pool —
/// the pool boundary is crossed only through buy() and sell(), which
/// is what keeps `circulating` exact.
function _move(address from, address to, uint256 amt) internal {
require(to != address(this) && from != address(this), "trade via buy/sell");
require(balanceOf[from] >= amt, "balance");
balanceOf[from] -= amt;
balanceOf[to] += amt;
int256 magAmt = int256(magDividendPerShare * amt);
magCorrections[from] += magAmt;
magCorrections[to] -= magAmt;
emit Transfer(from, to, amt);
}
// ---------------------------------------------------------------- views
function pairedReserveEffective() public view returns (uint256) {
return virtualPaired + realPaired;
}
function tokenReserve() public view returns (uint256) {
return balanceOf[address(this)];
}
function inSnipeWindow() public view returns (bool) {
return block.number < launchBlock + snipeBlocks;
}
/// @notice Spot quote for a buy of `pairedIn` (after fee).
function quoteBuy(uint256 pairedIn) public view returns (uint256 out) {
uint256 effIn = pairedIn - (pairedIn * FEE_BPS) / 10000;
uint256 pr = pairedReserveEffective();
out = (effIn * tokenReserve()) / (pr + effIn);
}
/// @notice Spot quote for a sell of `tokensIn` (post-fee, outside the
/// snipe window — inside it, multiply by the window's 1%).
function quoteSell(uint256 tokensIn) public view returns (uint256 payout) {
uint256 pr = pairedReserveEffective();
uint256 grossOut = (tokensIn * pr) / (tokenReserve() + tokensIn);
payout = grossOut - (grossOut * FEE_BPS) / 10000;
}
// ---------------------------------------------------------------- trade
/// @notice Buy tokens with the paired asset. Permissionless, no deadline
/// games: minOut is the caller's only and sufficient protection.
function buy(uint256 pairedIn, uint256 minOut, address recipient) external lock returns (uint256 out) {
require(pairedIn > 0, "zero");
require(recipient != address(0) && recipient != address(this), "bad recipient");
require(paired.transferFrom(msg.sender, address(this), pairedIn), "pay");
uint256 fee = (pairedIn * FEE_BPS) / 10000;
uint256 effIn = pairedIn - fee;
uint256 pr = pairedReserveEffective();
out = (effIn * tokenReserve()) / (pr + effIn);
require(out >= minOut && out > 0, "slippage");
realPaired += effIn;
_splitFee(fee);
balanceOf[address(this)] -= out;
balanceOf[recipient] += out;
circulating += out;
// A fresh buy earns dividends only from now on.
magCorrections[recipient] -= int256(magDividendPerShare * out);
emit Transfer(address(this), recipient, out);
emit Buy(recipient, pairedIn, out, fee);
if (!graduated && realPaired >= gradThreshold) {
graduated = true;
emit Graduated(realPaired);
}
}
/// @notice Sell tokens back into the pool. Inside the snipe window the
/// seller keeps 1% — the rest stays in the pool on purpose.
function sell(uint256 tokensIn, uint256 minOut) external lock returns (uint256 payout) {
require(tokensIn > 0, "zero");
require(balanceOf[msg.sender] >= tokensIn, "balance");
uint256 pr = pairedReserveEffective();
uint256 tr = tokenReserve();
uint256 grossOut = (tokensIn * pr) / (tr + tokensIn);
// The virtual depth can never be paid out: with every token in
// existence sold back, the effective reserve only asymptotes to the
// virtual floor. Belt to the maths' braces:
require(grossOut <= realPaired, "exceeds real reserve");
balanceOf[msg.sender] -= tokensIn;
balanceOf[address(this)] += tokensIn;
circulating -= tokensIn;
magCorrections[msg.sender] += int256(magDividendPerShare * tokensIn);
emit Transfer(msg.sender, address(this), tokensIn);
bool sniped = inSnipeWindow();
uint256 base = grossOut;
if (sniped) {
// 99% stays in the pool — realPaired simply does not decrease by
// that part, which deepens the price for everyone else.
base = (grossOut * SNIPE_KEEP_BPS) / 10000;
}
uint256 fee = (base * FEE_BPS) / 10000;
payout = base - fee;
require(payout >= minOut, "slippage");
realPaired -= base; // only what actually leaves pool custody
_splitFee(fee);
require(paired.transfer(msg.sender, payout), "payout");
emit Sell(msg.sender, tokensIn, payout, fee, sniped);
}
// ----------------------------------------------------------------- fees
/// @dev 30% of every fee is PUSHED to the sink immediately — the burn
/// cannot be quietly withheld. The creator's 70% either accrues for
/// claim, or (holder mode) feeds the dividend accumulator on the
/// spot. With nobody holding yet, holder-mode fees fall back to the
/// creator rather than vanishing into a zero division.
function _splitFee(uint256 fee) internal {
if (fee == 0) return;
uint256 creatorCut = (fee * CREATOR_SHARE_BPS) / 10000;
uint256 sinkCut = fee - creatorCut;
if (sinkCut > 0) require(paired.transfer(sink, sinkCut), "sink push");
if (holderMode && circulating >= DIVIDEND_MIN_CIRC) {
magDividendPerShare += (creatorCut * MAG) / circulating;
emit HolderDividendsAccrued(creatorCut);
} else {
creatorFees += creatorCut;
}
}
function claimCreatorFees() external lock returns (uint256 amt) {
require(msg.sender == creator, "not creator");
amt = creatorFees;
require(amt > 0, "nothing");
creatorFees = 0;
require(paired.transfer(creator, amt), "transfer");
emit CreatorFeesClaimed(creator, amt);
}
// ------------------------------------------------------ holder dividends
function dividendsOf(address who) public view returns (uint256) {
uint256 accumulated = uint256(int256(magDividendPerShare * balanceOf[who]) + magCorrections[who]) / MAG;
return accumulated - withdrawnDividends[who];
}
function claimDividends() external lock returns (uint256 amt) {
amt = dividendsOf(msg.sender);
require(amt > 0, "nothing");
withdrawnDividends[msg.sender] += amt;
require(paired.transfer(msg.sender, amt), "transfer");
emit HolderDividendsClaimed(msg.sender, amt);
}
}
Compiler Settings
{"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_sink","internalType":"address"},{"type":"address","name":"_ops","internalType":"address"},{"type":"uint256","name":"_launchFeePls","internalType":"uint256"},{"type":"uint256","name":"_virtualPaired","internalType":"uint256"},{"type":"uint256","name":"_snipeBlocks","internalType":"uint256"},{"type":"uint256","name":"_gradThreshold","internalType":"uint256"},{"type":"address[]","name":"_pairedAssets","internalType":"address[]"}]},{"type":"event","name":"Launched","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"creator","internalType":"address","indexed":true},{"type":"address","name":"pairedAsset","internalType":"address","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false},{"type":"string","name":"symbol","internalType":"string","indexed":false},{"type":"string","name":"imageURI","internalType":"string","indexed":false},{"type":"string","name":"metaURI","internalType":"string","indexed":false},{"type":"bool","name":"holderMode","internalType":"bool","indexed":false},{"type":"uint256","name":"devBuyPaired","internalType":"uint256","indexed":false},{"type":"uint256","name":"launchIndex","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gradThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFamily","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"address","name":"token","internalType":"address"}],"name":"launch","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"pairedAsset","internalType":"contract IERC20M"},{"type":"bool","name":"holderMode","internalType":"bool"},{"type":"uint256","name":"devBuyPaired","internalType":"uint256"},{"type":"uint256","name":"devBuyMinOut","internalType":"uint256"},{"type":"string","name":"imageURI","internalType":"string"},{"type":"string","name":"metaURI","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchFeePls","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"launches","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ops","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"pairedAllowed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sink","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"snipeBlocks","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLaunched","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"virtualPaired","inputs":[]}]
Contract Creation Code
0x6040610140815234620002395762002f10803803806200001f8162000254565b92833981019160e08284031262000239576200003b826200027a565b916020936200004c8583016200027a565b918381015191606082015160808301519060a08401519060c085015160018060401b03958682116200023957019380601f86011215620002395784519586116200023e576005948660051b8c80620000a681840162000254565b809a8152019183010192831162000239578c809201905b8382106200021f57506001600160a01b03989250505089871615158062000213575b15620001e357855115620001ac5760009760005b87518110156200012357808a8e8b816001958c1b8d010151168252528b8b208260ff1982541617905501620000f3565b50908992918b60805260a05260c05260e0526101009283526101209182525190612c8092836200029084396080518381816102be01526108da015260a0518381816103f30152610893015260c0518381816101c20152610aa5015260e0518381816102e70152610a0d01525182818161030d0152610a4a01525181818161033301526109b00152f35b885162461bcd60e51b8152600481018c9052601060248201526f6e6f207061697265642061737365747360801b6044820152606490fd5b885162461bcd60e51b8152600481018c905260096024820152683d32b9379030b2323960b91b6044820152606490fd5b508688161515620000df565b8280916200022d846200027a565b815201910190620000bd565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200023e57604052565b51906001600160a01b0382168203620002395756fe60808060405260043610156200001457600080fd5b60003560e01c9081631765015f1462000a8d5750806327cca59f1462000a6d5780632be29fa81462000a3057806330e3d48e14620009f35780634c03587014620009d35780636edd12e01462000996578063771f0f0614620009505780637b443a761462000909578063c74e820e14620008c2578063e70abe92146200087b578063f6c51a5414620000fb5763f8e5695714620000b057600080fd5b34620000f6576020366003190112620000f6576004356001600160a01b03811690819003620000f6576000526003602052602060ff604060002054166040519015158152f35b600080fd5b610100366003190112620000f65760043567ffffffffffffffff8111620000f6576200012c90369060040162000b16565b9060243567ffffffffffffffff8111620000f6576200015090369060040162000b16565b929091604435906001600160a01b0382168203620000f657606435938415158503620000f65760c43567ffffffffffffffff8111620000f6576200019990369060040162000b16565b9060e43567ffffffffffffffff8111620000f657620001bd90369060040162000b16565b9290937f0000000000000000000000000000000000000000000000000000000000000000340362000849576001600160a01b03871660009081526020819052604090205460ff161562000811578715158062000805575b15620007d45789151580620007c8575b1562000795576101008211158062000788575b156200075457604051806120a581011067ffffffffffffffff6120a58301111762000541576120a562000ba68239806200029e62000286610120806120a58501526120a58401018c8b62000b47565b6120a58301810360206120a5850101528d8562000b47565b6001600160a01b038a81166120a5840160408101919091523360608201527f000000000000000000000000000000000000000000000000000000000000000090911660808201527f000000000000000000000000000000000000000000000000000000000000000060a08201527f000000000000000000000000000000000000000000000000000000000000000060c08201527f000000000000000000000000000000000000000000000000000000000000000060e08201528c15156101009091015203906000f0998a15620006755760025468010000000000000000811015620005415780600162000395920160025562000ac8565b81546001600160a01b038e8116600393841b81811b92901b1990921617909255600091825260205260409020805460ff19166001908117909155549660001988146200073e57600188016001556084356200055d575b6000808080347f00000000000000000000000000000000000000000000000000000000000000005af13d1562000557573d67ffffffffffffffff811162000541576040519062000446601f8201601f19166020018362000b68565b8152600060203d92013e5b1562000511576040519960e08b5260e08b01906200046f9262000b47565b9089820360208b0152620004839262000b47565b908782036040890152620004979262000b47565b908582036060870152620004ab9262000b47565b931515608084015260843560a084015260010160c08301526001600160a01b03908116923392918516917f77d17d72337cd8c8c61c3b13603f2a16399e6531e2133264f8bba32299c8eae59181900390a46040516001600160a01b039091168152602090f35b60405162461bcd60e51b81526020600482015260086024820152673332b2903c3332b960c11b6044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b62000451565b6040516323b872dd60e01b8152336004820152306024820152608435604482015260208160648160006001600160a01b038f165af190811562000675576000916200071a575b5015620006ea5760405163095ea7b360e01b81526001600160a01b03808e1660048301526084356024830152602090829060449082906000908f165af19081156200067557600091620006b4575b50156200068157600060208d6064604051809481936359a87bc160e01b8352608435600484015260a435602484015233604484015260018060a01b03165af18015620006755762000644575b50620003eb565b602090813d83116200066d575b6200065d818362000b68565b81010312620000f6578c6200063d565b503d62000651565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152600b60248201526a64657620617070726f766560a81b6044820152606490fd5b620006db915060203d602011620006e2575b620006d2818362000b68565b81019062000b8b565b8d620005f1565b503d620006c6565b60405162461bcd60e51b815260206004820152600860248201526719195d881c1d5b1b60c21b6044820152606490fd5b62000737915060203d602011620006e257620006d2818362000b68565b8d620005a3565b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152600c60248201526b75726920746f6f206c6f6e6760a01b6044820152606490fd5b5061020084111562000237565b60405162461bcd60e51b815260206004820152600b60248201526a39bcb6b137b6101896989b60a91b6044820152606490fd5b5060108a111562000224565b60405162461bcd60e51b81526020600482015260096024820152680dcc2daca40625a68760bb1b6044820152606490fd5b50603088111562000214565b60405162461bcd60e51b815260206004820152601060248201526f1c185a5c881b9bdd08185b1b1bddd95960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152600a6024820152696c61756e63682066656560b01b6044820152606490fd5b34620000f6576000366003190112620000f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34620000f6576000366003190112620000f6576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34620000f6576020366003190112620000f657600435600254811015620000f6576200093760209162000ac8565b905460405160039290921b1c6001600160a01b03168152f35b34620000f6576020366003190112620000f6576004356001600160a01b03811690819003620000f6576000526000602052602060ff604060002054166040519015158152f35b34620000f6576000366003190112620000f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34620000f6576000366003190112620000f6576020600154604051908152f35b34620000f6576000366003190112620000f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34620000f6576000366003190112620000f65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34620000f6576000366003190112620000f6576020600254604051908152f35b34620000f6576000366003190112620000f6576020907f00000000000000000000000000000000000000000000000000000000000000008152f35b60025481101562000b005760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b634e487b7160e01b600052603260045260246000fd5b9181601f84011215620000f65782359167ffffffffffffffff8311620000f65760208381860195010111620000f657565b908060209392818452848401376000828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff8211176200054157604052565b90816020910312620000f657518015158103620000f6579056fe60406101808152346200055757620020a5908138038062000020816200055c565b938439820190610120918284820312620005575783516001600160401b0381116200055757816200005391860162000582565b602085015190916001600160401b03821162000557576200007691860162000582565b848301516001600160a01b03939190848116810362000557576200009d60608801620005f4565b620000ab60808901620005f4565b9060a08901519260c08a01519460e08b015197610100809c0151998a15158b036200055757600160045586151590816200054a575b816200053d575b50156200050c578051906001600160401b038211620004005760005490600182811c9216801562000501575b6020831014620003df5781601f8493116200049e575b50602090601f8311600114620004225760009262000416575b50508160011b916000199060031b1c1916176000555b8051906001600160401b038211620004005760015490600182811c92168015620003f5575b6020831014620003df5781601f8493116200037b575b50602090601f83116001146200030157600092620002f5575b50508160011b916000199060031b1c1916176001555b60805260a05260c05260e05243865284526101409182526101609283523060005260026020526b033b2e3c9fd0803ce8000000808260002055815190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a35192611a5b94856200060a86396080518581816104750152818161062e01528181610aba01528181610c20015281816110490152611981015260a051858181610fcf01526113c8015260c0518581816106980152611946015260e0518581816102d20152818161074201528181610b7501528181610c8101528181610f3c015261113e0152518481816103d4015281816105f6015261095e0152518381816103b30152818161093d01526111790152518281816109fd0152610e1d0152518181816107d801526118800152f35b015190503880620001ac565b60016000908152600080516020620020858339815191529350601f198516905b81811062000362575090846001959493921062000348575b505050811b01600155620001c2565b015160001960f88460031b161c1916905538808062000339565b9293602060018192878601518155019501930162000321565b600160005290915060008051602062002085833981519152601f840160051c81019160208510620003d4575b90601f859493920160051c01905b818110620003c4575062000193565b60008155849350600101620003b5565b9091508190620003a7565b634e487b7160e01b600052602260045260246000fd5b91607f16916200017d565b634e487b7160e01b600052604160045260246000fd5b01519050388062000142565b600080805293506000805160206200206583398151915291905b601f198416851062000482576001945083601f1981161062000468575b505050811b0160005562000158565b015160001960f88460031b161c1916905538808062000459565b818101518355602094850194600190930192909101906200043c565b6000805290915060008051602062002065833981519152601f840160051c81019160208510620004f6575b90601f859493920160051c01905b818110620004e6575062000129565b60008155849350600101620004d7565b9091508190620004c9565b91607f169162000113565b875162461bcd60e51b815260206004820152600a60248201526962616420706172616d7360b01b6044820152606490fd5b90508516151538620000e7565b85811615159150620000e0565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200040057604052565b919080601f84011215620005575782516001600160401b0381116200040057602090620005b8601f8201601f191683016200055c565b92818452828287010111620005575760005b818110620005e057508260009394955001015290565b8581018301518482018401528201620005ca565b51906001600160a01b0382168203620005575756fe6040608081526004908136101561001557600080fd5b600091823560e01c90816265318b146113f757816302d05d3f146113b357816306fdde03146112f4578163095ea7b31461128357816318160ddd1461125c57816323b872dd1461119c5781632be29fa81461116157816330e3d48e14611126578163313ce5671461110a578163351fee4614610fa0578163479dfd7b14610f835781634beb394c14610ef057816359a87bc114610b995781635ed930f314610b58578163668038e014610a3f5781636694ba6114610a205781636c22a77e146106c75781636edd12e0146109e557816370a08231146109ad57816371b7f56a1461098b57816384207be2146109235781638ed2d1431461090457816395d89b41146107fd5781639988def0146107c0578163a64190c41461071c578163a7ffd1cc146106fd578163a9059cbb146106cc578163bf333f2c146106c7578163c74e820e14610683578163cbcb31711461065d578163cf88033114610619578163d00efb2f146105de578163d79875eb1461027c57508063dd62ed3e14610234578063de3aaf61146101fd578063e7c2b772146101da5763f8718858146101b957600080fd5b346101d657816003193601126101d6576020906007549051908152f35b5080fd5b50346101d657816003193601126101d65760209060ff6008541690519015158152f35b50346101d65760203660031901126101d65760209181906001600160a01b0361022461141d565b168152600b845220549051908152f35b50346101d657806003193601126101d6578060209261025161141d565b610259611438565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b8383346101d657806003193601126101d65782359261029e60018254146115ba565b600281556102ad841515611685565b338352602093600285526102c681848620541015611707565b60055461031b6102f6827f0000000000000000000000000000000000000000000000000000000000000000611678565b308752600288526103158461030f888a205493826114eb565b92611678565b90611530565b9081116105a45733855260028652838520610337838254611550565b90553085526002865283852061034e838254611678565b905561035c82600754611550565b60075561036b826009546114eb565b338652600a8752610380858720918254611514565b9055835182815230907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef883392a36103f87f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611678565b4310948186929661056f575b50606486028681046064148715171561055c5761271090049061044161042a8389611550565b976104396024358a10156116b7565b600554611550565b60055561044d82611851565b855163a9059cbb60e01b815233868201908152602081018990528990829081906040010381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19182156105515791610524575b50156104f857906001939291855192835286888401528583015260608201527fdc5d404a76ab50144afc43faeff0266b98f34764e05ed785cc958689b620bcc860803392a25551908152f35b845162461bcd60e51b815280850188905260066024820152651c185e5bdd5d60d21b6044820152606490fd5b6105449150883d8a1161054a575b61053c818361144e565b810190611629565b886104ac565b503d610532565b8751903d90823e3d90fd5b634e487b7160e01b825260118552602482fd5b9095506064810290808204606414901517156105915761271090049487610404565b634e487b7160e01b865260118452602486fd5b835162461bcd60e51b8152808401879052601460248201527365786365656473207265616c207265736572766560601b6044820152606490fd5b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101d657816003193601126101d657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101d657816003193601126101d657806020923081526002845220549051908152f35b5050346101d657816003193601126101d657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6114cf565b5050346101d657806003193601126101d6576020906106f66106ec61141d565b602435903361173d565b5160018152f35b5050346101d657816003193601126101d6576020906005549051908152f35b8284346107bd5760203660031901126107bd5761077e833561031561076c6107666005547f0000000000000000000000000000000000000000000000000000000000000000611678565b836114eb565b91308552600260205285852054611678565b906064820290828204606414831517156107aa576020846107a3612710850486611550565b9051908152f35b634e487b7160e01b815260118552602490fd5b80fd5b5050346101d657816003193601126101d657602090517f000000000000000000000000000000000000000000000000000000000000000015158152f35b919050346109005782600319360112610900578051918360018054918260011c926001811680156108f6575b60209586861082146108e357508488529081156108c15750600114610868575b610864868661085a828b038361144e565b5191829182611486565b0390f35b929550600183527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106108ae57505050826108649461085a928201019438610849565b8054868501880152928601928101610891565b60ff191687860152505050151560051b830101925061085a8261086438610849565b634e487b7160e01b845260229052602483fd5b93607f1693610829565b8280fd5b5050346101d657816003193601126101d6576020906009549051908152f35b5050346101d657816003193601126101d6576020906109827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611678565b43109051908152f35b5050346101d657816003193601126101d6576020905166038d7ea4c680008152f35b5050346101d65760203660031901126101d65760209181906001600160a01b036109d561141d565b1681526002845220549051908152f35b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101d657816003193601126101d6576020906006549051908152f35b91905034610900578260031936011261090057610a5f60018354146115ba565b60028255610a6c3361155d565b91610a788315156115f3565b338452602093600b8552828120610a90858254611678565b9055825163a9059cbb60e01b815233838201908152602081018690528690829081906040010381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610b4d5760019392610aff9290610b30575b50611641565b82518481527f824d01e1921464b4232e19a403a24321155d2e927a48be9bf146b3211989f7e5863392a25551908152f35b610b479150873d891161054a5761053c818361144e565b38610af9565b8451903d90823e3d90fd5b5050346101d657816003193601126101d6576020906107a36005547f0000000000000000000000000000000000000000000000000000000000000000611678565b8383346101d65760603660031901126101d6576001600160a01b039260443584811690823590829003610eec57610bd360018454146115ba565b60028355801595610be48715611685565b82151580610ee2575b15610eaf5790859392918551906323b872dd60e01b825233858301523060248301528260448301528160648160209a8b947f0000000000000000000000000000000000000000000000000000000000000000165af1908115610ea5578591610e88575b5015610e5f5760648102968188046064141715610e4c5761271086970490610c788282611550565b906005549282847f000000000000000000000000000000000000000000000000000000000000000090610caa91611678565b30895260028b5289892054610cbf90836114eb565b91610cc991611678565b610cd291611530565b9889948960243587101599600a610d777fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d99610d2660609a60019f9788610d8599610e43575b610d21906116b7565b611678565b600555610d3288611851565b30845260028752848420610d47828254611550565b90558b845260028752848420610d5e828254611678565b9055610d6c81600754611678565b6007556009546114eb565b948a835252209182546116ee565b90558488518a81527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c3092a38751918252888a83015287820152a260085460ff81161580610e17575b610ddc575b505551908152f35b829060ff1916176008557f04d39283851d5dc1961a5296a48d487854db2aae45afe51e83aae1db8d04d42f856005548551908152a185610dd4565b506005547f00000000000000000000000000000000000000000000000000000000000000001115610dcf565b50831515610d18565b634e487b7160e01b845260118352602484fd5b845162461bcd60e51b8152808401879052600360248201526270617960e81b6044820152606490fd5b610e9f9150873d891161054a5761053c818361144e565b88610c50565b86513d87823e3d90fd5b845162461bcd60e51b8152602081860152600d60248201526c189859081c9958da5c1a595b9d609a1b6044820152606490fd5b5030831415610bed565b8480fd5b8284346107bd5760203660031901126107bd5782356064810281810460641482151715610f705791610315610f306107a393612710602097960490611550565b61030f85610f606005547f0000000000000000000000000000000000000000000000000000000000000000611678565b94308152600289522054826114eb565b634e487b7160e01b835260118552602483fd5b5050346101d657816003193601126101d65760209051611b588152f35b91905034610900578260031936011261090057610fc060018354146115ba565b600282556001600160a01b03917f000000000000000000000000000000000000000000000000000000000000000083811690338290036110d9576020611045916006549687916110118315156115f3565b8960065589885180968195829463a9059cbb60e01b84528b840160209093929193604081019460018060a01b031681520152565b03927f0000000000000000000000000000000000000000000000000000000000000000165af19081156110cf57600193929161108991602098916110b85750611641565b7fd046302bdc39599e60a5981e59227dcd1c643f512f56f2e984390c3ac6eadedb868551878152a25551908152f35b610b479150883d8a1161054a5761053c818361144e565b84513d88823e3d90fd5b835162461bcd60e51b8152602081850152600b60248201526a3737ba1031b932b0ba37b960a91b6044820152606490fd5b5050346101d657816003193601126101d6576020905160128152f35b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b91905034610900576060366003190112610900576111b861141d565b6111c0611438565b6044359160018060a01b038116808752602095600387528588203389528752858820549085821061122d5750948096976106f696866000198203611209575b505050505061173d565b61121291611550565b928152600389528181203382528952205538858180866111ff565b865162461bcd60e51b81529081018890526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b5050346101d657816003193601126101d657602090516b033b2e3c9fd0803ce80000008152f35b5050346101d657806003193601126101d657602091816112a161141d565b91602435918291338152600387528181209460018060a01b0316948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b91905034610900578260031936011261090057805191838054906001908260011c926001811680156113a9575b60209586861082146108e357508488529081156108c1575060011461135157610864868661085a828b038361144e565b8080949750527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061139657505050826108649461085a928201019438610849565b8054868501880152928601928101611379565b93607f1693611321565b5050346101d657816003193601126101d657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101d65760203660031901126101d6576020906107a361141861141d565b61155d565b600435906001600160a01b038216820361143357565b600080fd5b602435906001600160a01b038216820361143357565b90601f8019910116810190811067ffffffffffffffff82111761147057604052565b634e487b7160e01b600052604160045260246000fd5b6020808252825181830181905290939260005b8281106114bb57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501611499565b3461143357600036600319011261143357602060405160648152f35b818102929181159184041417156114fe57565b634e487b7160e01b600052601160045260246000fd5b919091600083820193841291129080158216911516176114fe57565b811561153a570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116114fe57565b6115b79060406009549160018060a01b031691670de0b6b3a76400006115a6611594600093868552600260205285852054906114eb565b858452600a6020528484205490611514565b04928152600b602052205490611550565b90565b156115c157565b60405162461bcd60e51b815260206004820152600a6024820152697265656e7472616e637960b01b6044820152606490fd5b156115fa57565b60405162461bcd60e51b81526020600482015260076024820152666e6f7468696e6760c81b6044820152606490fd5b90816020910312611433575180151581036114335790565b1561164857565b60405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b6044820152606490fd5b919082018092116114fe57565b1561168c57565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b156116be57565b60405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606490fd5b818103929160001380158285131691841216176114fe57565b1561170e57565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b6001600160a01b0391821692913084141580611845575b1561180b577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9116916000908382526020916002835260409061179c83838320541015611707565b858152600284528181206117b1848254611550565b9055868152600284528181206117c8848254611678565b9055611802826117da856009546114eb565b92888152600a87528181206117f0858254611514565b9055898152600a8752209182546116ee565b905551908152a3565b60405162461bcd60e51b81526020600482015260126024820152711d1c985919481d9a5848189d5e4bdcd95b1b60721b6044820152606490fd5b50308183161415611754565b8015611a2257611b588102611b5719828204016114fe5761271061187791048092611550565b8061192f575b507f00000000000000000000000000000000000000000000000000000000000000008061191c575b1561190b57670de0b6b3a76400008082029082820414821517156114fe577f2724190d857d4dc7e52f584276d1bfd610594cdb6e4e5a4969c0db32b9b04bf2916118ff6118f760209360075490611530565b600954611678565b600955604051908152a1565b61191790600654611678565b600655565b5066038d7ea4c6800060075410156118a5565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260248101919091526020818060448101038160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115611a16576000916119f7575b50156119c6573861187d565b60405162461bcd60e51b81526020600482015260096024820152680e6d2dcd640e0eae6d60bb1b6044820152606490fd5b611a10915060203d60201161054a5761053c818361144e565b386119ba565b6040513d6000823e3d90fd5b5056fea2646970667358221220da56c82e5cdd6e4a64bcaa4a1b328299437571f0942bdec6bd29a9860af0215264736f6c63430008180033290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6a2646970667358221220188975991749dcd6865748b98a48ce29a24a534a35d44d967ec9657aaff3c44e64736f6c634300081800330000000000000000000000009ed4801d002fd7b694ef9fc46cc2caa58f80203c00000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f74200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000e3aeb5737240a0000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000948694d1a0c80031e678dbebb4705d8ea47bf3250000000000000000000000007cc05e3ad8f3e5711a20871e690501e2dd29e736
Deployed ByteCode
0x60808060405260043610156200001457600080fd5b60003560e01c9081631765015f1462000a8d5750806327cca59f1462000a6d5780632be29fa81462000a3057806330e3d48e14620009f35780634c03587014620009d35780636edd12e01462000996578063771f0f0614620009505780637b443a761462000909578063c74e820e14620008c2578063e70abe92146200087b578063f6c51a5414620000fb5763f8e5695714620000b057600080fd5b34620000f6576020366003190112620000f6576004356001600160a01b03811690819003620000f6576000526003602052602060ff604060002054166040519015158152f35b600080fd5b610100366003190112620000f65760043567ffffffffffffffff8111620000f6576200012c90369060040162000b16565b9060243567ffffffffffffffff8111620000f6576200015090369060040162000b16565b929091604435906001600160a01b0382168203620000f657606435938415158503620000f65760c43567ffffffffffffffff8111620000f6576200019990369060040162000b16565b9060e43567ffffffffffffffff8111620000f657620001bd90369060040162000b16565b9290937f00000000000000000000000000000000000000000000000000470de4df820000340362000849576001600160a01b03871660009081526020819052604090205460ff161562000811578715158062000805575b15620007d45789151580620007c8575b1562000795576101008211158062000788575b156200075457604051806120a581011067ffffffffffffffff6120a58301111762000541576120a562000ba68239806200029e62000286610120806120a58501526120a58401018c8b62000b47565b6120a58301810360206120a5850101528d8562000b47565b6001600160a01b038a81166120a5840160408101919091523360608201527f0000000000000000000000009ed4801d002fd7b694ef9fc46cc2caa58f80203c90911660808201527f00000000000000000000000000000000000000000000021e19e0c9bab240000060a08201527f000000000000000000000000000000000000000000000000000000000000001e60c08201527f0000000000000000000000000000000000000000000000e3aeb5737240a0000060e08201528c15156101009091015203906000f0998a15620006755760025468010000000000000000811015620005415780600162000395920160025562000ac8565b81546001600160a01b038e8116600393841b81811b92901b1990921617909255600091825260205260409020805460ff19166001908117909155549660001988146200073e57600188016001556084356200055d575b6000808080347f00000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f7425af13d1562000557573d67ffffffffffffffff811162000541576040519062000446601f8201601f19166020018362000b68565b8152600060203d92013e5b1562000511576040519960e08b5260e08b01906200046f9262000b47565b9089820360208b0152620004839262000b47565b908782036040890152620004979262000b47565b908582036060870152620004ab9262000b47565b931515608084015260843560a084015260010160c08301526001600160a01b03908116923392918516917f77d17d72337cd8c8c61c3b13603f2a16399e6531e2133264f8bba32299c8eae59181900390a46040516001600160a01b039091168152602090f35b60405162461bcd60e51b81526020600482015260086024820152673332b2903c3332b960c11b6044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b62000451565b6040516323b872dd60e01b8152336004820152306024820152608435604482015260208160648160006001600160a01b038f165af190811562000675576000916200071a575b5015620006ea5760405163095ea7b360e01b81526001600160a01b03808e1660048301526084356024830152602090829060449082906000908f165af19081156200067557600091620006b4575b50156200068157600060208d6064604051809481936359a87bc160e01b8352608435600484015260a435602484015233604484015260018060a01b03165af18015620006755762000644575b50620003eb565b602090813d83116200066d575b6200065d818362000b68565b81010312620000f6578c6200063d565b503d62000651565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152600b60248201526a64657620617070726f766560a81b6044820152606490fd5b620006db915060203d602011620006e2575b620006d2818362000b68565b81019062000b8b565b8d620005f1565b503d620006c6565b60405162461bcd60e51b815260206004820152600860248201526719195d881c1d5b1b60c21b6044820152606490fd5b62000737915060203d602011620006e257620006d2818362000b68565b8d620005a3565b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152600c60248201526b75726920746f6f206c6f6e6760a01b6044820152606490fd5b5061020084111562000237565b60405162461bcd60e51b815260206004820152600b60248201526a39bcb6b137b6101896989b60a91b6044820152606490fd5b5060108a111562000224565b60405162461bcd60e51b81526020600482015260096024820152680dcc2daca40625a68760bb1b6044820152606490fd5b50603088111562000214565b60405162461bcd60e51b815260206004820152601060248201526f1c185a5c881b9bdd08185b1b1bddd95960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152600a6024820152696c61756e63682066656560b01b6044820152606490fd5b34620000f6576000366003190112620000f6576040517f00000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f7426001600160a01b03168152602090f35b34620000f6576000366003190112620000f6576040517f0000000000000000000000009ed4801d002fd7b694ef9fc46cc2caa58f80203c6001600160a01b03168152602090f35b34620000f6576020366003190112620000f657600435600254811015620000f6576200093760209162000ac8565b905460405160039290921b1c6001600160a01b03168152f35b34620000f6576020366003190112620000f6576004356001600160a01b03811690819003620000f6576000526000602052602060ff604060002054166040519015158152f35b34620000f6576000366003190112620000f65760206040517f0000000000000000000000000000000000000000000000e3aeb5737240a000008152f35b34620000f6576000366003190112620000f6576020600154604051908152f35b34620000f6576000366003190112620000f65760206040517f00000000000000000000000000000000000000000000021e19e0c9bab24000008152f35b34620000f6576000366003190112620000f65760206040517f000000000000000000000000000000000000000000000000000000000000001e8152f35b34620000f6576000366003190112620000f6576020600254604051908152f35b34620000f6576000366003190112620000f6576020907f00000000000000000000000000000000000000000000000000470de4df8200008152f35b60025481101562000b005760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b634e487b7160e01b600052603260045260246000fd5b9181601f84011215620000f65782359167ffffffffffffffff8311620000f65760208381860195010111620000f657565b908060209392818452848401376000828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff8211176200054157604052565b90816020910312620000f657518015158103620000f6579056fe60406101808152346200055757620020a5908138038062000020816200055c565b938439820190610120918284820312620005575783516001600160401b0381116200055757816200005391860162000582565b602085015190916001600160401b03821162000557576200007691860162000582565b848301516001600160a01b03939190848116810362000557576200009d60608801620005f4565b620000ab60808901620005f4565b9060a08901519260c08a01519460e08b015197610100809c0151998a15158b036200055757600160045586151590816200054a575b816200053d575b50156200050c578051906001600160401b038211620004005760005490600182811c9216801562000501575b6020831014620003df5781601f8493116200049e575b50602090601f8311600114620004225760009262000416575b50508160011b916000199060031b1c1916176000555b8051906001600160401b038211620004005760015490600182811c92168015620003f5575b6020831014620003df5781601f8493116200037b575b50602090601f83116001146200030157600092620002f5575b50508160011b916000199060031b1c1916176001555b60805260a05260c05260e05243865284526101409182526101609283523060005260026020526b033b2e3c9fd0803ce8000000808260002055815190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a35192611a5b94856200060a86396080518581816104750152818161062e01528181610aba01528181610c20015281816110490152611981015260a051858181610fcf01526113c8015260c0518581816106980152611946015260e0518581816102d20152818161074201528181610b7501528181610c8101528181610f3c015261113e0152518481816103d4015281816105f6015261095e0152518381816103b30152818161093d01526111790152518281816109fd0152610e1d0152518181816107d801526118800152f35b015190503880620001ac565b60016000908152600080516020620020858339815191529350601f198516905b81811062000362575090846001959493921062000348575b505050811b01600155620001c2565b015160001960f88460031b161c1916905538808062000339565b9293602060018192878601518155019501930162000321565b600160005290915060008051602062002085833981519152601f840160051c81019160208510620003d4575b90601f859493920160051c01905b818110620003c4575062000193565b60008155849350600101620003b5565b9091508190620003a7565b634e487b7160e01b600052602260045260246000fd5b91607f16916200017d565b634e487b7160e01b600052604160045260246000fd5b01519050388062000142565b600080805293506000805160206200206583398151915291905b601f198416851062000482576001945083601f1981161062000468575b505050811b0160005562000158565b015160001960f88460031b161c1916905538808062000459565b818101518355602094850194600190930192909101906200043c565b6000805290915060008051602062002065833981519152601f840160051c81019160208510620004f6575b90601f859493920160051c01905b818110620004e6575062000129565b60008155849350600101620004d7565b9091508190620004c9565b91607f169162000113565b875162461bcd60e51b815260206004820152600a60248201526962616420706172616d7360b01b6044820152606490fd5b90508516151538620000e7565b85811615159150620000e0565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200040057604052565b919080601f84011215620005575782516001600160401b0381116200040057602090620005b8601f8201601f191683016200055c565b92818452828287010111620005575760005b818110620005e057508260009394955001015290565b8581018301518482018401528201620005ca565b51906001600160a01b0382168203620005575756fe6040608081526004908136101561001557600080fd5b600091823560e01c90816265318b146113f757816302d05d3f146113b357816306fdde03146112f4578163095ea7b31461128357816318160ddd1461125c57816323b872dd1461119c5781632be29fa81461116157816330e3d48e14611126578163313ce5671461110a578163351fee4614610fa0578163479dfd7b14610f835781634beb394c14610ef057816359a87bc114610b995781635ed930f314610b58578163668038e014610a3f5781636694ba6114610a205781636c22a77e146106c75781636edd12e0146109e557816370a08231146109ad57816371b7f56a1461098b57816384207be2146109235781638ed2d1431461090457816395d89b41146107fd5781639988def0146107c0578163a64190c41461071c578163a7ffd1cc146106fd578163a9059cbb146106cc578163bf333f2c146106c7578163c74e820e14610683578163cbcb31711461065d578163cf88033114610619578163d00efb2f146105de578163d79875eb1461027c57508063dd62ed3e14610234578063de3aaf61146101fd578063e7c2b772146101da5763f8718858146101b957600080fd5b346101d657816003193601126101d6576020906007549051908152f35b5080fd5b50346101d657816003193601126101d65760209060ff6008541690519015158152f35b50346101d65760203660031901126101d65760209181906001600160a01b0361022461141d565b168152600b845220549051908152f35b50346101d657806003193601126101d6578060209261025161141d565b610259611438565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b8383346101d657806003193601126101d65782359261029e60018254146115ba565b600281556102ad841515611685565b338352602093600285526102c681848620541015611707565b60055461031b6102f6827f0000000000000000000000000000000000000000000000000000000000000000611678565b308752600288526103158461030f888a205493826114eb565b92611678565b90611530565b9081116105a45733855260028652838520610337838254611550565b90553085526002865283852061034e838254611678565b905561035c82600754611550565b60075561036b826009546114eb565b338652600a8752610380858720918254611514565b9055835182815230907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef883392a36103f87f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611678565b4310948186929661056f575b50606486028681046064148715171561055c5761271090049061044161042a8389611550565b976104396024358a10156116b7565b600554611550565b60055561044d82611851565b855163a9059cbb60e01b815233868201908152602081018990528990829081906040010381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19182156105515791610524575b50156104f857906001939291855192835286888401528583015260608201527fdc5d404a76ab50144afc43faeff0266b98f34764e05ed785cc958689b620bcc860803392a25551908152f35b845162461bcd60e51b815280850188905260066024820152651c185e5bdd5d60d21b6044820152606490fd5b6105449150883d8a1161054a575b61053c818361144e565b810190611629565b886104ac565b503d610532565b8751903d90823e3d90fd5b634e487b7160e01b825260118552602482fd5b9095506064810290808204606414901517156105915761271090049487610404565b634e487b7160e01b865260118452602486fd5b835162461bcd60e51b8152808401879052601460248201527365786365656473207265616c207265736572766560601b6044820152606490fd5b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101d657816003193601126101d657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101d657816003193601126101d657806020923081526002845220549051908152f35b5050346101d657816003193601126101d657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6114cf565b5050346101d657806003193601126101d6576020906106f66106ec61141d565b602435903361173d565b5160018152f35b5050346101d657816003193601126101d6576020906005549051908152f35b8284346107bd5760203660031901126107bd5761077e833561031561076c6107666005547f0000000000000000000000000000000000000000000000000000000000000000611678565b836114eb565b91308552600260205285852054611678565b906064820290828204606414831517156107aa576020846107a3612710850486611550565b9051908152f35b634e487b7160e01b815260118552602490fd5b80fd5b5050346101d657816003193601126101d657602090517f000000000000000000000000000000000000000000000000000000000000000015158152f35b919050346109005782600319360112610900578051918360018054918260011c926001811680156108f6575b60209586861082146108e357508488529081156108c15750600114610868575b610864868661085a828b038361144e565b5191829182611486565b0390f35b929550600183527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106108ae57505050826108649461085a928201019438610849565b8054868501880152928601928101610891565b60ff191687860152505050151560051b830101925061085a8261086438610849565b634e487b7160e01b845260229052602483fd5b93607f1693610829565b8280fd5b5050346101d657816003193601126101d6576020906009549051908152f35b5050346101d657816003193601126101d6576020906109827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611678565b43109051908152f35b5050346101d657816003193601126101d6576020905166038d7ea4c680008152f35b5050346101d65760203660031901126101d65760209181906001600160a01b036109d561141d565b1681526002845220549051908152f35b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101d657816003193601126101d6576020906006549051908152f35b91905034610900578260031936011261090057610a5f60018354146115ba565b60028255610a6c3361155d565b91610a788315156115f3565b338452602093600b8552828120610a90858254611678565b9055825163a9059cbb60e01b815233838201908152602081018690528690829081906040010381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610b4d5760019392610aff9290610b30575b50611641565b82518481527f824d01e1921464b4232e19a403a24321155d2e927a48be9bf146b3211989f7e5863392a25551908152f35b610b479150873d891161054a5761053c818361144e565b38610af9565b8451903d90823e3d90fd5b5050346101d657816003193601126101d6576020906107a36005547f0000000000000000000000000000000000000000000000000000000000000000611678565b8383346101d65760603660031901126101d6576001600160a01b039260443584811690823590829003610eec57610bd360018454146115ba565b60028355801595610be48715611685565b82151580610ee2575b15610eaf5790859392918551906323b872dd60e01b825233858301523060248301528260448301528160648160209a8b947f0000000000000000000000000000000000000000000000000000000000000000165af1908115610ea5578591610e88575b5015610e5f5760648102968188046064141715610e4c5761271086970490610c788282611550565b906005549282847f000000000000000000000000000000000000000000000000000000000000000090610caa91611678565b30895260028b5289892054610cbf90836114eb565b91610cc991611678565b610cd291611530565b9889948960243587101599600a610d777fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d99610d2660609a60019f9788610d8599610e43575b610d21906116b7565b611678565b600555610d3288611851565b30845260028752848420610d47828254611550565b90558b845260028752848420610d5e828254611678565b9055610d6c81600754611678565b6007556009546114eb565b948a835252209182546116ee565b90558488518a81527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c3092a38751918252888a83015287820152a260085460ff81161580610e17575b610ddc575b505551908152f35b829060ff1916176008557f04d39283851d5dc1961a5296a48d487854db2aae45afe51e83aae1db8d04d42f856005548551908152a185610dd4565b506005547f00000000000000000000000000000000000000000000000000000000000000001115610dcf565b50831515610d18565b634e487b7160e01b845260118352602484fd5b845162461bcd60e51b8152808401879052600360248201526270617960e81b6044820152606490fd5b610e9f9150873d891161054a5761053c818361144e565b88610c50565b86513d87823e3d90fd5b845162461bcd60e51b8152602081860152600d60248201526c189859081c9958da5c1a595b9d609a1b6044820152606490fd5b5030831415610bed565b8480fd5b8284346107bd5760203660031901126107bd5782356064810281810460641482151715610f705791610315610f306107a393612710602097960490611550565b61030f85610f606005547f0000000000000000000000000000000000000000000000000000000000000000611678565b94308152600289522054826114eb565b634e487b7160e01b835260118552602483fd5b5050346101d657816003193601126101d65760209051611b588152f35b91905034610900578260031936011261090057610fc060018354146115ba565b600282556001600160a01b03917f000000000000000000000000000000000000000000000000000000000000000083811690338290036110d9576020611045916006549687916110118315156115f3565b8960065589885180968195829463a9059cbb60e01b84528b840160209093929193604081019460018060a01b031681520152565b03927f0000000000000000000000000000000000000000000000000000000000000000165af19081156110cf57600193929161108991602098916110b85750611641565b7fd046302bdc39599e60a5981e59227dcd1c643f512f56f2e984390c3ac6eadedb868551878152a25551908152f35b610b479150883d8a1161054a5761053c818361144e565b84513d88823e3d90fd5b835162461bcd60e51b8152602081850152600b60248201526a3737ba1031b932b0ba37b960a91b6044820152606490fd5b5050346101d657816003193601126101d6576020905160128152f35b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101d657816003193601126101d657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b91905034610900576060366003190112610900576111b861141d565b6111c0611438565b6044359160018060a01b038116808752602095600387528588203389528752858820549085821061122d5750948096976106f696866000198203611209575b505050505061173d565b61121291611550565b928152600389528181203382528952205538858180866111ff565b865162461bcd60e51b81529081018890526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b5050346101d657816003193601126101d657602090516b033b2e3c9fd0803ce80000008152f35b5050346101d657806003193601126101d657602091816112a161141d565b91602435918291338152600387528181209460018060a01b0316948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b91905034610900578260031936011261090057805191838054906001908260011c926001811680156113a9575b60209586861082146108e357508488529081156108c1575060011461135157610864868661085a828b038361144e565b8080949750527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061139657505050826108649461085a928201019438610849565b8054868501880152928601928101611379565b93607f1693611321565b5050346101d657816003193601126101d657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101d65760203660031901126101d6576020906107a361141861141d565b61155d565b600435906001600160a01b038216820361143357565b600080fd5b602435906001600160a01b038216820361143357565b90601f8019910116810190811067ffffffffffffffff82111761147057604052565b634e487b7160e01b600052604160045260246000fd5b6020808252825181830181905290939260005b8281106114bb57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501611499565b3461143357600036600319011261143357602060405160648152f35b818102929181159184041417156114fe57565b634e487b7160e01b600052601160045260246000fd5b919091600083820193841291129080158216911516176114fe57565b811561153a570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116114fe57565b6115b79060406009549160018060a01b031691670de0b6b3a76400006115a6611594600093868552600260205285852054906114eb565b858452600a6020528484205490611514565b04928152600b602052205490611550565b90565b156115c157565b60405162461bcd60e51b815260206004820152600a6024820152697265656e7472616e637960b01b6044820152606490fd5b156115fa57565b60405162461bcd60e51b81526020600482015260076024820152666e6f7468696e6760c81b6044820152606490fd5b90816020910312611433575180151581036114335790565b1561164857565b60405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b6044820152606490fd5b919082018092116114fe57565b1561168c57565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b156116be57565b60405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606490fd5b818103929160001380158285131691841216176114fe57565b1561170e57565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b6001600160a01b0391821692913084141580611845575b1561180b577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9116916000908382526020916002835260409061179c83838320541015611707565b858152600284528181206117b1848254611550565b9055868152600284528181206117c8848254611678565b9055611802826117da856009546114eb565b92888152600a87528181206117f0858254611514565b9055898152600a8752209182546116ee565b905551908152a3565b60405162461bcd60e51b81526020600482015260126024820152711d1c985919481d9a5848189d5e4bdcd95b1b60721b6044820152606490fd5b50308183161415611754565b8015611a2257611b588102611b5719828204016114fe5761271061187791048092611550565b8061192f575b507f00000000000000000000000000000000000000000000000000000000000000008061191c575b1561190b57670de0b6b3a76400008082029082820414821517156114fe577f2724190d857d4dc7e52f584276d1bfd610594cdb6e4e5a4969c0db32b9b04bf2916118ff6118f760209360075490611530565b600954611678565b600955604051908152a1565b61191790600654611678565b600655565b5066038d7ea4c6800060075410156118a5565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260248101919091526020818060448101038160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115611a16576000916119f7575b50156119c6573861187d565b60405162461bcd60e51b81526020600482015260096024820152680e6d2dcd640e0eae6d60bb1b6044820152606490fd5b611a10915060203d60201161054a5761053c818361144e565b386119ba565b6040513d6000823e3d90fd5b5056fea2646970667358221220da56c82e5cdd6e4a64bcaa4a1b328299437571f0942bdec6bd29a9860af0215264736f6c63430008180033290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6a2646970667358221220188975991749dcd6865748b98a48ce29a24a534a35d44d967ec9657aaff3c44e64736f6c63430008180033