MON Price: $0.021223 (-4.26%)

Contract

0x97b4a6b501C55cCC7A597E259266E7E28A2d0BE0

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim426989762025-12-17 20:35:2042 days ago1766003720IN
0x97b4a6b5...28A2d0BE0
0 MON0.02570718122.4
Claim426936492025-12-17 19:59:4742 days ago1766001587IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426935292025-12-17 19:58:5942 days ago1766001539IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426899352025-12-17 19:35:0042 days ago1766000100IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426877542025-12-17 19:20:2642 days ago1765999226IN
0x97b4a6b5...28A2d0BE0
0 MON0.02322666110.58
Claim426872372025-12-17 19:16:5842 days ago1765999018IN
0x97b4a6b5...28A2d0BE0
0 MON0.02184457104
Claim426871882025-12-17 19:16:3942 days ago1765998999IN
0x97b4a6b5...28A2d0BE0
0 MON0.02790785199.30053369
Claim426862782025-12-17 19:10:3342 days ago1765998633IN
0x97b4a6b5...28A2d0BE0
0 MON0.0140029100
Claim426861822025-12-17 19:09:5542 days ago1765998595IN
0x97b4a6b5...28A2d0BE0
0 MON0.01785369127.5
Claim426860422025-12-17 19:08:5942 days ago1765998539IN
0x97b4a6b5...28A2d0BE0
0 MON0.02334197148.5
Claim426855322025-12-17 19:05:3542 days ago1765998335IN
0x97b4a6b5...28A2d0BE0
0 MON0.01421294101.5
Claim426850912025-12-17 19:02:3842 days ago1765998158IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426850462025-12-17 19:02:2042 days ago1765998140IN
0x97b4a6b5...28A2d0BE0
0 MON0.0140029100
Claim426850222025-12-17 19:02:1142 days ago1765998131IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426850082025-12-17 19:02:0542 days ago1765998125IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426849792025-12-17 19:01:5342 days ago1765998113IN
0x97b4a6b5...28A2d0BE0
0 MON0.01765483102.10004247
Claim426849672025-12-17 19:01:4942 days ago1765998109IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426849662025-12-17 19:01:4842 days ago1765998108IN
0x97b4a6b5...28A2d0BE0
0 MON0.01427591101.9497
Claim426849462025-12-17 19:01:4042 days ago1765998100IN
0x97b4a6b5...28A2d0BE0
0 MON0.6301323,000
Claim426849412025-12-17 19:01:3842 days ago1765998098IN
0x97b4a6b5...28A2d0BE0
0 MON0.02184457104
Resolve426849102025-12-17 19:01:2642 days ago1765998086IN
0x97b4a6b5...28A2d0BE0
0 MON0.02039232104
Sell Yes Via Poo...426846782025-12-17 18:59:5342 days ago1765997993IN
0x97b4a6b5...28A2d0BE0
0 MON0.103103
Sell Yes Via Poo...426846382025-12-17 18:59:3742 days ago1765997977IN
0x97b4a6b5...28A2d0BE0
0 MON0.05565238104.55
Buy Yes Via Pool426845842025-12-17 18:59:1542 days ago1765997955IN
0x97b4a6b5...28A2d0BE0
0 MON0.04070758102
Buy No Via Pool426845582025-12-17 18:59:0542 days ago1765997945IN
0x97b4a6b5...28A2d0BE0
0 MON0.03521027101.94
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x02D41ACb...3d9032F4E
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
PAMM

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, None license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 1 : PAMM.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

abstract contract ERC6909Minimal {
    event OperatorSet(address indexed owner, address indexed operator, bool approved);
    event Approval(
        address indexed owner, address indexed spender, uint256 indexed id, uint256 amount
    );
    event Transfer(
        address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount
    );

    mapping(address => mapping(address => bool)) public isOperator;
    mapping(address => mapping(uint256 => uint256)) public balanceOf;
    mapping(address => mapping(address => mapping(uint256 => uint256))) public allowance;

    function transfer(address receiver, uint256 id, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender][id] -= amount;
        balanceOf[receiver][id] += amount;
        emit Transfer(msg.sender, msg.sender, receiver, id, amount);
        return true;
    }

    function approve(address spender, uint256 id, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender][id] = amount;
        emit Approval(msg.sender, spender, id, amount);
        return true;
    }

    function setOperator(address operator, bool approved) public virtual returns (bool) {
        isOperator[msg.sender][operator] = approved;
        emit OperatorSet(msg.sender, operator, approved);
        return true;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == 0x01ffc9a7 || interfaceId == 0x0f632fb3;
    }

    function _mint(address receiver, uint256 id, uint256 amount) internal virtual {
        balanceOf[receiver][id] += amount;
        emit Transfer(msg.sender, address(0), receiver, id, amount);
    }

    function _burn(address sender, uint256 id, uint256 amount) internal virtual {
        balanceOf[sender][id] -= amount;
        emit Transfer(msg.sender, sender, address(0), id, amount);
    }
}

interface IZAMM {
    struct PoolKey {
        uint256 id0;
        uint256 id1;
        address token0;
        address token1;
        uint256 feeOrHook;
    }

    function pools(uint256 poolId)
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast,
            uint256 price0CumulativeLast,
            uint256 price1CumulativeLast,
            uint256 kLast,
            uint256 supply
        );

    function addLiquidity(
        PoolKey calldata poolKey,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amount0, uint256 amount1, uint256 liquidity);

    function swapExactOut(
        PoolKey calldata poolKey,
        uint256 amountOut,
        uint256 amountInMax,
        bool zeroForOne,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountIn);

    function deposit(address token, uint256 id, uint256 amount) external payable;
    function recoverTransientBalance(address token, uint256 id, address to)
        external
        returns (uint256 amount);
}

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

/*────────────────────────────────────────────────────────
| PredictionAMM (PAMM) — CPMM-backed YES/NO markets
|  • Pool fee = 10 bps (paid to ZAMM with fee switch on)
|  • Pot in HST; PM+ZAMM excluded from payout denominator
|  • Path-fair EV charging via Simpson's rule (fee-aware)
|  • Modified for Monad Testnet with HST collateral
|────────────────────────────────────────────────────────*/
contract PAMM is ERC6909Minimal {
    /*──────── errors ───────*/
    error MarketExists();
    error MarketNotFound();
    error MarketClosed();
    error MarketNotClosed();
    error MarketResolved();
    error MarketNotResolved();
    error OnlyResolver();
    error InvalidResolver();
    error AlreadyResolved();
    error NoWinningShares();
    error AmountZero();
    error InvalidClose();
    error FeeOverflow();
    error PoolNotSeeded();
    error InsufficientLiquidity();
    error SlippageOppIn();
    error InsufficientStt();
    error NoCirculating();
    error NotClosable();
    error SeedBothSides();
    error InvalidReceiver();

    /*──────── storage ──────*/
    struct Market {
        address resolver;
        bool resolved;
        bool outcome; // true=YES wins, false=NO wins
        bool canClose; // resolver can early-close
        uint72 close; // trading close timestamp
        uint256 pot; // HST collateral pool
        uint256 payoutPerShare; // Q-scaled
    }

    uint256 constant Q = 1e18;
    uint256 constant FEE_BPS = 10; // 0.1% pool fee

    // ZAMM singleton - configurable for different networks
    IZAMM public immutable ZAMM;

    // HST collateral token
    IERC20 public immutable HST_TOKEN;

    /*──────── pm-AMM tuning (set once at create) ───────*/
    struct PMTuning {
        uint32 lateRampStart; // seconds before close to start ramp (0 = off)
        uint16 lateRampMaxBps; // +bps at T (applied to EV charge; inverse to refunds)
        uint16 extremeMaxBps; // +bps at extremes p≈0/1 (linear in |p-0.5|)
    }

    mapping(uint256 => PMTuning) public pmTuning;
    mapping(uint256 => bool) public pmTuningFinal;

    error TuningBadCaps();

    event PMTuningSet(uint256 indexed marketId, PMTuning t, bool finalized);

    uint256[] public allMarkets;
    mapping(uint256 id => Market) public markets;
    mapping(uint256 id => uint256) public totalSupply;
    mapping(uint256 id => string) public descriptions;
    mapping(address resolver => uint16) public resolverFeeBps;

    /*──────── events ───────*/
    event Created(
        uint256 indexed marketId, uint256 indexed noId, string description, address resolver
    );
    event Seeded(uint256 indexed marketId, uint256 yesSeed, uint256 noSeed, uint256 liquidity);
    event Bought(address indexed buyer, uint256 indexed id, uint256 sharesOut, uint256 sttIn);
    event Sold(address indexed seller, uint256 indexed id, uint256 sharesIn, uint256 sttOut);

    event Resolved(uint256 indexed marketId, bool outcome);
    event Claimed(address indexed claimer, uint256 indexed id, uint256 shares, uint256 payout);
    event Closed(uint256 indexed marketId, uint256 ts, address indexed by);
    event ResolverFeeSet(address indexed resolver, uint16 bps);

    constructor(address _zamm, address _stt) payable {
        ZAMM = IZAMM(_zamm);
        HST_TOKEN = IERC20(_stt);
    }

    /*──────── id helpers ───*/
    function getMarketId(string calldata description, address resolver)
        public
        pure
        returns (uint256)
    {
        return uint256(keccak256(abi.encodePacked("PMARKET:YES", description, resolver)));
    }

    function getNoId(uint256 marketId) public pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked("PMARKET:NO", marketId)));
    }

    function _poolKey(uint256 yesId, uint256 noId) internal view returns (IZAMM.PoolKey memory k) {
        (uint256 id0, uint256 id1) = (yesId < noId) ? (yesId, noId) : (noId, yesId);
        k = IZAMM.PoolKey({
            id0: id0,
            id1: id1,
            token0: address(this),
            token1: address(this),
            feeOrHook: FEE_BPS
        });
    }

    function _poolId(IZAMM.PoolKey memory k) internal pure returns (uint256 id) {
        id = uint256(keccak256(abi.encode(k.id0, k.id1, k.token0, k.token1, k.feeOrHook)));
    }

    function name(uint256 id) public pure returns (string memory) {
        return string(abi.encodePacked("PAMM-", _toString(id)));
    }

    function symbol(uint256) public pure returns (string memory) {
        return "PAMM";
    }

    /*──────── lifecycle ───*/
    function createMarket(
        string calldata description,
        address resolver,
        uint72 close,
        bool canClose,
        uint256 seedYes,
        uint256 seedNo
    ) public returns (uint256 marketId, uint256 noId) {
        require(close > block.timestamp, InvalidClose());
        require(resolver != address(0), InvalidResolver());

        marketId = getMarketId(description, resolver);
        noId = getNoId(marketId);
        require(markets[marketId].resolver == address(0), MarketExists());

        markets[marketId] = Market({
            resolver: resolver,
            resolved: false,
            outcome: false,
            canClose: canClose,
            close: close,
            pot: 0,
            payoutPerShare: 0
        });

        allMarkets.push(marketId);
        descriptions[marketId] = description;

        emit Created(marketId, noId, description, resolver);

        if (seedYes != 0 || seedNo != 0) {
            require(seedYes != 0 && seedNo != 0, SeedBothSides());
            _seedYesNoPool(marketId, seedYes, seedNo);
        }
    }

    function createMarketWithPMTuning(
        string calldata description,
        address resolver,
        uint72 close,
        bool canClose,
        uint256 seedYes,
        uint256 seedNo,
        PMTuning calldata t
    ) public returns (uint256 marketId, uint256 noId) {
        (marketId, noId) = createMarket(description, resolver, close, canClose, seedYes, seedNo);

        // hard caps to avoid crazy tuning
        if (t.lateRampMaxBps > 2_000 || t.extremeMaxBps > 2_000) revert TuningBadCaps();
        require(t.lateRampStart == 0 || t.lateRampStart <= close, TuningBadCaps());

        pmTuning[marketId] = t;
        pmTuningFinal[marketId] = true; // immutable—no updates allowed / placeholder for future tweaks
        emit PMTuningSet(marketId, t, true);
    }

    function _seedYesNoPool(uint256 marketId, uint256 seedYes, uint256 seedNo) internal {
        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        // Mint seeds to PM (non-circulating; will be held by ZAMM as LP position):
        _mint(address(this), yesId, seedYes);
        totalSupply[yesId] += seedYes;
        _mint(address(this), noId, seedNo);
        totalSupply[noId] += seedNo;

        (uint256 a0, uint256 a1) = (key.id0 == yesId) ? (seedYes, seedNo) : (seedNo, seedYes);
        ZAMM.deposit(address(this), key.id0, a0);
        ZAMM.deposit(address(this), key.id1, a1);

        (uint256 used0, uint256 used1, uint256 liq) =
            ZAMM.addLiquidity(key, a0, a1, 0, 0, address(this), block.timestamp);

        if (used0 < a0) {
            uint256 ret = ZAMM.recoverTransientBalance(address(this), key.id0, address(this));
            _burn(address(this), key.id0, ret);
            totalSupply[key.id0] -= ret;
        }
        if (used1 < a1) {
            uint256 ret = ZAMM.recoverTransientBalance(address(this), key.id1, address(this));
            _burn(address(this), key.id1, ret);
            totalSupply[key.id1] -= ret;
        }

        (uint256 usedYes, uint256 usedNo) = (key.id0 == yesId) ? (used0, used1) : (used1, used0);
        emit Seeded(marketId, usedYes, usedNo, liq);
    }

    function closeMarket(uint256 marketId) public nonReentrant {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(msg.sender == m.resolver, OnlyResolver());
        require(m.canClose, NotClosable());
        require(!m.resolved, MarketResolved());
        require(block.timestamp < m.close, MarketClosed());

        m.close = uint72(block.timestamp);
        emit Closed(marketId, block.timestamp, msg.sender);
    }

    /*──────── path-fair pricing helpers (fee-aware) ─────*/
    function _price1e18(uint256 num, uint256 den) internal pure returns (uint256) {
        return mulDiv(num, Q, den); // floor(num/den * 1e18)
    }

    // YES buy (NO -> YES)
    function _fairChargeYesWithFee(uint256 rYes, uint256 rNo, uint256 yesOut, uint256 feeBps)
        internal
        pure
        returns (uint256 charge)
    {
        uint256 p0 = _price1e18(rNo, rYes + rNo);

        // midpoint (simulate half the output):
        uint256 outHalf = yesOut / 2;
        uint256 inHalf = _getAmountIn(outHalf, rNo, rYes, feeBps);
        uint256 rYesMid = rYes - outHalf;
        uint256 rNoMid = rNo + inHalf;
        uint256 pMid = _price1e18(rNoMid, rYesMid + rNoMid);

        // end (simulate full output):
        uint256 inAll = _getAmountIn(yesOut, rNo, rYes, feeBps);
        uint256 rYesEnd = rYes - yesOut;
        uint256 rNoEnd = rNo + inAll;
        uint256 p1 = _price1e18(rNoEnd, rYesEnd + rNoEnd);

        // Simpson: Δq * (p0 + 4*pMid + p1) / 6:
        uint256 sum = p0 + (pMid << 2) + p1;
        charge = mulDivUp(yesOut, sum, 6 * Q);
    }

    // NO buy (YES -> NO)
    function _fairChargeNoWithFee(uint256 rYes, uint256 rNo, uint256 noOut, uint256 feeBps)
        internal
        pure
        returns (uint256 charge)
    {
        // p0 (EV of NO share = 1 - pYES = rYes/(rYes+rNo))
        uint256 p0 = _price1e18(rYes, rYes + rNo);

        // midpoint:
        uint256 outHalf = noOut / 2;
        uint256 inHalf = _getAmountIn(outHalf, rYes, rNo, feeBps);
        uint256 rNoMid = rNo - outHalf;
        uint256 rYesMid = rYes + inHalf;
        uint256 pMid = _price1e18(rYesMid, rYesMid + rNoMid);

        // end:
        uint256 inAll = _getAmountIn(noOut, rYes, rNo, feeBps);
        uint256 rNoEnd = rNo - noOut;
        uint256 rYesEnd = rYes + inAll;
        uint256 p1 = _price1e18(rYesEnd, rYesEnd + rNoEnd);

        uint256 sum = p0 + (pMid << 2) + p1;
        charge = mulDivUp(noOut, sum, 6 * Q);
    }

    // YES sell (YES -> NO)
    function _fairRefundYesWithFee(uint256 rYes, uint256 rNo, uint256 yesIn, uint256 feeBps)
        internal
        pure
        returns (uint256 refund)
    {
        // p0 = EV of YES share at start = rNo/(rYes+rNo)
        uint256 p0 = mulDiv(rNo, 1e18, rYes + rNo);

        // midpoint (simulate half the input along the SELL path):
        uint256 inHalf = yesIn / 2;
        uint256 outHalf = _getAmountOut(inHalf, rYes, rNo, feeBps);
        uint256 rYesMid = rYes + inHalf;
        uint256 rNoMid = rNo - outHalf;
        uint256 pMid = mulDiv(rNoMid, 1e18, rYesMid + rNoMid);

        // end:
        uint256 outAll = _getAmountOut(yesIn, rYes, rNo, feeBps);
        uint256 rYesEnd = rYes + yesIn;
        uint256 rNoEnd = rNo - outAll;
        uint256 p1 = mulDiv(rNoEnd, 1e18, rYesEnd + rNoEnd);

        // Simpson:
        uint256 sum = p0 + (pMid << 2) + p1;
        refund = mulDiv(yesIn, sum, 6 * 1e18);
    }

    // NO sell (NO -> YES)
    function _fairRefundNoWithFee(uint256 rYes, uint256 rNo, uint256 noIn, uint256 feeBps)
        internal
        pure
        returns (uint256 refund)
    {
        // p0(NO) = 1 - pYES = rYes/(rYes+rNo)
        uint256 p0 = mulDiv(rYes, 1e18, rYes + rNo);

        uint256 inHalf = noIn / 2;
        uint256 outHalf = _getAmountOut(inHalf, rNo, rYes, feeBps);
        uint256 rNoMid = rNo + inHalf;
        uint256 rYesMid = rYes - outHalf;
        uint256 pMid = mulDiv(rYesMid, 1e18, rYesMid + rNoMid);

        uint256 outAll = _getAmountOut(noIn, rNo, rYes, feeBps);
        uint256 rNoEnd = rNo + noIn;
        uint256 rYesEnd = rYes - outAll;
        uint256 p1 = mulDiv(rYesEnd, 1e18, rYesEnd + rNoEnd);

        uint256 sum = p0 + (pMid << 2) + p1;
        refund = mulDiv(noIn, sum, 6 * 1e18);
    }

    function _pmMultBps(uint256 marketId, uint256 rYes, uint256 rNo)
        internal
        view
        returns (uint256 bps)
    {
        PMTuning memory t = pmTuning[marketId];
        if ((t.lateRampStart | t.lateRampMaxBps | t.extremeMaxBps) == 0) return 0;

        // Time ramp (saturating start):
        if (t.lateRampStart != 0) {
            Market storage m = markets[marketId];
            uint256 start = (t.lateRampStart >= m.close) ? 0 : (m.close - t.lateRampStart);
            if (block.timestamp >= m.close) {
                bps += t.lateRampMaxBps;
            } else if (block.timestamp > start) {
                uint256 elapsed = block.timestamp - start;
                bps += (uint256(t.lateRampMaxBps) * elapsed) / t.lateRampStart;
            }
        }

        if (t.extremeMaxBps != 0) {
            uint256 den = rYes + rNo;
            if (den != 0) {
                uint256 p1e18 = mulDiv(rNo, 1e18, den);
                uint256 dist = p1e18 > 5e17 ? (p1e18 - 5e17) : (5e17 - p1e18);
                bps += mulDiv(uint256(t.extremeMaxBps), dist, 5e17);
            }
        }
    }

    /*──────── primary buys (path-fair EV; pot grows) ────*/
    function buyYesViaPool(
        uint256 marketId,
        uint256 yesOut,
        uint256 sttInMax,
        uint256 oppInMax,
        address to
    ) public nonReentrant returns (uint256 sttIn, uint256 oppIn) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(yesOut != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());
        require(yesOut < rYes, InsufficientLiquidity());

        bool zeroForOne = (key.id0 == noId); // NO -> YES if id0 is NO

        // ----- Pool quote (fee-aware, order-invariant): pay NO (rNo) to get YES (rYes)
        uint256 quotedIn = _getAmountIn(yesOut, /*reserveIn=*/ rNo, /*reserveOut=*/ rYes, FEE_BPS);

        // Caller's bound applies to the *raw* quote, not our internal padding:
        require(quotedIn <= oppInMax, SlippageOppIn());

        // Compute a safe internal mint (covers rounding), but never exceed caller's cap:
        uint256 paddedNeeded = mulDivUp(quotedIn, 10_000 + (FEE_BPS * 2 + 3), 10_000) + 5;
        if (paddedNeeded < quotedIn + 3) paddedNeeded = quotedIn + 3;
        uint256 mintIn = paddedNeeded > oppInMax ? oppInMax : paddedNeeded;

        // ----- Path-fair EV charge into pot (fee-aware Simpson):
        sttIn = _fairChargeYesWithFee(rYes, rNo, yesOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttIn = mulDivUp(sttIn, 10_000 + b, 10_000);
        }
        require(sttIn != 0, InsufficientStt());

        // Collect HST:
        require(sttInMax >= sttIn, InsufficientStt());
        HST_TOKEN.transferFrom(msg.sender, address(this), sttIn);
        m.pot += sttIn;

        // Swap via transient balance:
        _mint(address(this), noId, mintIn);
        totalSupply[noId] += mintIn;
        ZAMM.deposit(address(this), noId, mintIn);

        // Let AMM consume up to mintIn; capture the actual input used:
        uint256 actualIn = ZAMM.swapExactOut(key, yesOut, mintIn, zeroForOne, to, block.timestamp);

        // Sweep any unused NO and burn it immediately (keeps supply exact):
        uint256 ret = ZAMM.recoverTransientBalance(address(this), noId, address(this));
        if (ret != 0) {
            _burn(address(this), noId, ret);
            totalSupply[noId] -= ret;
        }

        // Report actual input used (matches quote under identical state):
        oppIn = actualIn;

        emit Bought(to, yesId, yesOut, sttIn);
    }

    function buyNoViaPool(
        uint256 marketId,
        uint256 noOut,
        uint256 sttInMax,
        uint256 oppInMax,
        address to
    ) public nonReentrant returns (uint256 sttIn, uint256 oppIn) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(noOut != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());
        require(noOut < rNo, InsufficientLiquidity());

        bool zeroForOne = (key.id0 == yesId); // YES -> NO if id0 is YES

        // ----- Pool quote (fee-aware, order-invariant): pay YES (rYes) to get NO (rNo):
        uint256 quotedIn = _getAmountIn(noOut, /*reserveIn=*/ rYes, /*reserveOut=*/ rNo, FEE_BPS);

        // Caller's bound applies to the *raw* quote, not our internal padding:
        require(quotedIn <= oppInMax, SlippageOppIn());

        // Compute a safe internal mint (covers rounding), but never exceed caller's cap:
        uint256 paddedNeeded = mulDivUp(quotedIn, 10_000 + (FEE_BPS * 2 + 3), 10_000) + 5;
        if (paddedNeeded < quotedIn + 3) paddedNeeded = quotedIn + 3;
        uint256 mintIn = paddedNeeded > oppInMax ? oppInMax : paddedNeeded;

        // ----- Path-fair EV charge into pot (fee-aware Simpson):
        sttIn = _fairChargeNoWithFee(rYes, rNo, noOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttIn = mulDivUp(sttIn, 10_000 + b, 10_000);
        }
        require(sttIn != 0, InsufficientStt());

        // Collect HST:
        require(sttInMax >= sttIn, InsufficientStt());
        HST_TOKEN.transferFrom(msg.sender, address(this), sttIn);
        m.pot += sttIn;

        _mint(address(this), yesId, mintIn);
        totalSupply[yesId] += mintIn;
        ZAMM.deposit(address(this), yesId, mintIn);

        // Let AMM consume up to mintIn; capture the actual input used:
        uint256 actualIn = ZAMM.swapExactOut(key, noOut, mintIn, zeroForOne, to, block.timestamp);

        // Sweep any unused YES and burn it immediately (keeps supply exact):
        uint256 ret = ZAMM.recoverTransientBalance(address(this), yesId, address(this));
        if (ret != 0) {
            _burn(address(this), yesId, ret);
            totalSupply[yesId] -= ret;
        }

        // Report actual input used (matches quote under identical state):
        oppIn = actualIn;

        emit Bought(to, noId, noOut, sttIn);
    }

    function sellYesViaPool(
        uint256 marketId,
        uint256 yesIn,
        uint256 sttOutMin,
        uint256 oppOutMin,
        address to
    ) public nonReentrant returns (uint256 sttOut, uint256 oppOut) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(yesIn != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());

        bool zeroForOne = (key.id0 == yesId); // YES -> NO if id0 is YES

        // 1) Deterministic pool out (exact-in):
        oppOut = _getAmountOut(yesIn, rYes, rNo, FEE_BPS);
        require(oppOut >= oppOutMin, InsufficientLiquidity());

        // 2) Path-fair EV refund, floored to pot:
        uint256 fair = _fairRefundYesWithFee(rYes, rNo, yesIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }

        uint256 potBal = m.pot;
        sttOut = fair > potBal ? potBal : fair;
        require(sttOut >= sttOutMin, InsufficientStt());

        // 3) Pay refund:
        m.pot = potBal - sttOut;
        HST_TOKEN.transfer(to, sttOut);

        // 4) Debit user's YES and fix totalSupply immediately:
        _burn(msg.sender, yesId, yesIn);
        totalSupply[yesId] -= yesIn;

        // 5) Transient-mint YES to PM, swap to NO out for PM, then sweep:
        _mint(address(this), yesId, yesIn);
        totalSupply[yesId] += yesIn;
        ZAMM.deposit(address(this), yesId, yesIn);
        ZAMM.swapExactOut(
            key,
            oppOut, // exact NO to PM
            yesIn, // cap YES spent
            zeroForOne, // YES -> NO
            address(this),
            block.timestamp
        );
        // Sweep any leftover YES (rounding/slack):
        uint256 retYes = ZAMM.recoverTransientBalance(address(this), yesId, address(this));
        if (retYes != 0) {
            _burn(address(this), yesId, retYes);
            totalSupply[yesId] -= retYes;
        }

        // 6) Burn the NO received from pool (reduce NO supply deterministically):
        _burn(address(this), noId, oppOut);
        totalSupply[noId] -= oppOut;

        emit Sold(msg.sender, yesId, yesIn, sttOut);
        return (sttOut, oppOut);
    }

    function sellNoViaPool(
        uint256 marketId,
        uint256 noIn,
        uint256 sttOutMin,
        uint256 oppOutMin,
        address to
    ) public nonReentrant returns (uint256 sttOut, uint256 oppOut) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(noIn != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());

        bool zeroForOne = (key.id0 == noId); // NO -> YES if id0 is NO

        // 1) Deterministic pool out (exact-in):
        oppOut = _getAmountOut(noIn, rNo, rYes, FEE_BPS);
        require(oppOut >= oppOutMin, InsufficientLiquidity());

        // 2) Path-fair EV refund, floored to pot:
        uint256 fair = _fairRefundNoWithFee(rYes, rNo, noIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }

        uint256 potBal = m.pot;
        sttOut = fair > potBal ? potBal : fair;
        require(sttOut >= sttOutMin, InsufficientStt());

        // 3) Pay refund:
        m.pot = potBal - sttOut;
        HST_TOKEN.transfer(to, sttOut);

        // 4) Debit user's NO and fix totalSupply immediately:
        _burn(msg.sender, noId, noIn);
        totalSupply[noId] -= noIn;

        // 5) Transient-mint NO to PM, swap to YES out for PM, then sweep:
        _mint(address(this), noId, noIn);
        totalSupply[noId] += noIn;
        ZAMM.deposit(address(this), noId, noIn);
        ZAMM.swapExactOut(
            key,
            oppOut, // exact YES to PM
            noIn, // cap NO spent
            zeroForOne, // NO -> YES
            address(this),
            block.timestamp
        );
        uint256 retNo = ZAMM.recoverTransientBalance(address(this), noId, address(this));
        if (retNo != 0) {
            _burn(address(this), noId, retNo);
            totalSupply[noId] -= retNo;
        }

        // 6) Burn the YES received from pool (reduce YES supply deterministically):
        _burn(address(this), yesId, oppOut);
        totalSupply[yesId] -= oppOut;

        emit Sold(msg.sender, noId, noIn, sttOut);
        return (sttOut, oppOut);
    }

    /*──────── resolution / claims ───────*/
    function setResolverFeeBps(uint16 bps) public {
        require(bps <= 1_000, FeeOverflow());
        resolverFeeBps[msg.sender] = bps;
        emit ResolverFeeSet(msg.sender, bps);
    }

    function resolve(uint256 marketId, bool outcome) public nonReentrant {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(msg.sender == m.resolver, OnlyResolver());
        require(!m.resolved, AlreadyResolved());
        require(block.timestamp >= m.close, MarketNotClosed());

        // optional resolver fee:
        uint16 feeBps = resolverFeeBps[m.resolver];
        if (feeBps != 0) {
            uint256 fee = (m.pot * feeBps) / 10_000;
            if (fee != 0) {
                m.pot -= fee;
                HST_TOKEN.transfer(m.resolver, fee);
            }
        }

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        uint256 yesCirc = _circulating(yesId);
        uint256 noCirc = _circulating(noId);

        // ── auto-flip semantics ──
        if (outcome) {
            // resolver chose YES
            if (yesCirc == 0 && noCirc > 0) outcome = false; // flip to NO
        } else {
            // resolver chose NO
            if (noCirc == 0 && yesCirc > 0) outcome = true; // flip to YES
        }

        // If both are zero, we still can't resolve (no winners exist):
        uint256 winningCirc = outcome ? yesCirc : noCirc;
        require(winningCirc != 0, NoCirculating());

        m.payoutPerShare = mulDiv(m.pot, Q, winningCirc);
        m.resolved = true;
        m.outcome = outcome;

        emit Resolved(marketId, outcome);
    }

    function claim(uint256 marketId, address to) public nonReentrant {
        Market storage m = markets[marketId];
        require(m.resolved, MarketNotResolved());

        uint256 winId = m.outcome ? marketId : getNoId(marketId);
        uint256 userShares = balanceOf[msg.sender][winId];
        require(userShares != 0, NoWinningShares());

        uint256 payout = mulDiv(userShares, m.payoutPerShare, Q);

        _burn(msg.sender, winId, userShares);
        totalSupply[winId] -= userShares;

        m.pot -= payout;
        HST_TOKEN.transfer(to, payout);

        emit Claimed(to, winId, userShares, payout);
    }

    /*──────── transfer / transferFrom ───────*/
    function transfer(address receiver, uint256 id, uint256 amount)
        public
        override(ERC6909Minimal)
        returns (bool)
    {
        // Disallow arbitrary parking at PM or ZAMM:
        if (receiver == address(this)) {
            // Only ZAMM may send back residuals to PM, or PM may move internally:
            if (msg.sender != address(this) && msg.sender != address(ZAMM)) {
                revert InvalidReceiver();
            }
        } else if (receiver == address(ZAMM)) {
            // Never allow users to push their own tokens into ZAMM.
            // PM itself also shouldn't "transfer" into ZAMM via this path (it uses deposit + transient mints).
            revert InvalidReceiver();
        }

        return ERC6909Minimal.transfer(receiver, id, amount);
    }

    function transferFrom(address sender, address receiver, uint256 id, uint256 amount)
        public
        returns (bool)
    {
        // Block arbitrary parking at PM or ZAMM, even when ZAMM is the caller:
        if (receiver == address(this)) {
            // Allow only ZAMM to sweep residuals back to PM or PM-internal ops:
            if (msg.sender != address(this) && msg.sender != address(ZAMM)) {
                revert InvalidReceiver();
            }
        } else if (receiver == address(ZAMM)) {
            // Only allow PM-owned tokens to go into ZAMM (transient LP/swaps):
            if (sender != address(this)) {
                revert InvalidReceiver();
            }
        }

        if (msg.sender != sender) {
            // Fast path: allow ZAMM to pull PM-owned balances without SLOADs:
            if (!(sender == address(this) && msg.sender == address(ZAMM))) {
                if (!isOperator[sender][msg.sender]) {
                    uint256 allowed = allowance[sender][msg.sender][id];
                    if (allowed != type(uint256).max) {
                        allowance[sender][msg.sender][id] = allowed - amount;
                    }
                }
            }
        }

        balanceOf[sender][id] -= amount;
        balanceOf[receiver][id] += amount;
        emit Transfer(msg.sender, sender, receiver, id, amount);
        return true;
    }

    /*──────── views & quotes (UX) ───────*/
    function marketCount() public view returns (uint256) {
        return allMarkets.length;
    }

    function tradingOpen(uint256 marketId) public view returns (bool) {
        Market storage m = markets[marketId];
        return m.resolver != address(0) && !m.resolved && block.timestamp < m.close;
    }

    /// Implied YES probability p ≈ rNO / (rYES + rNO)
    function impliedYesProb(uint256 marketId) public view returns (uint256 num, uint256 den) {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        return (rNo, rYes + rNo);
    }

    /// Quote helpers for frontends (fee-aware, path-fair)
    // ---------- BUY QUOTES ----------
    function quoteBuyYes(uint256 marketId, uint256 yesOut)
        public
        view
        returns (
            uint256 oppIn,
            uint256 sttInFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        require(yesOut < rYes && rYes > 0 && rNo > 0, InsufficientLiquidity());

        // Order-invariant: pay NO (rNo) to get YES (rYes):
        oppIn = _getAmountIn(yesOut, /*reserveIn=*/ rNo, /*reserveOut=*/ rYes, FEE_BPS);

        // p0 and p1 for display:
        p0_num = rNo;
        p0_den = rYes + rNo;
        uint256 rYesEnd = rYes - yesOut;
        uint256 rNoEnd = rNo + oppIn;
        p1_num = rNoEnd;
        p1_den = rYesEnd + rNoEnd;

        sttInFair = _fairChargeYesWithFee(rYes, rNo, yesOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttInFair = mulDivUp(sttInFair, 10_000 + b, 10_000);
        }
    }

    function quoteBuyNo(uint256 marketId, uint256 noOut)
        public
        view
        returns (
            uint256 oppIn,
            uint256 sttInFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        require(noOut < rNo && rYes > 0 && rNo > 0, InsufficientLiquidity());

        oppIn = _getAmountIn(noOut, rYes, rNo, FEE_BPS);

        p0_num = rYes;
        p0_den = rYes + rNo;
        uint256 rNoEnd = rNo - noOut;
        uint256 rYesEnd = rYes + oppIn;
        p1_num = rYesEnd;
        p1_den = rYesEnd + rNoEnd;

        sttInFair = _fairChargeNoWithFee(rYes, rNo, noOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttInFair = mulDivUp(sttInFair, 10_000 + b, 10_000);
        }
    }

    // ---------- SELL QUOTES ----------
    function quoteSellYes(uint256 marketId, uint256 yesIn)
        public
        view
        returns (
            uint256 oppOut,
            uint256 sttOutFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        require(yesIn != 0 && rYes > 0 && rNo > 0, InsufficientLiquidity());

        oppOut = _getAmountOut(yesIn, rYes, rNo, FEE_BPS);

        p0_num = rNo; // pYES = rNo / (rYes + rNo)
        p0_den = rYes + rNo;
        uint256 rYesEnd = rYes + yesIn;
        uint256 rNoEnd = rNo - oppOut;
        p1_num = rNoEnd;
        p1_den = rYesEnd + rNoEnd;

        uint256 fair = _fairRefundYesWithFee(rYes, rNo, yesIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }
        uint256 potBal = markets[marketId].pot;
        sttOutFair = fair > potBal ? potBal : fair;
    }

    function quoteSellNo(uint256 marketId, uint256 noIn)
        public
        view
        returns (
            uint256 oppOut,
            uint256 sttOutFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);
        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(noIn != 0 && rYes > 0 && rNo > 0, InsufficientLiquidity());

        oppOut = _getAmountOut(noIn, rNo, rYes, FEE_BPS);

        p0_num = rYes; // pNO = rYes / (rYes + rNo)
        p0_den = rYes + rNo;
        uint256 rNoEnd = rNo + noIn;
        uint256 rYesEnd = rYes - oppOut;
        p1_num = rYesEnd;
        p1_den = rYesEnd + rNoEnd;

        uint256 fair = _fairRefundNoWithFee(rYes, rNo, noIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }
        uint256 potBal = markets[marketId].pot;
        sttOutFair = fair > potBal ? potBal : fair;
    }

    /*──────── view getters (UI & indexing) ───*/
    function getMarket(uint256 marketId)
        public
        view
        returns (
            uint256 yesSupply,
            uint256 noSupply,
            address resolver,
            bool resolved,
            bool outcome,
            uint256 pot,
            uint256 payoutPerShare,
            string memory desc,
            uint72 closeTs,
            bool canClose,
            // AMM extras:
            uint256 rYes,
            uint256 rNo,
            uint256 pYes_num,
            uint256 pYes_den
        )
    {
        Market storage m = markets[marketId];
        resolver = m.resolver;
        resolved = m.resolved;
        outcome = m.outcome;
        pot = m.pot;
        payoutPerShare = m.payoutPerShare;
        desc = descriptions[marketId];
        closeTs = m.close;
        canClose = m.canClose;

        yesSupply = totalSupply[marketId];
        noSupply = totalSupply[getNoId(marketId)];

        if (resolver != address(0)) {
            IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
            (rYes, rNo) = _poolReserves(key, marketId);
            pYes_num = rNo;
            pYes_den = rYes + rNo;
        }
    }

    function getMarkets(uint256 start, uint256 count)
        public
        view
        returns (
            uint256[] memory marketIds,
            uint256[] memory yesSupplies,
            uint256[] memory noSupplies,
            address[] memory resolvers,
            bool[] memory resolved,
            bool[] memory outcome,
            uint256[] memory pot,
            uint256[] memory payoutPerShare,
            string[] memory descs,
            uint72[] memory closes,
            bool[] memory canCloses,
            // AMM extras:
            uint256[] memory rYesArr,
            uint256[] memory rNoArr,
            uint256[] memory pYesNumArr,
            uint256[] memory pYesDenArr,
            uint256 next
        )
    {
        uint256 len = allMarkets.length;
        if (start >= len) {
            return (
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new address[](0),
                new bool[](0),
                new bool[](0),
                new uint256[](0),
                new uint256[](0),
                new string[](0),
                new uint72[](0),
                new bool[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                0
            );
        }

        uint256 end = start + count;
        if (end > len) end = len;
        uint256 n = end - start;

        marketIds = new uint256[](n);
        yesSupplies = new uint256[](n);
        noSupplies = new uint256[](n);
        resolvers = new address[](n);
        resolved = new bool[](n);
        outcome = new bool[](n);
        pot = new uint256[](n);
        payoutPerShare = new uint256[](n);
        descs = new string[](n);
        closes = new uint72[](n);
        canCloses = new bool[](n);
        rYesArr = new uint256[](n);
        rNoArr = new uint256[](n);
        pYesNumArr = new uint256[](n);
        pYesDenArr = new uint256[](n);

        uint256 id;
        uint256 noId;

        for (uint256 j; j != n; ++j) {
            id = allMarkets[start + j];
            Market storage m = markets[id];
            marketIds[j] = id;
            yesSupplies[j] = totalSupply[id];
            noId = getNoId(id);
            noSupplies[j] = totalSupply[noId];
            resolvers[j] = m.resolver;
            resolved[j] = m.resolved;
            outcome[j] = m.outcome;
            pot[j] = m.pot;
            payoutPerShare[j] = m.payoutPerShare;
            descs[j] = descriptions[id];
            closes[j] = m.close;
            canCloses[j] = m.canClose;

            if (m.resolver != address(0)) {
                IZAMM.PoolKey memory key = _poolKey(id, noId);
                (rYesArr[j], rNoArr[j]) = _poolReserves(key, id);
                pYesNumArr[j] = rNoArr[j];
                pYesDenArr[j] = rYesArr[j] + rNoArr[j];
            }
        }

        next = (end < len) ? end : 0;
    }

    function getUserMarkets(address user, uint256 start, uint256 count)
        public
        view
        returns (
            uint256[] memory yesIds,
            uint256[] memory noIds,
            uint256[] memory yesBalances,
            uint256[] memory noBalances,
            uint256[] memory claimables,
            bool[] memory isResolved,
            bool[] memory tradingOpen_,
            uint256 next
        )
    {
        uint256 len = allMarkets.length;
        if (start >= len) {
            return (
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new bool[](0),
                new bool[](0),
                0
            );
        }

        uint256 end = start + count;
        if (end > len) end = len;
        uint256 n = end - start;

        yesIds = new uint256[](n);
        noIds = new uint256[](n);
        yesBalances = new uint256[](n);
        noBalances = new uint256[](n);
        claimables = new uint256[](n);
        isResolved = new bool[](n);
        tradingOpen_ = new bool[](n);

        uint256 yId;
        uint256 nId;
        uint256 yBal;
        uint256 nBal;
        bool res;

        for (uint256 j; j != n; ++j) {
            yId = allMarkets[start + j];
            nId = getNoId(yId);
            Market storage m = markets[yId];

            yesIds[j] = yId;
            noIds[j] = nId;

            yBal = balanceOf[user][yId];
            nBal = balanceOf[user][nId];
            yesBalances[j] = yBal;
            noBalances[j] = nBal;

            res = m.resolved;
            isResolved[j] = res;
            tradingOpen_[j] = (m.resolver != address(0) && !res && block.timestamp < m.close);

            if (res) {
                uint256 pps = m.payoutPerShare; // Q-scaled
                uint256 winBal = m.outcome ? yBal : nBal;
                claimables[j] = (pps == 0) ? 0 : mulDiv(winBal, pps, Q);
            }
        }

        next = (end < len) ? end : 0;
    }

    function winningId(uint256 marketId) public view returns (uint256 id) {
        Market storage m = markets[marketId];
        if (m.resolver == address(0)) return 0;
        if (!m.resolved) return 0;
        if (m.payoutPerShare == 0) return 0;
        return m.outcome ? marketId : getNoId(marketId);
    }

    function getPool(uint256 marketId)
        public
        view
        returns (
            uint256 poolId,
            uint256 rYes,
            uint256 rNo,
            uint32 tsLast,
            uint256 kLast,
            uint256 lpSupply
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        poolId = _poolId(key);
        (uint112 r0, uint112 r1, uint32 t,,, uint256 k, uint256 s) = ZAMM.pools(poolId);
        if (key.id0 == marketId) {
            rYes = r0;
            rNo = r1;
        } else {
            rYes = r1;
            rNo = r0;
        }
        tsLast = t;
        kLast = k;
        lpSupply = s;
    }

    /*──────── internals ───*/
    function _circulating(uint256 id) internal view returns (uint256 c) {
        c = totalSupply[id];
        unchecked {
            c -= balanceOf[address(this)][id]; // exclude PM
            c -= balanceOf[address(ZAMM)][id]; // exclude ZAMM
        }
    }

    function _poolReserves(IZAMM.PoolKey memory key, uint256 yesId)
        internal
        view
        returns (uint256 rYes, uint256 rNo)
    {
        (uint112 r0, uint112 r1,,,,,) = ZAMM.pools(_poolId(key));
        if (key.id0 == yesId) {
            rYes = uint256(r0);
            rNo = uint256(r1);
        } else {
            rYes = uint256(r1);
            rNo = uint256(r0);
        }
    }

    function _getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, uint256 feeBps)
        internal
        pure
        returns (uint256 amountIn)
    {
        if (amountOut == 0) return 0;
        uint256 numerator = reserveIn * amountOut * 10000;
        uint256 denominator = (reserveOut - amountOut) * (10000 - feeBps);
        amountIn = (numerator / denominator) + 1;
    }

    function _getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, uint256 feeBps)
        internal
        pure
        returns (uint256 amountOut)
    {
        uint256 amountInWithFee = amountIn * (10000 - feeBps);
        uint256 numerator = amountInWithFee * reserveOut;
        uint256 denominator = reserveIn * 10000 + amountInWithFee;
        amountOut = numerator / denominator;
    }

    /*──────── utils ───────*/
    function _toString(uint256 value) internal pure returns (string memory result) {
        assembly ("memory-safe") {
            result := add(mload(0x40), 0x80)
            mstore(0x40, add(result, 0x20))
            mstore(result, 0)
            let end := result
            let w := not(0)
            for { let temp := value } 1 {} {
                result := add(result, w)
                mstore8(result, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }
            let n := sub(end, result)
            result := sub(result, 0x20)
            mstore(result, n)
        }
    }

    /*──────── reentrancy ─*/
    error Reentrancy();

    uint256 constant REENTRANCY_GUARD_SLOT = 0x929eee149b4bd21268;

    modifier nonReentrant() {
        assembly ("memory-safe") {
            if tload(REENTRANCY_GUARD_SLOT) {
                mstore(0x00, 0xab143c06)
                revert(0x1c, 0x04)
            }
            tstore(REENTRANCY_GUARD_SLOT, address())
        }
        _;
        assembly ("memory-safe") {
            tstore(REENTRANCY_GUARD_SLOT, 0)
        }
    }
}

/*────────────────────────────────────────────────────────
| mulDiv helper (Solady)
|────────────────────────────────────────────────────────*/
error MulDivFailed();

function mulDiv(uint256 x, uint256 y, uint256 d) pure returns (uint256 z) {
    assembly ("memory-safe") {
        z := mul(x, y)
        if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {
            mstore(0x00, 0xad251c27)
            revert(0x1c, 0x04)
        }
        z := div(z, d)
    }
}

function mulDivUp(uint256 x, uint256 y, uint256 d) pure returns (uint256 z) {
    assembly ("memory-safe") {
        z := mul(x, y)
        if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {
            mstore(0x00, 0xad251c27)
            revert(0x1c, 0x04)
        }
        z := add(iszero(iszero(mod(z, d))), div(z, d))
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_zamm","type":"address"},{"internalType":"address","name":"_stt","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AlreadyResolved","type":"error"},{"inputs":[],"name":"AmountZero","type":"error"},{"inputs":[],"name":"FeeOverflow","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientStt","type":"error"},{"inputs":[],"name":"InvalidClose","type":"error"},{"inputs":[],"name":"InvalidReceiver","type":"error"},{"inputs":[],"name":"InvalidResolver","type":"error"},{"inputs":[],"name":"MarketClosed","type":"error"},{"inputs":[],"name":"MarketExists","type":"error"},{"inputs":[],"name":"MarketNotClosed","type":"error"},{"inputs":[],"name":"MarketNotFound","type":"error"},{"inputs":[],"name":"MarketNotResolved","type":"error"},{"inputs":[],"name":"MarketResolved","type":"error"},{"inputs":[],"name":"NoCirculating","type":"error"},{"inputs":[],"name":"NoWinningShares","type":"error"},{"inputs":[],"name":"NotClosable","type":"error"},{"inputs":[],"name":"OnlyResolver","type":"error"},{"inputs":[],"name":"PoolNotSeeded","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"SeedBothSides","type":"error"},{"inputs":[],"name":"SlippageOppIn","type":"error"},{"inputs":[],"name":"TuningBadCaps","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sttIn","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"},{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"Closed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"noId","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"OperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"components":[{"internalType":"uint32","name":"lateRampStart","type":"uint32"},{"internalType":"uint16","name":"lateRampMaxBps","type":"uint16"},{"internalType":"uint16","name":"extremeMaxBps","type":"uint16"}],"indexed":false,"internalType":"struct PAMM.PMTuning","name":"t","type":"tuple"},{"indexed":false,"internalType":"bool","name":"finalized","type":"bool"}],"name":"PMTuningSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"outcome","type":"bool"}],"name":"Resolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"resolver","type":"address"},{"indexed":false,"internalType":"uint16","name":"bps","type":"uint16"}],"name":"ResolverFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"yesSeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"noSeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"Seeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sttOut","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"HST_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZAMM","outputs":[{"internalType":"contract IZAMM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allMarkets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noOut","type":"uint256"},{"internalType":"uint256","name":"sttInMax","type":"uint256"},{"internalType":"uint256","name":"oppInMax","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"buyNoViaPool","outputs":[{"internalType":"uint256","name":"sttIn","type":"uint256"},{"internalType":"uint256","name":"oppIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesOut","type":"uint256"},{"internalType":"uint256","name":"sttInMax","type":"uint256"},{"internalType":"uint256","name":"oppInMax","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"buyYesViaPool","outputs":[{"internalType":"uint256","name":"sttIn","type":"uint256"},{"internalType":"uint256","name":"oppIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"closeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint72","name":"close","type":"uint72"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint256","name":"seedYes","type":"uint256"},{"internalType":"uint256","name":"seedNo","type":"uint256"}],"name":"createMarket","outputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint72","name":"close","type":"uint72"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint256","name":"seedYes","type":"uint256"},{"internalType":"uint256","name":"seedNo","type":"uint256"},{"components":[{"internalType":"uint32","name":"lateRampStart","type":"uint32"},{"internalType":"uint16","name":"lateRampMaxBps","type":"uint16"},{"internalType":"uint16","name":"extremeMaxBps","type":"uint16"}],"internalType":"struct PAMM.PMTuning","name":"t","type":"tuple"}],"name":"createMarketWithPMTuning","outputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"descriptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getMarket","outputs":[{"internalType":"uint256","name":"yesSupply","type":"uint256"},{"internalType":"uint256","name":"noSupply","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"bool","name":"outcome","type":"bool"},{"internalType":"uint256","name":"pot","type":"uint256"},{"internalType":"uint256","name":"payoutPerShare","type":"uint256"},{"internalType":"string","name":"desc","type":"string"},{"internalType":"uint72","name":"closeTs","type":"uint72"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint256","name":"rYes","type":"uint256"},{"internalType":"uint256","name":"rNo","type":"uint256"},{"internalType":"uint256","name":"pYes_num","type":"uint256"},{"internalType":"uint256","name":"pYes_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"resolver","type":"address"}],"name":"getMarketId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getMarkets","outputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"},{"internalType":"uint256[]","name":"yesSupplies","type":"uint256[]"},{"internalType":"uint256[]","name":"noSupplies","type":"uint256[]"},{"internalType":"address[]","name":"resolvers","type":"address[]"},{"internalType":"bool[]","name":"resolved","type":"bool[]"},{"internalType":"bool[]","name":"outcome","type":"bool[]"},{"internalType":"uint256[]","name":"pot","type":"uint256[]"},{"internalType":"uint256[]","name":"payoutPerShare","type":"uint256[]"},{"internalType":"string[]","name":"descs","type":"string[]"},{"internalType":"uint72[]","name":"closes","type":"uint72[]"},{"internalType":"bool[]","name":"canCloses","type":"bool[]"},{"internalType":"uint256[]","name":"rYesArr","type":"uint256[]"},{"internalType":"uint256[]","name":"rNoArr","type":"uint256[]"},{"internalType":"uint256[]","name":"pYesNumArr","type":"uint256[]"},{"internalType":"uint256[]","name":"pYesDenArr","type":"uint256[]"},{"internalType":"uint256","name":"next","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getNoId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getPool","outputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"rYes","type":"uint256"},{"internalType":"uint256","name":"rNo","type":"uint256"},{"internalType":"uint32","name":"tsLast","type":"uint32"},{"internalType":"uint256","name":"kLast","type":"uint256"},{"internalType":"uint256","name":"lpSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getUserMarkets","outputs":[{"internalType":"uint256[]","name":"yesIds","type":"uint256[]"},{"internalType":"uint256[]","name":"noIds","type":"uint256[]"},{"internalType":"uint256[]","name":"yesBalances","type":"uint256[]"},{"internalType":"uint256[]","name":"noBalances","type":"uint256[]"},{"internalType":"uint256[]","name":"claimables","type":"uint256[]"},{"internalType":"bool[]","name":"isResolved","type":"bool[]"},{"internalType":"bool[]","name":"tradingOpen_","type":"bool[]"},{"internalType":"uint256","name":"next","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"impliedYesProb","outputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"bool","name":"outcome","type":"bool"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint72","name":"close","type":"uint72"},{"internalType":"uint256","name":"pot","type":"uint256"},{"internalType":"uint256","name":"payoutPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pmTuning","outputs":[{"internalType":"uint32","name":"lateRampStart","type":"uint32"},{"internalType":"uint16","name":"lateRampMaxBps","type":"uint16"},{"internalType":"uint16","name":"extremeMaxBps","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pmTuningFinal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noOut","type":"uint256"}],"name":"quoteBuyNo","outputs":[{"internalType":"uint256","name":"oppIn","type":"uint256"},{"internalType":"uint256","name":"sttInFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesOut","type":"uint256"}],"name":"quoteBuyYes","outputs":[{"internalType":"uint256","name":"oppIn","type":"uint256"},{"internalType":"uint256","name":"sttInFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noIn","type":"uint256"}],"name":"quoteSellNo","outputs":[{"internalType":"uint256","name":"oppOut","type":"uint256"},{"internalType":"uint256","name":"sttOutFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesIn","type":"uint256"}],"name":"quoteSellYes","outputs":[{"internalType":"uint256","name":"oppOut","type":"uint256"},{"internalType":"uint256","name":"sttOutFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"bool","name":"outcome","type":"bool"}],"name":"resolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"resolverFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noIn","type":"uint256"},{"internalType":"uint256","name":"sttOutMin","type":"uint256"},{"internalType":"uint256","name":"oppOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"sellNoViaPool","outputs":[{"internalType":"uint256","name":"sttOut","type":"uint256"},{"internalType":"uint256","name":"oppOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesIn","type":"uint256"},{"internalType":"uint256","name":"sttOutMin","type":"uint256"},{"internalType":"uint256","name":"oppOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"sellYesViaPool","outputs":[{"internalType":"uint256","name":"sttOut","type":"uint256"},{"internalType":"uint256","name":"oppOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setResolverFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"winningId","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"}]

0x60c0601f614bb138819003918201601f19168301916001600160401b038311848410176100fb5780849260409485528339810103126100f75761004d60206100468361010f565b920161010f565b6001600160a01b039182166080521660a052604051614a8d90816101248239608051818181610365015281816103a6015281816103d7015281816107d8015281816114fd015281816117bb015281816120670152818161290701528181612938015281816129bd015281816135bf015281816142a50152614977015260a05181818161075801528181610e780152818161149601528181611aae01528181611e1e01526120010152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100f75756fe610360806040526004361015610013575f80fd5b5f905f3560e01c908162ad800c14612b3057508062fdd58e14612aec57806301ffc9a714612a97578063068bcd8d14612975578063095bcdb6146128565780630f4016b01461276c57806316ac2b901461264a578063181c7f661461262c5780631e937fc214612458578063399f1a12146123aa5780634076ac511461238c578063426a8493146123125780634d5e9db0146122d65780634e41a1fb1461226a5780634e441bda1461220d5780634efef1d014611eb657806352a34b0514611c4c57806352d84d1e14611c12578063558a729714611b8257806359152b8214611b35578063598af9e714611add5780636ddb76f114611a985780637f8b182114611a4f57806380968d48146117ea5780638743a669146117a55780639595636914611350578063ae4180951461123b578063b0953d671461120c578063b1283e771461118f578063b33aad2d1461112a578063b6363cf2146110d3578063bd85b039146110a9578063bdd305a614610f8c578063c90bd92114610f4f578063ddd5e1b214610d6c578063e6f859e714610d2d578063eb44fdd314610bef578063ec97908214610bd1578063f0cca67b14610af5578063f4d197ac14610629578063fb105091146105a6578063fc78909f146104425763fe99049a146101f6575f80fd5b3461043f57608036600319011261043f5761020f612bde565b610217612bf4565b604435926001600160a01b0390911691606435903084036103d55730331415806103a2575b610393575f516020614a6d5f395f51905f529160406102c1925b6001600160a01b031694338690036102cf575b8581526001602052818120888252602052818120610288848254612ef7565b90558681526001602052818120888252602052206102a7828254612eea565b905560408051338152602081019290925290918291820190565b0390a4602060405160018152f35b30861480610361575b610269578581526020818152828220335f90815291528290205460ff166102695785815260026020908152828220335f908152908252839020898352905281812054836001820161032b575b5050610269565b61033491612ef7565b868252600260205282822060018060a01b0333165f52602052825f20898352602052828220555f83610324565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146102d8565b631e4ec46b60e01b8352600483fd5b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141561023c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168414610420575b5f516020614a6d5f395f51905f529160406102c192610256565b6001600160a01b038116301461040657631e4ec46b60e01b8352600483fd5b80fd5b503461043f5761045136612c34565b9161046d82610468610462826132af565b826141c4565b61427c565b9390928115158061059d575b80610594575b156105855761048f848684614704565b9261049a8686612eea565b906104a58488612eea565b926104d06104c86104c06104b9898b612ef7565b9687612eea565b968a8a6149b2565b98888361447d565b80610534575b5081526006602052604090206001015494959394610528948181111561052c5750955b604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b0390f35b9050956104f9565b61271001806127101161057157806127108a0299612710818c0414901517021561056457909704966105286104d6565b63ad251c2783526004601cfd5b634e487b7160e01b83526011600452602483fd5b63bb55fd2760e01b8352600483fd5b5084151561047f565b50831515610479565b503461043f57602036600319011261043f5760043561ffff8116809103610625576103e88111610616573382526009602052604082208161ffff198254161790556040519081527ffc0ef2a6f22017eb94ef2ccd5c1e26a73755192f425c5dc589c62105cccaf24c60203392a280f35b6340c0d6e560e11b8252600482fd5b5080fd5b503461043f5761063836612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081610acc575b5015610abe578115610aaf57610699836132af565b906106a482856141c4565b976106af858a61427c565b929080151580610aa6575b15610a9757868b5114936106cf818389614704565b998a10610a8857806106e5886106ec938561476b565b928961447d565b80610a3a575b5090600101908154908181115f14610a34575080995b8a10610a2557610753926020926107208c8094612ef7565b905560405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b0381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610a1a576109ed575b50610799838533614908565b8385526007602052604085206107b0848254612ef7565b90556107bd8385306148c3565b8385526007602052604085206107d4848254612eea565b90557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031697883b156109de57604051630efe6a8b60e01b815230600482015260248101869052604481018590528681606481838e5af180156109e2579087916109c9575b505061086a9160209160405193849283926338c3f8db60e01b84524291898d309360048801613b0f565b0381888c5af180156109be5761098f575b5060206040518098635323fe1560e11b825281878161089f308a3060048501613b84565b03925af1801561098457849061094d575b6040975080610924575b506108c6858230614908565b835260076020528583206108db858254612ef7565b905585519081528460208201527fe029f26dbcf8c42dd2f352c10214a7fc26773dc62482c6241334a0402ac09a80863392a368929eee149b4bd212685d82519182526020820152f35b61092f818530614908565b8385526007602052610945888620918254612ef7565b90555f6108ba565b506020873d60201161097c575b8161096760209383612dc6565b8101031261097857604096516108b0565b5f80fd5b3d915061095a565b6040513d86823e3d90fd5b6020813d6020116109b6575b816109a860209383612dc6565b81010312610978575161087b565b3d915061099b565b6040513d87823e3d90fd5b816109d391612dc6565b6109de57855f610840565b8580fd5b6040513d89823e3d90fd5b610a0e9060203d602011610a13575b610a068183612dc6565b810190613af7565b61078d565b503d6109fc565b6040513d88823e3d90fd5b63396038e360e21b8852600488fd5b99610708565b61271001908161271011610a745781612710820291612710818404149015170215610a67570460016106f2565b63ad251c2789526004601cfd5b634e487b7160e01b89526011600452602489fd5b63bb55fd2760e01b8952600489fd5b6313b0827d60e31b8852600488fd5b508315156106ba565b6365e52d5160e11b8452600484fd5b62b5f6bf60e41b8452600484fd5b905060b81c42105f610684565b6307db1be560e41b8552600485fd5b63ab143c0683526004601cfd5b503461043f57610b0436612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080549092906001600160a01b03811615610ad95760ff8160a01c16159081610bc4575b5015610abe578115610aaf57610b68816132af565b92610b7384836141c4565b97610b7e838a61427c565b929080151580610bbb575b15610a9757868b511493610b9e828289614704565b998a10610a885780610bb4886106ec93856149b2565b928761447d565b50831515610b89565b905060b81c42105f610b53565b503461043f578060031936011261043f576020600554604051908152f35b503461043f57602036600319011261043f576004359080818283918585526006602052604085209384549460018060a01b0386169060026001820154910154908989526008602052610c4360408a20612de8565b928a8a5260076020526040808b20549a610c5c8d6132af565b8152600760205220549a81610cf2575b509160ff9391610cbf936040519c8d9c8d5260208d015260408c0152848a60a01c16151560608c0152848a60a81c16151560808c015260a08b015260c08a01526101c060e08a01526101c0890190612bba565b958060b81c61010089015260b01c1615156101208701526101408601526101608501526101808401526101a08301520390f35b909750610cbf929650610d1291955060ff939450610468610462826132af565b958695919491610d228787612eea565b989193509193610c6c565b503461043f57602036600319011261043f57610d586040610528926004358152600860205220612de8565b604051918291602083526020830190612bba565b503461043f57604036600319011261043f57600435610d89612bf4565b9068929eee149b4bd212685c610ae8573068929eee149b4bd212685d80835260066020526040832090815460ff8160a01c1615610f405760a81c60ff1615610f3157915b3384526001602052604084208385526020526040842054918215610f22576002810154670de0b6b3a764000081850291858304140215610f1557670de0b6b3a76400006001910491610e20858733614908565b858752600760205260408720610e37868254612ef7565b905501610e45828254612ef7565b905560405163a9059cbb60e01b81526001600160a01b0383166004820152602481018290529160208380604481010381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610a1a577f9cdcf2f7714cca3508c7f0110b04a90a80a3a8dd0e35de99689db74d28c5383e93604093610ef8575b50825194855260208501526001600160a01b031692a38068929eee149b4bd212685d80f35b610f109060203d602011610a1357610a068183612dc6565b610ed3565b63ad251c2786526004601cfd5b63843f941b60e01b8552600485fd5b610f3a906132af565b91610dcd565b63174b639360e11b8552600485fd5b503461043f57602036600319011261043f576040610f80610f78600435610468610462826132af565b809291612eea565b82519182526020820152f35b503461043f57610f9b36612c34565b610fab82610468610462826132af565b8083929310806110a0575b80611097575b1561108857610fcc818484614332565b92610fd78282612eea565b9061100c610fe58585612ef7565b9382611006610ffe610ff78a84612eea565b9788612eea565b97838361487c565b9861447d565b80611049575b5061052894959650604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271096919601968761271011611074575061052894959661106a9161468d565b949350855f611012565b634e487b7160e01b81526011600452602490fd5b63bb55fd2760e01b8552600485fd5b50801515610fbc565b50821515610fb6565b503461043f57602036600319011261043f5760406020916004358152600783522054604051908152f35b503461043f57604036600319011261043f5760406110ef612bde565b916110f8612bf4565b9260018060a01b0316815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461043f57602036600319011261043f576004358152600660209081526040909120546001600160a01b0381161515908161117f575b81611172575b506040519015158152f35b905060b81c42105f611167565b905060ff8160a01c161590611161565b503461043f57602036600319011261043f57604060e091600435815260066020522080549060026001820154910154906040519260018060a01b038116845260ff8160a01c161515602085015260ff8160a81c161515604085015260ff8160b01c161515606085015260b81c608084015260a083015260c0820152f35b503461043f57602036600319011261043f5760ff60406020926004358152600484522054166040519015158152f35b503461043f57602036600319011261043f5760043568929eee149b4bd212685c611343573068929eee149b4bd212685d80825260066020526040822080546001600160a01b0381168015610ad95733036113345760ff8160b01c16156113255760ff8160a01c166113165760b81c4210156113085780546001600160b81b03164260b81b6001600160b81b031916179055604051904282527f785f63ccac8ab83aff1730b2462e4c5437bf3b1dbc6f8c243a20e3efb9af9d5260203393a38068929eee149b4bd212685d80f35b62b5f6bf60e41b8352600483fd5b6355e8cb5f60e01b8452600484fd5b6374c77f3b60e01b8452600484fd5b632b910d6d60e11b8452600484fd5b63ab143c0682526004601cfd5b503461043f5761135f36612d14565b939094919268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081611798575b5015610abe578115610aaf576113c0836132af565b6113ca81856141c4565b916113d5858461427c565b9190978815158061178f575b15610a97578886101561178057838551149a6113fe8a8589614332565b8181116117715761140e816146af565b906005820180921161175d57816003820180921161174957908061145294939210611741575b50818111156117395750935b61144b88828d6143e9565b9a8961447d565b80611717575b508815610a25578811611708576040516323b872dd60e01b8152336004820152306024820152604481018990526020816064818b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af180156116e05790600192916116eb575b50016114d5888254612eea565b90556114e28183306148c3565b8186526007602052604086206114f9828254612eea565b90557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b156116dc57604051630efe6a8b60e01b81523060048201526024810184905260448101839052878160648183895af180156116e0576116c7575b509860209161158d8a9b60409b9a9b519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b038188865af19586156109be578596611693575b5060206040518093635323fe1560e11b82528188816115c530883060048501613b84565b03925af19182156109be57859261165e575b506040978289927fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc5394611635575b50508151938452602084018890526001600160a01b031692a368929eee149b4bd212685d82519182526020820152f35b611640828230614908565b87526007602052611655838820918254612ef7565b90555f80611605565b9091506020813d60201161168b575b8161167a60209383612dc6565b8101031261097857519060406115d7565b3d915061166d565b9095506020813d6020116116bf575b816116af60209383612dc6565b810103126109785751945f6115a1565b3d91506116a2565b6116d2888092612dc6565b6116dc575f611562565b8680fd5b6040513d8a823e3d90fd5b6117039060203d602011610a1357610a068183612dc6565b6114c8565b63396038e360e21b8752600487fd5b61271099919901908161271011610a7457906117329161468d565b975f611458565b905093611440565b90505f611434565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8b52601160045260248bfd5b638e6e832560e01b8a5260048afd5b63bb55fd2760e01b8852600488fd5b508215156113e1565b905060b81c42105f6113ab565b503461043f578060031936011261043f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043f576118026117fc36612c34565b90613c1a565b6101405161016051610180516101a0516101c0516101e05196610300516102005161022051610240516102605161028051906118876102a0516118756102c0516118636102e051604051608052610200608051526102006080510190612cac565b90608051820360206080510152612cac565b90608051820360406080510152612cac565b60805181036060608051015260208084519283815201930190885b818110611a30575050506118f1926118cd6119039695936118df936080518203608080510152612cdf565b90608051820360a06080510152612cdf565b90608051820360c06080510152612cac565b90608051820360e06080510152612cac565b60805181036101006080510152815180825260208201916020808360051b83010194019285915b838310611a00575050505050608051810361012060805101526020808a5192838152019901915b8181106119e157505050916119956119a8926119826119ce98996119bb979660805182036101406080510152612cdf565b9060805182036101606080510152612cac565b9060805182036101806080510152612cac565b9060805182036101a06080510152612cac565b9060805182036101c06080510152612cac565b906101e060805101526080519003608051f35b82516001600160481b03168a526020998a019990920191600101611951565b909192939594602080611a1f600193601f198682030187528a51612bba565b97980195949190910192019061192a565b82516001600160a01b03168552602094850194909201916001016118a2565b503461043f57602036600319011261043f57604060609160043581526003602052205461ffff6040519163ffffffff81168352818160201c16602084015260301c166040820152f35b503461043f578060031936011261043f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043f57606036600319011261043f576040602091611afc612bde565b611b04612bf4565b6001600160a01b0391821683526002855283832091165f908152908452829020604435825283522054604051908152f35b503461043f57604036600319011261043f576004359067ffffffffffffffff821161043f576020611b7a611b6c3660048601612c4a565b611b74612bf4565b91613bc5565b604051908152f35b503461043f57604036600319011261043f57611b9c612bde565b6040611ba6612c9d565b92338152806020522060018060a01b0382165f5260205260405f209115159160ff1981541660ff841617905560405191825260018060a01b0316907fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b503461043f57602036600319011261043f576004359060055482101561043f576020611c3d83612d46565b90549060031b1c604051908152f35b503461043f57604036600319011261043f57600435611c69612c9d565b68929eee149b4bd212685c610ae8573068929eee149b4bd212685d818352600660205260408320805482906001600160a01b038116908115611ea757813303611e985760ff8160a01c16611e895760b81c4210611e7a57808652600960205261ffff60408720541680611de6575b5050611ce2846132af565b90611cf5611cef86614947565b92614947565b9015611dc757811580611dbe575b611db6575b8315611daf57505b8015611da057600182015481670de0b6b3a7640000820291670de0b6b3a7640000818404149015170215610f1557046002820155805461ffff60a01b191682151560a81b60ff60a81b1617600160a01b1790557fe940c2f4a2e1dda6ea582b576e35520a2ec6b80e436c26962c1150ddd7d07993906020906040519015158152a28068929eee149b4bd212685d80f35b63338aa79560e21b8552600485fd5b9050611d10565b859350611d08565b50801515611d03565b801580611ddd575b15611d085760019350611d08565b50811515611dcf565b6001840191612710611dfa84549384613ae4565b049081611e09575b5050611cd7565b611e199361072083602095612ef7565b0381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610a1a57611e5b575b808080611e02565b611e739060203d602011610a1357610a068183612dc6565b505f611e53565b63a8a9eb6960e01b8652600486fd5b6336ab81e160e11b8752600487fd5b632b910d6d60e11b8752600487fd5b6307db1be560e41b8752600487fd5b503461097857611ec536612d14565b949193909268929eee149b4bd212685c612200573068929eee149b4bd212685d5f82815260066020526040902080546001600160a01b038116156121f15760ff8160a01c161590816121e4575b50156121d65781156121c757611f27836132af565b92611f3284826141c4565b95611f3d828861427c565b939098891515806121be575b156121af57848610156121a0578389511492611f66868c89614332565b9581871161219157611f77876146af565b966005880180981161216d5787906003810180911161216d5782611fbc948f9a93838d94611fb59610612189575b508181111561218157509961487c565b9b8661447d565b8061214d575b50891561213e57891161213e576040516323b872dd60e01b8152336004820152306024820152604481018a9052906020826064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af191821561211657600192612121575b500161203f898254612eea565b905561204c8383306148c3565b815f52600760205260405f20612063848254612eea565b90557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561097857604051630efe6a8b60e01b81523060048201526024810184905260448101829052975f8960648183895af1988915612116578b996120f7575b509061158d602093926040519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b602093929198505f61210891612dc6565b61158d5f98919293506120d0565b6040513d5f823e3d90fd5b6121399060203d602011610a1357610a068183612dc6565b612032565b63396038e360e21b5f5260045ffd5b6127109a919a01806127101161216d576121669161468d565b985f611fc2565b634e487b7160e01b5f52601160045260245ffd5b90509961487c565b90505f611fa5565b638e6e832560e01b5f5260045ffd5b63bb55fd2760e01b5f5260045ffd5b6313b0827d60e31b5f5260045ffd5b50841515611f49565b6365e52d5160e11b5f5260045ffd5b62b5f6bf60e41b5f5260045ffd5b905060b81c42105f611f12565b6307db1be560e41b5f5260045ffd5b63ab143c065f526004601cfd5b346109785760c03660031901126109785760043567ffffffffffffffff811161097857610f806122436040923690600401612c4a565b9061224c612bf4565b612254612c78565b61225c612c8e565b9160a43594608435946132e1565b3461097857602036600319011261097857604051604081019080821067ffffffffffffffff8311176122c25761052891604052600481526350414d4d60e01b6020820152604051918291602083526020830190612bba565b634e487b7160e01b5f52604160045260245ffd5b34610978576020366003190112610978576001600160a01b036122f7612bde565b165f526009602052602061ffff60405f205416604051908152f35b346109785761232036612c0a565b9091335f52600260205260405f2060018060a01b0382165f5260205260405f20835f526020528160405f205560405191825260018060a01b0316907fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a760203392a4602060405160018152f35b34610978576020366003190112610978576020611b7a6004356132af565b34610978576124246123fa61243261244e6124086124406124166123d66123d036612c0a565b91613001565b9b9660409e95929893969e9a919a519e8f9e8f926101008452610100840190612cac565b916020818403910152612cac565b8c810360408e015290612cac565b908a820360608c0152612cac565b9088820360808a0152612cac565b9086820360a0880152612cdf565b9084820360c0860152612cdf565b9060e08301520390f35b34610978576101203660031901126109785760043567ffffffffffffffff81116109785761248a903690600401612c4a565b612492612bf4565b9061249b612c78565b926124a4612c8e565b60603660c319011261097857846124c29460a43594608435946132e1565b916107d061ffff6124d1612f5f565b16118015612616575b6125e45763ffffffff6124eb612f82565b16159081156125f3575b50156125e457805f52600360205260405f2063ffffffff612514612f82565b1681549065ffff00000000612527612f5f565b60201b169067ffff00000000000061253d612f70565b60301b169267ffffffffffffffff19161717179055805f52600460205260405f20600160ff198254161790556040519160c43563ffffffff811680910361097857835260e43561ffff81168091036109785760208401526101043561ffff8116809103610978577f03cac222e77965d762368408cf9b2c5bd188fa9d139ee2b0a48dad1fcba6491e608085859360408098015260016060820152a282519182526020820152f35b634f8664a960e01b5f5260045ffd5b905063ffffffff6001600160481b0361260a612f82565b921691161115836124f5565b506107d061ffff612625612f70565b16116124da565b34610978576020366003190112610978576020611b7a600435612f04565b346109785761265836612c34565b9061266981610468610462826132af565b9280151580612763575b8061275a575b156121a057612689848383614704565b926126948584612eea565b61269e8385612eea565b916126c9876126c26126ba6126b38a84612ef7565b8097612eea565b96828961476b565b968361447d565b8061271e575b505f90815260066020526040902060010154610528948181111561052c575095604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271001806127101161216d578061271087029661271081890414901517021561274d576105289504946126cf565b63ad251c275f526004601cfd5b50831515612679565b50811515612673565b346109785761277a36612c34565b9061278b81610468610462826132af565b928181108061284d575b80612844575b156121a0576127ab828583614332565b916127b68582612eea565b6127e3866127c48585612ef7565b936127dd6127d56126b38985612eea565b9683836143e9565b9761447d565b8061281f575b50610528939495604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b6127109594950193846127101161216d576105289461283d9161468d565b94936127e9565b5083151561279b565b50811515612795565b346109785761286436612c0a565b90916001600160a01b031690308203612936573033141580612903575b6128f4575b335f52600160205260405f20835f5260205260405f206128a7828254612ef7565b9055815f52600160205260405f20835f5260205260405f206128ca828254612eea565b9055604080513380825260208201939093525f516020614a6d5f395f51905f5291819081016102c1565b631e4ec46b60e01b5f5260045ffd5b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415612881565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316820361288657631e4ec46b60e01b5f5260045ffd5b3461097857602036600319011261097857600435612995610462826132af565b61299e81614224565b6040516315895f4760e31b81526004810182905290919060e0816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121165760c0945f5f905f925f945f96612a52575b5063ffffffff94959651145f14612a40576001600160701b0391821691165b60405196875260208701526040860152166060840152608083015260a0820152f35b6001600160701b039081169116612a1e565b925094505063ffffffff9250612a80915060e03d60e011612a90575b612a788183612dc6565b810190612e9c565b97909693959390925090506129ff565b503d612a6e565b346109785760203660031901126109785760043563ffffffff60e01b8116809103610978576020906301ffc9a760e01b8114908115612adb57506040519015158152f35b630f632fb360e01b14905082611167565b34610978576040366003190112610978576001600160a01b03612b0d612bde565b165f52600160205260405f206024355f52602052602060405f2054604051908152f35b34610978576020366003190112610978576080810160a082016040525f8152600a600435915b5f190191603082820601835304908115612b7257600a90612b56565b61052890610d58602585608084601f19810192030181526040519384916450414d4d2d60d81b60208401525180918484015e81015f838201520301601f198101835282612dc6565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361097857565b602435906001600160a01b038216820361097857565b6060906003190112610978576004356001600160a01b038116810361097857906024359060443590565b6040906003190112610978576004359060243590565b9181601f840112156109785782359167ffffffffffffffff8311610978576020838186019501011161097857565b604435906001600160481b038216820361097857565b60643590811515820361097857565b60243590811515820361097857565b90602080835192838152019201905f5b818110612cc95750505090565b8251845260209384019390920191600101612cbc565b90602080835192838152019201905f5b818110612cfc5750505090565b82511515845260209384019390920191600101612cef565b60a090600319011261097857600435906024359060443590606435906084356001600160a01b03811681036109785790565b600554811015612d5e5760055f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c92168015612da0575b6020831014612d8c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612d81565b60a0810190811067ffffffffffffffff8211176122c257604052565b90601f8019910116810190811067ffffffffffffffff8211176122c257604052565b9060405191825f825492612dfb84612d72565b8084529360018116908115612e665750600114612e22575b50612e2092500383612dc6565b565b90505f9291925260205f20905f915b818310612e4a575050906020612e20928201015f612e13565b6020919350806001915483858901015201910190918492612e31565b905060209250612e2094915060ff191682840152151560051b8201015f612e13565b51906001600160701b038216820361097857565b908160e091031261097857612eb081612e88565b91612ebd60208301612e88565b91604081015163ffffffff81168103610978579160608201519160808101519160c060a083015192015190565b9190820180921161216d57565b9190820391821161216d57565b5f8181526006602052604090208054906001600160a01b03821615612f585760ff8260a01c1615612f58576002015415612f525760a81c60ff1615612f465790565b612f4f906132af565b90565b50505f90565b5050505f90565b60e43561ffff811681036109785790565b6101043561ffff811681036109785790565b60c43563ffffffff811681036109785790565b67ffffffffffffffff81116122c25760051b60200190565b90612fb782612f95565b612fc46040519182612dc6565b8281528092612fd5601f1991612f95565b0190602036910137565b5f19811461216d5760010190565b8051821015612d5e5760209160051b010190565b90929160055490818510156132095761301a9085612eea565b91818311613200575b61302d8584612ef7565b9061303782612fad565b9561304183612fad565b9561304b84612fad565b9561305585612fad565b9561305f86612fad565b9561306981612fad565b9561307382612fad565b958c5f8d8c8e5b87840361309957505050505050505081105f146130945790565b505f90565b613121848093816130b26130ad828c612eea565b612d46565b90549060031b1c966130e66130c6896132af565b9283928a5f5260066020528a6130e08360405f209f612fed565b52612fed565b526001600160a01b038b165f90815260016020908152604080832099835298905287812054918152969096205494859487916130e091612fed565b528354938c6131378560ff8860a01c1692612fed565b811580159091526001600160a01b038716151590816131f8575b508d86826131ea575b61316391612fed565b9015159052613184575b50505061317a9150612fdf565b8d908d8c8e61307a565b600201549360a81c60ff16156131e357505b826131b6575061317a91505f5b6131ad828d612fed565b525f808061316d565b8281029281159184041417670de0b6b3a7640000021561274d57670de0b6b3a764000061317a92046131a3565b9050613196565b60b889901c4210925061315a565b90505f613151565b91508091613023565b505050905060206040519061321e8183612dc6565b5f82525f368137604051926132338285612dc6565b5f84525f368137604051926132488385612dc6565b5f84525f3681376040519261325d8185612dc6565b5f84525f368137604051926132728285612dc6565b5f84525f368137604051926132878385612dc6565b5f84525f3681376040519261329c8185612dc6565b5f8452505f368137969594939291905f90565b604051602081019169504d41524b45543a4e4f60b01b8352602a820152602a81526132db604a82612dc6565b51902090565b949693959190926001600160481b03169442861115613ad5575f936001600160a01b038316928315613ac657613318908284613bc5565b97613322896132af565b5f8a8152600660205260409020549098906001600160a01b0316613ab7576040519160e083019083821067ffffffffffffffff8311176122c25761343d6001600160481b036002948e9460405289875260208701935f855261340c604089015f815260608a01921515835260808a0193845260a08a01965f885260c08b01985f8a525f52600660205260405f209a60018060a01b039051166bffffffffffffffffffffffff60a01b8c5416178b555115158a549060ff60a01b9060a01b169060ff60a01b1916178a55511515899081549060ff60a81b90151560a81b169060ff60a81b1916179055565b51875491516001600160b01b0390921690151560b01b60ff60b01b1617911660b81b6001600160b81b031916178555565b51600184015551910155600554680100000000000000008110156122c25780600161346b9201600555612d46565b81549060031b908a821b915f19901b1916179055875f52600860205260405f209167ffffffffffffffff82116122c2578793836134a98b9554612d72565b601f8111613a5c575b505f601f85116001146139c65793606092819492827f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f63921975f916139bb575b508360011b905f198560031b1c19161790555b60405194859360408552816040860152858501375f8383018501526020830152601f01601f19168101030190a38515801580916139b2575b613549575b50505090919250565b806139a9575b1561399a5761355d856132af565b9061356882876141c4565b916135748888306148c3565b865f52600760205260405f2061358b898254612eea565b90556135988282306148c3565b5f52600760205260405f206135ae828254612eea565b90558151968688036139945790915b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031697883b1561097857604051630efe6a8b60e01b81523060048201526024810191909152604481018390525f81606481838d5af180156121165761397f575b50602081018051893b156109de57604051630efe6a8b60e01b81523060048201526024810191909152604481018590528581606481838e5af18015610a1a579086939291613960575b50604080516318852af560e31b81528351600482015260208401516024820152908301516001600160a01b039081166044830152606084810151909116606483015260808401516084830152909687906101649082908e8960a48401528a60c48401528160e48401528161010484015230610124840152426101448401525af194851561387357839484978597613916575b50851061387e575b861061376d575b508798509160609391887fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f66214969499979899511490505f1461376857915b60405192835260208301526040820152a29082915f8080613540565b61374c565b6020613795849b83516040519d8e80948193635323fe1560e11b835230903060048501613b84565b03925af190811561387357899a849a98999a9261380e575b507fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f6621496949282826137e560609997958c955130614908565b51845260076020526137fc60408520918254612ef7565b9055929496505091939796959761370f565b975094929050602095939195873d60201161386b575b8161383160209383612dc6565b81010312610978579551899693959294919392917fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f662146137ad565b3d9150613824565b6040513d85823e3d90fd5b8360206138a68d8651604051948580948193635323fe1560e11b835230903060048501613b84565b03925af19081156109be5785916138e4575b506138c581855130614908565b8351855260076020526138dd60408620918254612ef7565b9055613708565b90506020813d60201161390e575b816138ff60209383612dc6565b8101031261097857515f6138b8565b3d91506138f2565b9550955095506060843d606011613958575b8161393560609383612dc6565b810103126139545783519560406020860151950151969496955f613700565b8280fd5b3d9150613928565b8361396e9194929394612dc6565b61397b579084915f61366e565b8480fd5b61398c9194505f90612dc6565b5f925f613625565b916135bd565b6302f33c2b60e31b5f5260045ffd5b5080151561354f565b5081151561353b565b90508401355f6134f0565b959493929190601f198416815f5260205f20905f5b818110613a3e57509160609493917f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f6392197989987809510613a25575b5050600183811b019055613503565b8501355f19600386901b60f8161c191690555f80613a16565b8986013583556020998a01998e99508f9850600190930192016139db565b91939550809294505f5260205f20601f860160051c81019160208710613aad575b918b959391601f8c9896940160051c01905b818110613a9c57506134b2565b5f81558b97508c9650600101613a8f565b9091508190613a7d565b638fc6f59b60e01b5f5260045ffd5b631b68fd9560e21b5f5260045ffd5b63ffe25d7160e01b5f5260045ffd5b8181029291811591840414171561216d57565b90816020910312610978575180151581036109785790565b92610120949197969592613b608561014081019a60808091805184526020810151602085015260018060a01b03604082015116604085015260018060a01b0360608201511660608501520151910152565b60a085015260c0840152151560e08301526001600160a01b03166101008201520152565b6001600160a01b0391821681526020810192909252909116604082015260600190565b8115613bb1570490565b634e487b7160e01b5f52601260045260245ffd5b91906014602b6132db926040519481869260208401986a504d41524b45543a59455360a81b8a52858501378201906bffffffffffffffffffffffff199060601b16838201520301600b19810184520182612dc6565b61034052610320525f6102e0525f6102c0525f6102a0525f610280525f610260525f610240525f610220525f610200525f610300525f6101e0525f6101c0525f6101a0525f610180525f610160525f61014052600554610100526101005161034051101561401c57613c926103205161034051612eea565b6101205261010051610120511161400f575b613cb46103405161012051612ef7565b60e052613cc260e051612fad565b6102e052613cd160e051612fad565b6102c052613ce060e051612fad565b6102a052613cef60e051612fad565b61028052613cfe60e051612fad565b61026052613d0d60e051612fad565b61024052613d1c60e051612fad565b61022052613d2b60e051612fad565b61020052613d3a60e051612f95565b613d476040519182612dc6565b60e0518152601f19613d5a60e051612f95565b015f5b818110613ffe5750508061030052613d7660e051612fad565b6101e052613d8560e051612fad565b6101c052613d9460e051612fad565b6101a052613da360e051612fad565b61018052613db260e051612fad565b61016052613dc160e051612fad565b610140525f60c0525b60e05160c05103613def575061010051610120511015613deb576101205190565b5f90565b613e016130ad60c05161034051612eea565b90549060031b1c60a05260a0515f52600660205260405f2060a051613e2b60c0516102e051612fed565b5260a0515f52600760205260405f2054613e4a60c0516102c051612fed565b52613e5660a0516132af565b90815f52600760205260405f2054613e7360c0516102a051612fed565b52600281549160018060a01b038316613e9160c05161028051612fed565b52613ea160c05161026051612fed565b60ff8460a01c1615159052613ebb60c05161024051612fed565b60ff8460a81c16151590526001810154613eda60c05161022051612fed565b520154613eec60c05161020051612fed565b5260a0515f526008602052613f0360405f20612de8565b613f0f60c05185612fed565b52613f1c60c05184612fed565b508060b81c613f3060c0516101e051612fed565b52613f4060c0516101c051612fed565b60b082901c60ff16151590526001600160a01b0316613f6e575b50613f6660c051612fdf565b60c052613dca565b60a051613f7f9161046890826141c4565b613f8e60c05161018051612fed565b52613f9e60c0516101a051612fed565b52613fae60c05161018051612fed565b51613fbe60c05161016051612fed565b52613fe8613fd160c0516101a051612fed565b51613fe160c05161018051612fed565b5190612eea565b613ff760c05161014051612fed565b525f613f5a565b806060602080938601015201613d5d565b6101005161012052613ca4565b60405190602061402c8184612dc6565b5f83525f368137604051926140418285612dc6565b5f84525f368137604051936140568386612dc6565b5f85525f3681376040519461406b8487612dc6565b5f86525f36813760405161407f8582612dc6565b5f81525f3681376040516140938682612dc6565b5f81525f368137604051906140a88783612dc6565b5f82525f368137604051926140bd8885612dc6565b5f84525f368137604051996140d2898c612dc6565b5f8b52601f1989015f5b8181106141b55750509188999a9391899897969593604051966140ff8b89612dc6565b5f808952368137604051986141148c8b612dc6565b5f808b523681376040519a6141298d8d612dc6565b5f808d523681376040519c61413e908e612dc6565b5f808e523681376040519d8e6141548282612dc6565b5f9052365f908137506040519e8f61416c8282612dc6565b5f905250365f9081376102e0526102c0526102a0526102805261026052610240526102205261020052610300526101e0526101c0526101a0526101805261016052610140525f90565b60608d82018c01528a016140dc565b5f60806040516141d381612daa565b82815282602082015282604082015282606082015201528181105f1461421f57905b6040519161420283612daa565b82526020820152306040820152306060820152600a608082015290565b6141f5565b80519060208101519060018060a01b0360408201511690608060018060a01b0360608301511691015191604051936020850195865260408501526060840152608083015260a082015260a081526132db60c082612dc6565b919061428783614224565b6040516315895f4760e31b815260048101919091529060e0826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa938415612116575f925f95614306575b5051036142f6576001600160701b03809116921690565b6001600160701b03928316921690565b90945061432391925060e03d60e011612a9057612a788183612dc6565b5050505050919091935f6142df565b91908215612f58578261434491613ae4565b91612710830292808404612710149015171561216d5761436391612ef7565b6127069081810291818304149015171561216d5761438091613ba7565b6001810180911161216d5790565b919082156143e157826143a091613ae4565b91612710830292808404612710149015171561216d576143bf91612ef7565b916127100391612710831161216d57614380926143db91613ae4565b90613ba7565b505050505f90565b61447790614472612f4f949361446861440b6144058386612eea565b83614a45565b9161444461443d61444a8960011c61444461443d61443661442f600a8d8a8761438e565b938c612ef7565b9287612eea565b8092612eea565b90614a45565b966144628a61445c600a84888461438e565b92612ef7565b93612eea565b9260021b90612eea565b612eea565b906146d6565b9092915f93825f52600360205260405f20604051906060820182811067ffffffffffffffff8211176122c257604052549063ffffffff82169485825261ffff8360201c169561ffff602084019488865260301c16604084019781895282171715614681576145ba575b50505061ffff8351166144f857505050565b8161450291612eea565b908161450d57505050565b81670de0b6b3a764000082969495960291670de0b6b3a764000081840414901517021561274d57046706f05b59d3b2000081111561458e576706f05b59d3b1ffff19810190811161216d5761ffff6706f05b59d3b2000091935b51168381029381850414901517021561274d576706f05b59d3b20000612f4f920490612eea565b6706f05b59d3b20000036706f05b59d3b20000811161216d5761ffff6706f05b59d3b200009193614567565b5f9081526006602052604090208151905493979360b81c9063ffffffff1681811061466357506001600160481b035f5b1690421061460e5750509061ffff61460492511690612eea565b935b5f80806144e6565b809793979291924211614624575b505050614606565b9163ffffffff61464b6146549361ffff61464361465a989c9742612ef7565b915116613ae4565b91511690613ba7565b90612eea565b935f808061461c565b81036001600160481b03811161216d576001600160481b03906145ea565b505f9750505050505050565b8181029181159183041417612710021561274d57612710808204910615150190565b61271061272782029161272781840414901517021561274d57612710808204910615150190565b81810291811591830414176753444835ec580000021561274d576753444835ec580000808204910615150190565b916127069283810293818504149015171561216d576147239083613ae4565b90612710810290808204612710149015171561216d57612f4f926143db91612eea565b9091926127100390612710821161216d576147239161476491613ae4565b9283613ae4565b906147768183612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c916147ca6147c36147bc6147b5600a868a89614746565b9588612eea565b9484612ef7565b8094612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d576148128161480c89614806600a886148199784614746565b92612eea565b94612ef7565b8093612eea565b9384670de0b6b3a7640000840293670de0b6b3a764000081860414901517021561274d576753444835ec5800009561485c956144729404940460021b9104612eea565b918281029281840414901517021561274d576753444835ec580000900490565b612f4f9291614472614477926144686148986144058584612eea565b916144446148bc61444a8960011c6144446148bc61443661442f600a8d8a8761438e565b9182612eea565b5f516020614a6d5f395f51905f526149035f9294939460018060a01b031693848452600160205260408420868552602052604084206102a7828254612eea565b0390a4565b915f516020614a6d5f395f51905f526149035f939460018060a01b031692838552600160205260408520868652602052604085206102a7828254612ef7565b805f52600760205260405f2054305f52600160205260405f20825f5260205260405f205490039060018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165f52600160205260405f20905f5260205260405f2054900390565b6149bc8282612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c91614a026149fb6147bc6147b5600a868a89614746565b9384612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d57614a3e8161480c89614806600a886148199784614746565b9283612eea565b81670de0b6b3a7640000820291670de0b6b3a764000081840414901517021561274d57049056fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c42200000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce37

Deployed Bytecode

0x610360806040526004361015610013575f80fd5b5f905f3560e01c908162ad800c14612b3057508062fdd58e14612aec57806301ffc9a714612a97578063068bcd8d14612975578063095bcdb6146128565780630f4016b01461276c57806316ac2b901461264a578063181c7f661461262c5780631e937fc214612458578063399f1a12146123aa5780634076ac511461238c578063426a8493146123125780634d5e9db0146122d65780634e41a1fb1461226a5780634e441bda1461220d5780634efef1d014611eb657806352a34b0514611c4c57806352d84d1e14611c12578063558a729714611b8257806359152b8214611b35578063598af9e714611add5780636ddb76f114611a985780637f8b182114611a4f57806380968d48146117ea5780638743a669146117a55780639595636914611350578063ae4180951461123b578063b0953d671461120c578063b1283e771461118f578063b33aad2d1461112a578063b6363cf2146110d3578063bd85b039146110a9578063bdd305a614610f8c578063c90bd92114610f4f578063ddd5e1b214610d6c578063e6f859e714610d2d578063eb44fdd314610bef578063ec97908214610bd1578063f0cca67b14610af5578063f4d197ac14610629578063fb105091146105a6578063fc78909f146104425763fe99049a146101f6575f80fd5b3461043f57608036600319011261043f5761020f612bde565b610217612bf4565b604435926001600160a01b0390911691606435903084036103d55730331415806103a2575b610393575f516020614a6d5f395f51905f529160406102c1925b6001600160a01b031694338690036102cf575b8581526001602052818120888252602052818120610288848254612ef7565b90558681526001602052818120888252602052206102a7828254612eea565b905560408051338152602081019290925290918291820190565b0390a4602060405160018152f35b30861480610361575b610269578581526020818152828220335f90815291528290205460ff166102695785815260026020908152828220335f908152908252839020898352905281812054836001820161032b575b5050610269565b61033491612ef7565b868252600260205282822060018060a01b0333165f52602052825f20898352602052828220555f83610324565b50337f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b0316146102d8565b631e4ec46b60e01b8352600483fd5b50337f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b0316141561023c565b7f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03168414610420575b5f516020614a6d5f395f51905f529160406102c192610256565b6001600160a01b038116301461040657631e4ec46b60e01b8352600483fd5b80fd5b503461043f5761045136612c34565b9161046d82610468610462826132af565b826141c4565b61427c565b9390928115158061059d575b80610594575b156105855761048f848684614704565b9261049a8686612eea565b906104a58488612eea565b926104d06104c86104c06104b9898b612ef7565b9687612eea565b968a8a6149b2565b98888361447d565b80610534575b5081526006602052604090206001015494959394610528948181111561052c5750955b604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b0390f35b9050956104f9565b61271001806127101161057157806127108a0299612710818c0414901517021561056457909704966105286104d6565b63ad251c2783526004601cfd5b634e487b7160e01b83526011600452602483fd5b63bb55fd2760e01b8352600483fd5b5084151561047f565b50831515610479565b503461043f57602036600319011261043f5760043561ffff8116809103610625576103e88111610616573382526009602052604082208161ffff198254161790556040519081527ffc0ef2a6f22017eb94ef2ccd5c1e26a73755192f425c5dc589c62105cccaf24c60203392a280f35b6340c0d6e560e11b8252600482fd5b5080fd5b503461043f5761063836612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081610acc575b5015610abe578115610aaf57610699836132af565b906106a482856141c4565b976106af858a61427c565b929080151580610aa6575b15610a9757868b5114936106cf818389614704565b998a10610a8857806106e5886106ec938561476b565b928961447d565b80610a3a575b5090600101908154908181115f14610a34575080995b8a10610a2557610753926020926107208c8094612ef7565b905560405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b0381897f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03165af18015610a1a576109ed575b50610799838533614908565b8385526007602052604085206107b0848254612ef7565b90556107bd8385306148c3565b8385526007602052604085206107d4848254612eea565b90557f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031697883b156109de57604051630efe6a8b60e01b815230600482015260248101869052604481018590528681606481838e5af180156109e2579087916109c9575b505061086a9160209160405193849283926338c3f8db60e01b84524291898d309360048801613b0f565b0381888c5af180156109be5761098f575b5060206040518098635323fe1560e11b825281878161089f308a3060048501613b84565b03925af1801561098457849061094d575b6040975080610924575b506108c6858230614908565b835260076020528583206108db858254612ef7565b905585519081528460208201527fe029f26dbcf8c42dd2f352c10214a7fc26773dc62482c6241334a0402ac09a80863392a368929eee149b4bd212685d82519182526020820152f35b61092f818530614908565b8385526007602052610945888620918254612ef7565b90555f6108ba565b506020873d60201161097c575b8161096760209383612dc6565b8101031261097857604096516108b0565b5f80fd5b3d915061095a565b6040513d86823e3d90fd5b6020813d6020116109b6575b816109a860209383612dc6565b81010312610978575161087b565b3d915061099b565b6040513d87823e3d90fd5b816109d391612dc6565b6109de57855f610840565b8580fd5b6040513d89823e3d90fd5b610a0e9060203d602011610a13575b610a068183612dc6565b810190613af7565b61078d565b503d6109fc565b6040513d88823e3d90fd5b63396038e360e21b8852600488fd5b99610708565b61271001908161271011610a745781612710820291612710818404149015170215610a67570460016106f2565b63ad251c2789526004601cfd5b634e487b7160e01b89526011600452602489fd5b63bb55fd2760e01b8952600489fd5b6313b0827d60e31b8852600488fd5b508315156106ba565b6365e52d5160e11b8452600484fd5b62b5f6bf60e41b8452600484fd5b905060b81c42105f610684565b6307db1be560e41b8552600485fd5b63ab143c0683526004601cfd5b503461043f57610b0436612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080549092906001600160a01b03811615610ad95760ff8160a01c16159081610bc4575b5015610abe578115610aaf57610b68816132af565b92610b7384836141c4565b97610b7e838a61427c565b929080151580610bbb575b15610a9757868b511493610b9e828289614704565b998a10610a885780610bb4886106ec93856149b2565b928761447d565b50831515610b89565b905060b81c42105f610b53565b503461043f578060031936011261043f576020600554604051908152f35b503461043f57602036600319011261043f576004359080818283918585526006602052604085209384549460018060a01b0386169060026001820154910154908989526008602052610c4360408a20612de8565b928a8a5260076020526040808b20549a610c5c8d6132af565b8152600760205220549a81610cf2575b509160ff9391610cbf936040519c8d9c8d5260208d015260408c0152848a60a01c16151560608c0152848a60a81c16151560808c015260a08b015260c08a01526101c060e08a01526101c0890190612bba565b958060b81c61010089015260b01c1615156101208701526101408601526101608501526101808401526101a08301520390f35b909750610cbf929650610d1291955060ff939450610468610462826132af565b958695919491610d228787612eea565b989193509193610c6c565b503461043f57602036600319011261043f57610d586040610528926004358152600860205220612de8565b604051918291602083526020830190612bba565b503461043f57604036600319011261043f57600435610d89612bf4565b9068929eee149b4bd212685c610ae8573068929eee149b4bd212685d80835260066020526040832090815460ff8160a01c1615610f405760a81c60ff1615610f3157915b3384526001602052604084208385526020526040842054918215610f22576002810154670de0b6b3a764000081850291858304140215610f1557670de0b6b3a76400006001910491610e20858733614908565b858752600760205260408720610e37868254612ef7565b905501610e45828254612ef7565b905560405163a9059cbb60e01b81526001600160a01b0383166004820152602481018290529160208380604481010381897f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03165af1918215610a1a577f9cdcf2f7714cca3508c7f0110b04a90a80a3a8dd0e35de99689db74d28c5383e93604093610ef8575b50825194855260208501526001600160a01b031692a38068929eee149b4bd212685d80f35b610f109060203d602011610a1357610a068183612dc6565b610ed3565b63ad251c2786526004601cfd5b63843f941b60e01b8552600485fd5b610f3a906132af565b91610dcd565b63174b639360e11b8552600485fd5b503461043f57602036600319011261043f576040610f80610f78600435610468610462826132af565b809291612eea565b82519182526020820152f35b503461043f57610f9b36612c34565b610fab82610468610462826132af565b8083929310806110a0575b80611097575b1561108857610fcc818484614332565b92610fd78282612eea565b9061100c610fe58585612ef7565b9382611006610ffe610ff78a84612eea565b9788612eea565b97838361487c565b9861447d565b80611049575b5061052894959650604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271096919601968761271011611074575061052894959661106a9161468d565b949350855f611012565b634e487b7160e01b81526011600452602490fd5b63bb55fd2760e01b8552600485fd5b50801515610fbc565b50821515610fb6565b503461043f57602036600319011261043f5760406020916004358152600783522054604051908152f35b503461043f57604036600319011261043f5760406110ef612bde565b916110f8612bf4565b9260018060a01b0316815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461043f57602036600319011261043f576004358152600660209081526040909120546001600160a01b0381161515908161117f575b81611172575b506040519015158152f35b905060b81c42105f611167565b905060ff8160a01c161590611161565b503461043f57602036600319011261043f57604060e091600435815260066020522080549060026001820154910154906040519260018060a01b038116845260ff8160a01c161515602085015260ff8160a81c161515604085015260ff8160b01c161515606085015260b81c608084015260a083015260c0820152f35b503461043f57602036600319011261043f5760ff60406020926004358152600484522054166040519015158152f35b503461043f57602036600319011261043f5760043568929eee149b4bd212685c611343573068929eee149b4bd212685d80825260066020526040822080546001600160a01b0381168015610ad95733036113345760ff8160b01c16156113255760ff8160a01c166113165760b81c4210156113085780546001600160b81b03164260b81b6001600160b81b031916179055604051904282527f785f63ccac8ab83aff1730b2462e4c5437bf3b1dbc6f8c243a20e3efb9af9d5260203393a38068929eee149b4bd212685d80f35b62b5f6bf60e41b8352600483fd5b6355e8cb5f60e01b8452600484fd5b6374c77f3b60e01b8452600484fd5b632b910d6d60e11b8452600484fd5b63ab143c0682526004601cfd5b503461043f5761135f36612d14565b939094919268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081611798575b5015610abe578115610aaf576113c0836132af565b6113ca81856141c4565b916113d5858461427c565b9190978815158061178f575b15610a97578886101561178057838551149a6113fe8a8589614332565b8181116117715761140e816146af565b906005820180921161175d57816003820180921161174957908061145294939210611741575b50818111156117395750935b61144b88828d6143e9565b9a8961447d565b80611717575b508815610a25578811611708576040516323b872dd60e01b8152336004820152306024820152604481018990526020816064818b6001600160a01b037f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce37165af180156116e05790600192916116eb575b50016114d5888254612eea565b90556114e28183306148c3565b8186526007602052604086206114f9828254612eea565b90557f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031692833b156116dc57604051630efe6a8b60e01b81523060048201526024810184905260448101839052878160648183895af180156116e0576116c7575b509860209161158d8a9b60409b9a9b519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b038188865af19586156109be578596611693575b5060206040518093635323fe1560e11b82528188816115c530883060048501613b84565b03925af19182156109be57859261165e575b506040978289927fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc5394611635575b50508151938452602084018890526001600160a01b031692a368929eee149b4bd212685d82519182526020820152f35b611640828230614908565b87526007602052611655838820918254612ef7565b90555f80611605565b9091506020813d60201161168b575b8161167a60209383612dc6565b8101031261097857519060406115d7565b3d915061166d565b9095506020813d6020116116bf575b816116af60209383612dc6565b810103126109785751945f6115a1565b3d91506116a2565b6116d2888092612dc6565b6116dc575f611562565b8680fd5b6040513d8a823e3d90fd5b6117039060203d602011610a1357610a068183612dc6565b6114c8565b63396038e360e21b8752600487fd5b61271099919901908161271011610a7457906117329161468d565b975f611458565b905093611440565b90505f611434565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8b52601160045260248bfd5b638e6e832560e01b8a5260048afd5b63bb55fd2760e01b8852600488fd5b508215156113e1565b905060b81c42105f6113ab565b503461043f578060031936011261043f576040517f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03168152602090f35b503461043f576118026117fc36612c34565b90613c1a565b6101405161016051610180516101a0516101c0516101e05196610300516102005161022051610240516102605161028051906118876102a0516118756102c0516118636102e051604051608052610200608051526102006080510190612cac565b90608051820360206080510152612cac565b90608051820360406080510152612cac565b60805181036060608051015260208084519283815201930190885b818110611a30575050506118f1926118cd6119039695936118df936080518203608080510152612cdf565b90608051820360a06080510152612cdf565b90608051820360c06080510152612cac565b90608051820360e06080510152612cac565b60805181036101006080510152815180825260208201916020808360051b83010194019285915b838310611a00575050505050608051810361012060805101526020808a5192838152019901915b8181106119e157505050916119956119a8926119826119ce98996119bb979660805182036101406080510152612cdf565b9060805182036101606080510152612cac565b9060805182036101806080510152612cac565b9060805182036101a06080510152612cac565b9060805182036101c06080510152612cac565b906101e060805101526080519003608051f35b82516001600160481b03168a526020998a019990920191600101611951565b909192939594602080611a1f600193601f198682030187528a51612bba565b97980195949190910192019061192a565b82516001600160a01b03168552602094850194909201916001016118a2565b503461043f57602036600319011261043f57604060609160043581526003602052205461ffff6040519163ffffffff81168352818160201c16602084015260301c166040820152f35b503461043f578060031936011261043f576040517f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03168152602090f35b503461043f57606036600319011261043f576040602091611afc612bde565b611b04612bf4565b6001600160a01b0391821683526002855283832091165f908152908452829020604435825283522054604051908152f35b503461043f57604036600319011261043f576004359067ffffffffffffffff821161043f576020611b7a611b6c3660048601612c4a565b611b74612bf4565b91613bc5565b604051908152f35b503461043f57604036600319011261043f57611b9c612bde565b6040611ba6612c9d565b92338152806020522060018060a01b0382165f5260205260405f209115159160ff1981541660ff841617905560405191825260018060a01b0316907fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b503461043f57602036600319011261043f576004359060055482101561043f576020611c3d83612d46565b90549060031b1c604051908152f35b503461043f57604036600319011261043f57600435611c69612c9d565b68929eee149b4bd212685c610ae8573068929eee149b4bd212685d818352600660205260408320805482906001600160a01b038116908115611ea757813303611e985760ff8160a01c16611e895760b81c4210611e7a57808652600960205261ffff60408720541680611de6575b5050611ce2846132af565b90611cf5611cef86614947565b92614947565b9015611dc757811580611dbe575b611db6575b8315611daf57505b8015611da057600182015481670de0b6b3a7640000820291670de0b6b3a7640000818404149015170215610f1557046002820155805461ffff60a01b191682151560a81b60ff60a81b1617600160a01b1790557fe940c2f4a2e1dda6ea582b576e35520a2ec6b80e436c26962c1150ddd7d07993906020906040519015158152a28068929eee149b4bd212685d80f35b63338aa79560e21b8552600485fd5b9050611d10565b859350611d08565b50801515611d03565b801580611ddd575b15611d085760019350611d08565b50811515611dcf565b6001840191612710611dfa84549384613ae4565b049081611e09575b5050611cd7565b611e199361072083602095612ef7565b0381897f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03165af18015610a1a57611e5b575b808080611e02565b611e739060203d602011610a1357610a068183612dc6565b505f611e53565b63a8a9eb6960e01b8652600486fd5b6336ab81e160e11b8752600487fd5b632b910d6d60e11b8752600487fd5b6307db1be560e41b8752600487fd5b503461097857611ec536612d14565b949193909268929eee149b4bd212685c612200573068929eee149b4bd212685d5f82815260066020526040902080546001600160a01b038116156121f15760ff8160a01c161590816121e4575b50156121d65781156121c757611f27836132af565b92611f3284826141c4565b95611f3d828861427c565b939098891515806121be575b156121af57848610156121a0578389511492611f66868c89614332565b9581871161219157611f77876146af565b966005880180981161216d5787906003810180911161216d5782611fbc948f9a93838d94611fb59610612189575b508181111561218157509961487c565b9b8661447d565b8061214d575b50891561213e57891161213e576040516323b872dd60e01b8152336004820152306024820152604481018a9052906020826064815f6001600160a01b037f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce37165af191821561211657600192612121575b500161203f898254612eea565b905561204c8383306148c3565b815f52600760205260405f20612063848254612eea565b90557f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031692833b1561097857604051630efe6a8b60e01b81523060048201526024810184905260448101829052975f8960648183895af1988915612116578b996120f7575b509061158d602093926040519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b602093929198505f61210891612dc6565b61158d5f98919293506120d0565b6040513d5f823e3d90fd5b6121399060203d602011610a1357610a068183612dc6565b612032565b63396038e360e21b5f5260045ffd5b6127109a919a01806127101161216d576121669161468d565b985f611fc2565b634e487b7160e01b5f52601160045260245ffd5b90509961487c565b90505f611fa5565b638e6e832560e01b5f5260045ffd5b63bb55fd2760e01b5f5260045ffd5b6313b0827d60e31b5f5260045ffd5b50841515611f49565b6365e52d5160e11b5f5260045ffd5b62b5f6bf60e41b5f5260045ffd5b905060b81c42105f611f12565b6307db1be560e41b5f5260045ffd5b63ab143c065f526004601cfd5b346109785760c03660031901126109785760043567ffffffffffffffff811161097857610f806122436040923690600401612c4a565b9061224c612bf4565b612254612c78565b61225c612c8e565b9160a43594608435946132e1565b3461097857602036600319011261097857604051604081019080821067ffffffffffffffff8311176122c25761052891604052600481526350414d4d60e01b6020820152604051918291602083526020830190612bba565b634e487b7160e01b5f52604160045260245ffd5b34610978576020366003190112610978576001600160a01b036122f7612bde565b165f526009602052602061ffff60405f205416604051908152f35b346109785761232036612c0a565b9091335f52600260205260405f2060018060a01b0382165f5260205260405f20835f526020528160405f205560405191825260018060a01b0316907fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a760203392a4602060405160018152f35b34610978576020366003190112610978576020611b7a6004356132af565b34610978576124246123fa61243261244e6124086124406124166123d66123d036612c0a565b91613001565b9b9660409e95929893969e9a919a519e8f9e8f926101008452610100840190612cac565b916020818403910152612cac565b8c810360408e015290612cac565b908a820360608c0152612cac565b9088820360808a0152612cac565b9086820360a0880152612cdf565b9084820360c0860152612cdf565b9060e08301520390f35b34610978576101203660031901126109785760043567ffffffffffffffff81116109785761248a903690600401612c4a565b612492612bf4565b9061249b612c78565b926124a4612c8e565b60603660c319011261097857846124c29460a43594608435946132e1565b916107d061ffff6124d1612f5f565b16118015612616575b6125e45763ffffffff6124eb612f82565b16159081156125f3575b50156125e457805f52600360205260405f2063ffffffff612514612f82565b1681549065ffff00000000612527612f5f565b60201b169067ffff00000000000061253d612f70565b60301b169267ffffffffffffffff19161717179055805f52600460205260405f20600160ff198254161790556040519160c43563ffffffff811680910361097857835260e43561ffff81168091036109785760208401526101043561ffff8116809103610978577f03cac222e77965d762368408cf9b2c5bd188fa9d139ee2b0a48dad1fcba6491e608085859360408098015260016060820152a282519182526020820152f35b634f8664a960e01b5f5260045ffd5b905063ffffffff6001600160481b0361260a612f82565b921691161115836124f5565b506107d061ffff612625612f70565b16116124da565b34610978576020366003190112610978576020611b7a600435612f04565b346109785761265836612c34565b9061266981610468610462826132af565b9280151580612763575b8061275a575b156121a057612689848383614704565b926126948584612eea565b61269e8385612eea565b916126c9876126c26126ba6126b38a84612ef7565b8097612eea565b96828961476b565b968361447d565b8061271e575b505f90815260066020526040902060010154610528948181111561052c575095604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271001806127101161216d578061271087029661271081890414901517021561274d576105289504946126cf565b63ad251c275f526004601cfd5b50831515612679565b50811515612673565b346109785761277a36612c34565b9061278b81610468610462826132af565b928181108061284d575b80612844575b156121a0576127ab828583614332565b916127b68582612eea565b6127e3866127c48585612ef7565b936127dd6127d56126b38985612eea565b9683836143e9565b9761447d565b8061281f575b50610528939495604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b6127109594950193846127101161216d576105289461283d9161468d565b94936127e9565b5083151561279b565b50811515612795565b346109785761286436612c0a565b90916001600160a01b031690308203612936573033141580612903575b6128f4575b335f52600160205260405f20835f5260205260405f206128a7828254612ef7565b9055815f52600160205260405f20835f5260205260405f206128ca828254612eea565b9055604080513380825260208201939093525f516020614a6d5f395f51905f5291819081016102c1565b631e4ec46b60e01b5f5260045ffd5b50337f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03161415612881565b7f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b0316820361288657631e4ec46b60e01b5f5260045ffd5b3461097857602036600319011261097857600435612995610462826132af565b61299e81614224565b6040516315895f4760e31b81526004810182905290919060e0816024817f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03165afa9081156121165760c0945f5f905f925f945f96612a52575b5063ffffffff94959651145f14612a40576001600160701b0391821691165b60405196875260208701526040860152166060840152608083015260a0820152f35b6001600160701b039081169116612a1e565b925094505063ffffffff9250612a80915060e03d60e011612a90575b612a788183612dc6565b810190612e9c565b97909693959390925090506129ff565b503d612a6e565b346109785760203660031901126109785760043563ffffffff60e01b8116809103610978576020906301ffc9a760e01b8114908115612adb57506040519015158152f35b630f632fb360e01b14905082611167565b34610978576040366003190112610978576001600160a01b03612b0d612bde565b165f52600160205260405f206024355f52602052602060405f2054604051908152f35b34610978576020366003190112610978576080810160a082016040525f8152600a600435915b5f190191603082820601835304908115612b7257600a90612b56565b61052890610d58602585608084601f19810192030181526040519384916450414d4d2d60d81b60208401525180918484015e81015f838201520301601f198101835282612dc6565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361097857565b602435906001600160a01b038216820361097857565b6060906003190112610978576004356001600160a01b038116810361097857906024359060443590565b6040906003190112610978576004359060243590565b9181601f840112156109785782359167ffffffffffffffff8311610978576020838186019501011161097857565b604435906001600160481b038216820361097857565b60643590811515820361097857565b60243590811515820361097857565b90602080835192838152019201905f5b818110612cc95750505090565b8251845260209384019390920191600101612cbc565b90602080835192838152019201905f5b818110612cfc5750505090565b82511515845260209384019390920191600101612cef565b60a090600319011261097857600435906024359060443590606435906084356001600160a01b03811681036109785790565b600554811015612d5e5760055f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c92168015612da0575b6020831014612d8c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612d81565b60a0810190811067ffffffffffffffff8211176122c257604052565b90601f8019910116810190811067ffffffffffffffff8211176122c257604052565b9060405191825f825492612dfb84612d72565b8084529360018116908115612e665750600114612e22575b50612e2092500383612dc6565b565b90505f9291925260205f20905f915b818310612e4a575050906020612e20928201015f612e13565b6020919350806001915483858901015201910190918492612e31565b905060209250612e2094915060ff191682840152151560051b8201015f612e13565b51906001600160701b038216820361097857565b908160e091031261097857612eb081612e88565b91612ebd60208301612e88565b91604081015163ffffffff81168103610978579160608201519160808101519160c060a083015192015190565b9190820180921161216d57565b9190820391821161216d57565b5f8181526006602052604090208054906001600160a01b03821615612f585760ff8260a01c1615612f58576002015415612f525760a81c60ff1615612f465790565b612f4f906132af565b90565b50505f90565b5050505f90565b60e43561ffff811681036109785790565b6101043561ffff811681036109785790565b60c43563ffffffff811681036109785790565b67ffffffffffffffff81116122c25760051b60200190565b90612fb782612f95565b612fc46040519182612dc6565b8281528092612fd5601f1991612f95565b0190602036910137565b5f19811461216d5760010190565b8051821015612d5e5760209160051b010190565b90929160055490818510156132095761301a9085612eea565b91818311613200575b61302d8584612ef7565b9061303782612fad565b9561304183612fad565b9561304b84612fad565b9561305585612fad565b9561305f86612fad565b9561306981612fad565b9561307382612fad565b958c5f8d8c8e5b87840361309957505050505050505081105f146130945790565b505f90565b613121848093816130b26130ad828c612eea565b612d46565b90549060031b1c966130e66130c6896132af565b9283928a5f5260066020528a6130e08360405f209f612fed565b52612fed565b526001600160a01b038b165f90815260016020908152604080832099835298905287812054918152969096205494859487916130e091612fed565b528354938c6131378560ff8860a01c1692612fed565b811580159091526001600160a01b038716151590816131f8575b508d86826131ea575b61316391612fed565b9015159052613184575b50505061317a9150612fdf565b8d908d8c8e61307a565b600201549360a81c60ff16156131e357505b826131b6575061317a91505f5b6131ad828d612fed565b525f808061316d565b8281029281159184041417670de0b6b3a7640000021561274d57670de0b6b3a764000061317a92046131a3565b9050613196565b60b889901c4210925061315a565b90505f613151565b91508091613023565b505050905060206040519061321e8183612dc6565b5f82525f368137604051926132338285612dc6565b5f84525f368137604051926132488385612dc6565b5f84525f3681376040519261325d8185612dc6565b5f84525f368137604051926132728285612dc6565b5f84525f368137604051926132878385612dc6565b5f84525f3681376040519261329c8185612dc6565b5f8452505f368137969594939291905f90565b604051602081019169504d41524b45543a4e4f60b01b8352602a820152602a81526132db604a82612dc6565b51902090565b949693959190926001600160481b03169442861115613ad5575f936001600160a01b038316928315613ac657613318908284613bc5565b97613322896132af565b5f8a8152600660205260409020549098906001600160a01b0316613ab7576040519160e083019083821067ffffffffffffffff8311176122c25761343d6001600160481b036002948e9460405289875260208701935f855261340c604089015f815260608a01921515835260808a0193845260a08a01965f885260c08b01985f8a525f52600660205260405f209a60018060a01b039051166bffffffffffffffffffffffff60a01b8c5416178b555115158a549060ff60a01b9060a01b169060ff60a01b1916178a55511515899081549060ff60a81b90151560a81b169060ff60a81b1916179055565b51875491516001600160b01b0390921690151560b01b60ff60b01b1617911660b81b6001600160b81b031916178555565b51600184015551910155600554680100000000000000008110156122c25780600161346b9201600555612d46565b81549060031b908a821b915f19901b1916179055875f52600860205260405f209167ffffffffffffffff82116122c2578793836134a98b9554612d72565b601f8111613a5c575b505f601f85116001146139c65793606092819492827f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f63921975f916139bb575b508360011b905f198560031b1c19161790555b60405194859360408552816040860152858501375f8383018501526020830152601f01601f19168101030190a38515801580916139b2575b613549575b50505090919250565b806139a9575b1561399a5761355d856132af565b9061356882876141c4565b916135748888306148c3565b865f52600760205260405f2061358b898254612eea565b90556135988282306148c3565b5f52600760205260405f206135ae828254612eea565b90558151968688036139945790915b7f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031697883b1561097857604051630efe6a8b60e01b81523060048201526024810191909152604481018390525f81606481838d5af180156121165761397f575b50602081018051893b156109de57604051630efe6a8b60e01b81523060048201526024810191909152604481018590528581606481838e5af18015610a1a579086939291613960575b50604080516318852af560e31b81528351600482015260208401516024820152908301516001600160a01b039081166044830152606084810151909116606483015260808401516084830152909687906101649082908e8960a48401528a60c48401528160e48401528161010484015230610124840152426101448401525af194851561387357839484978597613916575b50851061387e575b861061376d575b508798509160609391887fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f66214969499979899511490505f1461376857915b60405192835260208301526040820152a29082915f8080613540565b61374c565b6020613795849b83516040519d8e80948193635323fe1560e11b835230903060048501613b84565b03925af190811561387357899a849a98999a9261380e575b507fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f6621496949282826137e560609997958c955130614908565b51845260076020526137fc60408520918254612ef7565b9055929496505091939796959761370f565b975094929050602095939195873d60201161386b575b8161383160209383612dc6565b81010312610978579551899693959294919392917fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f662146137ad565b3d9150613824565b6040513d85823e3d90fd5b8360206138a68d8651604051948580948193635323fe1560e11b835230903060048501613b84565b03925af19081156109be5785916138e4575b506138c581855130614908565b8351855260076020526138dd60408620918254612ef7565b9055613708565b90506020813d60201161390e575b816138ff60209383612dc6565b8101031261097857515f6138b8565b3d91506138f2565b9550955095506060843d606011613958575b8161393560609383612dc6565b810103126139545783519560406020860151950151969496955f613700565b8280fd5b3d9150613928565b8361396e9194929394612dc6565b61397b579084915f61366e565b8480fd5b61398c9194505f90612dc6565b5f925f613625565b916135bd565b6302f33c2b60e31b5f5260045ffd5b5080151561354f565b5081151561353b565b90508401355f6134f0565b959493929190601f198416815f5260205f20905f5b818110613a3e57509160609493917f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f6392197989987809510613a25575b5050600183811b019055613503565b8501355f19600386901b60f8161c191690555f80613a16565b8986013583556020998a01998e99508f9850600190930192016139db565b91939550809294505f5260205f20601f860160051c81019160208710613aad575b918b959391601f8c9896940160051c01905b818110613a9c57506134b2565b5f81558b97508c9650600101613a8f565b9091508190613a7d565b638fc6f59b60e01b5f5260045ffd5b631b68fd9560e21b5f5260045ffd5b63ffe25d7160e01b5f5260045ffd5b8181029291811591840414171561216d57565b90816020910312610978575180151581036109785790565b92610120949197969592613b608561014081019a60808091805184526020810151602085015260018060a01b03604082015116604085015260018060a01b0360608201511660608501520151910152565b60a085015260c0840152151560e08301526001600160a01b03166101008201520152565b6001600160a01b0391821681526020810192909252909116604082015260600190565b8115613bb1570490565b634e487b7160e01b5f52601260045260245ffd5b91906014602b6132db926040519481869260208401986a504d41524b45543a59455360a81b8a52858501378201906bffffffffffffffffffffffff199060601b16838201520301600b19810184520182612dc6565b61034052610320525f6102e0525f6102c0525f6102a0525f610280525f610260525f610240525f610220525f610200525f610300525f6101e0525f6101c0525f6101a0525f610180525f610160525f61014052600554610100526101005161034051101561401c57613c926103205161034051612eea565b6101205261010051610120511161400f575b613cb46103405161012051612ef7565b60e052613cc260e051612fad565b6102e052613cd160e051612fad565b6102c052613ce060e051612fad565b6102a052613cef60e051612fad565b61028052613cfe60e051612fad565b61026052613d0d60e051612fad565b61024052613d1c60e051612fad565b61022052613d2b60e051612fad565b61020052613d3a60e051612f95565b613d476040519182612dc6565b60e0518152601f19613d5a60e051612f95565b015f5b818110613ffe5750508061030052613d7660e051612fad565b6101e052613d8560e051612fad565b6101c052613d9460e051612fad565b6101a052613da360e051612fad565b61018052613db260e051612fad565b61016052613dc160e051612fad565b610140525f60c0525b60e05160c05103613def575061010051610120511015613deb576101205190565b5f90565b613e016130ad60c05161034051612eea565b90549060031b1c60a05260a0515f52600660205260405f2060a051613e2b60c0516102e051612fed565b5260a0515f52600760205260405f2054613e4a60c0516102c051612fed565b52613e5660a0516132af565b90815f52600760205260405f2054613e7360c0516102a051612fed565b52600281549160018060a01b038316613e9160c05161028051612fed565b52613ea160c05161026051612fed565b60ff8460a01c1615159052613ebb60c05161024051612fed565b60ff8460a81c16151590526001810154613eda60c05161022051612fed565b520154613eec60c05161020051612fed565b5260a0515f526008602052613f0360405f20612de8565b613f0f60c05185612fed565b52613f1c60c05184612fed565b508060b81c613f3060c0516101e051612fed565b52613f4060c0516101c051612fed565b60b082901c60ff16151590526001600160a01b0316613f6e575b50613f6660c051612fdf565b60c052613dca565b60a051613f7f9161046890826141c4565b613f8e60c05161018051612fed565b52613f9e60c0516101a051612fed565b52613fae60c05161018051612fed565b51613fbe60c05161016051612fed565b52613fe8613fd160c0516101a051612fed565b51613fe160c05161018051612fed565b5190612eea565b613ff760c05161014051612fed565b525f613f5a565b806060602080938601015201613d5d565b6101005161012052613ca4565b60405190602061402c8184612dc6565b5f83525f368137604051926140418285612dc6565b5f84525f368137604051936140568386612dc6565b5f85525f3681376040519461406b8487612dc6565b5f86525f36813760405161407f8582612dc6565b5f81525f3681376040516140938682612dc6565b5f81525f368137604051906140a88783612dc6565b5f82525f368137604051926140bd8885612dc6565b5f84525f368137604051996140d2898c612dc6565b5f8b52601f1989015f5b8181106141b55750509188999a9391899897969593604051966140ff8b89612dc6565b5f808952368137604051986141148c8b612dc6565b5f808b523681376040519a6141298d8d612dc6565b5f808d523681376040519c61413e908e612dc6565b5f808e523681376040519d8e6141548282612dc6565b5f9052365f908137506040519e8f61416c8282612dc6565b5f905250365f9081376102e0526102c0526102a0526102805261026052610240526102205261020052610300526101e0526101c0526101a0526101805261016052610140525f90565b60608d82018c01528a016140dc565b5f60806040516141d381612daa565b82815282602082015282604082015282606082015201528181105f1461421f57905b6040519161420283612daa565b82526020820152306040820152306060820152600a608082015290565b6141f5565b80519060208101519060018060a01b0360408201511690608060018060a01b0360608301511691015191604051936020850195865260408501526060840152608083015260a082015260a081526132db60c082612dc6565b919061428783614224565b6040516315895f4760e31b815260048101919091529060e0826024817f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03165afa938415612116575f925f95614306575b5051036142f6576001600160701b03809116921690565b6001600160701b03928316921690565b90945061432391925060e03d60e011612a9057612a788183612dc6565b5050505050919091935f6142df565b91908215612f58578261434491613ae4565b91612710830292808404612710149015171561216d5761436391612ef7565b6127069081810291818304149015171561216d5761438091613ba7565b6001810180911161216d5790565b919082156143e157826143a091613ae4565b91612710830292808404612710149015171561216d576143bf91612ef7565b916127100391612710831161216d57614380926143db91613ae4565b90613ba7565b505050505f90565b61447790614472612f4f949361446861440b6144058386612eea565b83614a45565b9161444461443d61444a8960011c61444461443d61443661442f600a8d8a8761438e565b938c612ef7565b9287612eea565b8092612eea565b90614a45565b966144628a61445c600a84888461438e565b92612ef7565b93612eea565b9260021b90612eea565b612eea565b906146d6565b9092915f93825f52600360205260405f20604051906060820182811067ffffffffffffffff8211176122c257604052549063ffffffff82169485825261ffff8360201c169561ffff602084019488865260301c16604084019781895282171715614681576145ba575b50505061ffff8351166144f857505050565b8161450291612eea565b908161450d57505050565b81670de0b6b3a764000082969495960291670de0b6b3a764000081840414901517021561274d57046706f05b59d3b2000081111561458e576706f05b59d3b1ffff19810190811161216d5761ffff6706f05b59d3b2000091935b51168381029381850414901517021561274d576706f05b59d3b20000612f4f920490612eea565b6706f05b59d3b20000036706f05b59d3b20000811161216d5761ffff6706f05b59d3b200009193614567565b5f9081526006602052604090208151905493979360b81c9063ffffffff1681811061466357506001600160481b035f5b1690421061460e5750509061ffff61460492511690612eea565b935b5f80806144e6565b809793979291924211614624575b505050614606565b9163ffffffff61464b6146549361ffff61464361465a989c9742612ef7565b915116613ae4565b91511690613ba7565b90612eea565b935f808061461c565b81036001600160481b03811161216d576001600160481b03906145ea565b505f9750505050505050565b8181029181159183041417612710021561274d57612710808204910615150190565b61271061272782029161272781840414901517021561274d57612710808204910615150190565b81810291811591830414176753444835ec580000021561274d576753444835ec580000808204910615150190565b916127069283810293818504149015171561216d576147239083613ae4565b90612710810290808204612710149015171561216d57612f4f926143db91612eea565b9091926127100390612710821161216d576147239161476491613ae4565b9283613ae4565b906147768183612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c916147ca6147c36147bc6147b5600a868a89614746565b9588612eea565b9484612ef7565b8094612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d576148128161480c89614806600a886148199784614746565b92612eea565b94612ef7565b8093612eea565b9384670de0b6b3a7640000840293670de0b6b3a764000081860414901517021561274d576753444835ec5800009561485c956144729404940460021b9104612eea565b918281029281840414901517021561274d576753444835ec580000900490565b612f4f9291614472614477926144686148986144058584612eea565b916144446148bc61444a8960011c6144446148bc61443661442f600a8d8a8761438e565b9182612eea565b5f516020614a6d5f395f51905f526149035f9294939460018060a01b031693848452600160205260408420868552602052604084206102a7828254612eea565b0390a4565b915f516020614a6d5f395f51905f526149035f939460018060a01b031692838552600160205260408520868652602052604085206102a7828254612ef7565b805f52600760205260405f2054305f52600160205260405f20825f5260205260405f205490039060018060a01b037f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c422165f52600160205260405f20905f5260205260405f2054900390565b6149bc8282612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c91614a026149fb6147bc6147b5600a868a89614746565b9384612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d57614a3e8161480c89614806600a886148199784614746565b9283612eea565b81670de0b6b3a7640000820291670de0b6b3a764000081840414901517021561274d57049056fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859

Deployed Bytecode Sourcemap

4125:43686:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;31311:4;31291:25;;31311:4;;;31417:10;:27;;:58;;;31287:484;31413:121;;-1:-1:-1;;;;;;;;;;;31287:484:0;4125:43686;32389:50;31287:484;;-1:-1:-1;;;;;4125:43686:0;;31785:10;:20;;;31781:509;;31287:484;4125:43686;;;;;;;;;;;;;;;;;32300:31;4125:43686;;;32300:31;:::i;:::-;4125:43686;;;;;;;;;;;;;;;;;32341:33;4125:43686;;;32341:33;:::i;:::-;4125:43686;;;;;31785:10;4125:43686;;;;;;;;;;;;;;;;;32389:50;;;;4125:43686;;;;;;;31781:509;31311:4;31906:23;;:54;;;31781:509;;31900:380;4125:43686;;;;;;;;;;31785:10;-1:-1:-1;4125:43686:0;;;;;;;;;;;31781:509;31981:285;4125:43686;;;32058:9;4125:43686;;;;;;;31785:10;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;46733:557;4125:43686;32117:28;;32113:135;;31981:285;;;31781:509;;32113:135;32209:16;;;:::i;:::-;4125:43686;;;32058:9;4125:43686;;;;;;;;;;31785:10;4125:43686;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;32113:135;;;;31906:54;-1:-1:-1;31785:10:0;31955:4;-1:-1:-1;;;;;4125:43686:0;31933:27;31906:54;;31413:121;-1:-1:-1;;;31502:17:0;;4125:43686;30968:17;31502;31417:58;-1:-1:-1;31417:10:0;31470:4;-1:-1:-1;;;;;4125:43686:0;31448:27;;31417:58;;31287:484;31574:4;-1:-1:-1;;;;;4125:43686:0;31554:25;;31550:221;;31287:484;-1:-1:-1;;;;;;;;;;;31287:484:0;4125:43686;32389:50;31287:484;;;31550:221;-1:-1:-1;;;;;4125:43686:0;;31311:4;31675:86;31550:221;31675:86;-1:-1:-1;;;31729:17:0;;4125:43686;30968:17;31729;4125:43686;;;;;;;;;;;:::i;:::-;36899:17;37014:25;36899:17;36953:21;36899:17;;;:::i;:::-;36953:21;;:::i;:::-;37014:25;:::i;:::-;37057:9;;;;;;:21;;;4125:43686;37057:32;;;4125:43686;;;;37135:39;;;;;:::i;:::-;37246:10;;;;;:::i;:::-;37283;;;;;:::i;:::-;37321:13;37503:31;37421:46;37379:16;37321:13;;;;:::i;:::-;37379:16;;;:::i;:::-;37421:46;;;;:::i;:::-;37503:31;;;;:::i;:::-;37552:6;37548:51;;4125:43686;-1:-1:-1;4125:43686:0;;37636:7;4125:43686;;;;;37636:21;;4125:43686;;;;;;;37680:13;;;;;;:29;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37680:29;;;;;;37548:51;37580:6;5244:2;;37580:6;5244:2;;;48284:217;37580:6;48284:217;;;37580:6;48284:217;;;;;;;;;;;;;;;4125:43686;37548:51;;48284:217;;;;4125:43686;48284:217;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;37057:32;37082:7;;;;37057:32;;:21;37070:8;;;;37057:21;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;27952:5;27945:12;;4125:43686;;27998:10;4125:43686;;27983:14;4125:43686;;;;;;;;;;;;;;;;;;;28030:31;4125:43686;27998:10;28030:31;;4125:43686;;;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;23016:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;23051:24;4125:43686;;;;;;;23112:11;:40;;;;4125:43686;;;;;23187:10;;4125:43686;;23272:17;;;:::i;:::-;23326:21;;;;;:::i;:::-;23388:25;;;;;:::i;:::-;23431:8;;;;;:19;;;4125:43686;;;;;;;23498:16;23611:40;;;;;;:::i;:::-;23669:19;;;4125:43686;;23791:48;;;23875:31;23791:48;;;:::i;:::-;23875:31;;;:::i;:::-;23924:6;23920:51;;4125:43686;24009:5;;;;4125:43686;;;24033:29;:13;;;:29;:13;;;:29;;;;24080:19;;4125:43686;;24189:30;24164:15;4125:43686;24164:15;;;;;;:::i;:::-;4125:43686;;;;-1:-1:-1;;;24189:30:0;;-1:-1:-1;;;;;4125:43686:0;;;;24189:30;;4125:43686;;;;;;;;;;;;;;;;;;24189:30;;4125:43686;;24189:9;-1:-1:-1;;;;;4125:43686:0;24189:30;;;;;;;;24033:29;24300:10;24319:5;24300:10;;;24319:5;:::i;:::-;4125:43686;;;24335:11;4125:43686;;;;;24335:27;4125:43686;;;24335:27;:::i;:::-;4125:43686;;24476:5;47477:225;;;24476:5;:::i;:::-;4125:43686;;;24335:11;4125:43686;;;;;24492:27;4125:43686;;;24492:27;:::i;:::-;4125:43686;;24529:4;-1:-1:-1;;;;;4125:43686:0;;24529:41;;;;;4125:43686;;-1:-1:-1;;;24529:41:0;;47477:225;4125:43686;24529:41;;4125:43686;;;;;;;;;;;;;47477:225;4125:43686;;;47477:225;;24529:41;;;;;;;;;;;24033:29;4125:43686;;24580:211;4125:43686;;;;;;;;;;;;;24580:211;;24766:15;47477:225;;;;24580:211;4125:43686;24580:211;;;:::i;:::-;;;;;;;;;;;;;24033:29;4125:43686;;;;;;;;;24870:65;;47477:225;;;24870:65;47477:225;;;4125:43686;24870:65;;;:::i;:::-;;;;;;;;;;;;;24033:29;4125:43686;24949:11;;;24945:119;;24033:29;47477:225;25184:6;47477:225;;;25184:6;:::i;:::-;4125:43686;;24335:11;4125:43686;;;;;25201:27;4125:43686;;;25201:27;:::i;:::-;4125:43686;;;;;;;;;;;;25244:38;24300:10;;25244:38;;47477:225;47722:81;4125:43686;;;;;;;;;;24945:119;25004:6;47477:225;;;25004:6;:::i;:::-;4125:43686;;;24335:11;4125:43686;;25025:28;4125:43686;;;;;;25025:28;:::i;:::-;4125:43686;;24945:119;;;24870:65;;4125:43686;24870:65;;4125:43686;24870:65;;;;;;4125:43686;24870:65;;;:::i;:::-;;;4125:43686;;;;;;;24870:65;;4125:43686;-1:-1:-1;4125:43686:0;;24870:65;;;-1:-1:-1;24870:65:0;;;4125:43686;;;;;;;;;24580:211;4125:43686;24580:211;;4125:43686;24580:211;;;;;;4125:43686;24580:211;;;:::i;:::-;;;4125:43686;;;;;24580:211;;;;;-1:-1:-1;24580:211:0;;;4125:43686;;;;;;;;;24529:41;;;;;:::i;:::-;4125:43686;;24529:41;;;;4125:43686;;;;24529:41;4125:43686;;;;;;;;;24189:30;;;4125:43686;24189:30;4125:43686;24189:30;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;4125:43686;;;;;;;;;;-1:-1:-1;;;4125:43686:0;;;;;24033:29;;;;23920:51;23952:6;5244:2;;;23952:6;5244:2;;;48284:217;23952:6;48284:217;;;23952:6;48284:217;;;;;;;;;;;;24009:5;23920:51;;48284:217;;;;4125:43686;48284:217;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;23431:19;23443:7;;;;23431:19;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;23112:40;4125:43686;;;;23127:15;:25;23112:40;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;47477:225;;;;4125:43686;47477:225;;4125:43686;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;25569:7;4125:43686;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;25604:24;4125:43686;;;;;;;25665:11;:40;;;;4125:43686;;;;;25740:9;;4125:43686;;25824:17;;;:::i;:::-;25878:21;;;;;:::i;:::-;25940:25;;;;;:::i;:::-;25983:8;;;;;:19;;;4125:43686;;;;;;;26050:15;26161:39;;;;;;:::i;:::-;26218:19;;;4125:43686;;26340:46;;;26422:31;26340:46;;;:::i;:::-;26422:31;;;:::i;25983:19::-;25995:7;;;;25983:19;;25665:40;4125:43686;;;;25680:15;:25;25665:40;;;4125:43686;;;;;;;;;;;;;;32618:10;4125:43686;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;38208:12;38234:11;38259:16;38289;4125:43686;;;;38349:7;4125:43686;;;;;;;;;;;;;;;;38473:5;38505:16;4125:43686;38473:5;;4125:43686;38505:16;;4125:43686;;;;;38538:12;4125:43686;;;;;;;:::i;:::-;;;;;38641:11;4125:43686;;;;;;;38695:17;;;;:::i;:::-;4125:43686;;38641:11;4125:43686;;;;38728:22;;38724:236;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38724:236;38812:17;;;4125:43686;38812:17;;;38858:28;38812:17;;;4125:43686;38812:17;;;38793:37;38812:17;;;:::i;38858:28::-;38844:42;;;;;;38939:10;38844:42;;38939:10;:::i;:::-;38724:236;;;;;;;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;6140:49;4125:43686;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;:::i;:::-;47477:225;;;;;;;;4125:43686;;;29654:7;4125:43686;;;;;;;;;;;;;;;;;;;;;;;29748:40;;29829:10;4125:43686;;;;;;;;;;;;;;;;;29865:15;;;4125:43686;;29947:16;;;4125:43686;5207:4;48284:217;;;;;;;;;;;;5207:4;4125:43686;48284:217;;29829:10;30003;29829;;;30003;:::i;:::-;4125:43686;;;30024:11;4125:43686;;;;;30024:32;4125:43686;;;30024:32;:::i;:::-;4125:43686;;30067:5;:15;4125:43686;;;30067:15;:::i;:::-;4125:43686;;;;-1:-1:-1;;;30092:30:0;;-1:-1:-1;;;;;4125:43686:0;;;30092:30;;4125:43686;;;;;;;;;;;;;;30092:30;4125:43686;;30092:9;-1:-1:-1;;;;;4125:43686:0;30092:30;;;;;;;30138:38;30092:30;4125:43686;30092:30;;;29748:40;-1:-1:-1;4125:43686:0;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;30138:38;47722:81;47477:225;47722:81;4125:43686;;30092:30;;;4125:43686;30092:30;4125:43686;30092:30;;;;;;;:::i;:::-;;;48284:217;;;;4125:43686;48284:217;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;29748:40;29771:17;;;:::i;:::-;29748:40;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;33169:10;33118:28;4125:43686;;33041:37;33060:17;;;:::i;33118:28::-;33169:10;;;;:::i;:::-;4125:43686;;;;;;;;;;;;;;;;;;:::i;:::-;34808:28;34750:17;34731:37;34750:17;;;:::i;34808:28::-;34854:11;;;;;:23;;;4125:43686;34854:34;;;4125:43686;;;;34933:39;;;;;:::i;:::-;35015:10;;;;;:::i;:::-;35052:11;35270:31;35052:11;;;;:::i;:::-;35091:12;;35187:47;35148:16;35091:12;;;;:::i;:::-;35148:16;;;:::i;:::-;35187:47;;;;:::i;:::-;35270:31;;:::i;:::-;35319:6;35315:63;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35315:63;35359:6;5244:2;;;;;;35359:6;5244:2;;;35339:39;4125:43686;35339:39;;;;;;:::i;:::-;35315:63;;;;;;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;34854:34;34881:7;;;;34854:34;;:23;34869:8;;;;34854:23;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;6085:49;4125:43686;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;431:62;4125:43686;;;;;;-1:-1:-1;4125:43686:0;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;32743:7;4125:43686;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;32777:24;;;;:39;;4125:43686;32777:68;;;4125:43686;;;;;;;;;;32777:68;4125:43686;;;;32820:15;:25;32777:68;;;:39;4125:43686;;;;;;;32805:11;32777:39;;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;6035:44;4125:43686;;;;;6035:44;;4125:43686;6035:44;;4125:43686;6035:44;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;47477:225;;;;;;;4125:43686;;;11813:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;11848:24;;4125:43686;;11909:10;:24;4125:43686;;;;;;;;;;;;;;;;;;;12060:15;:25;4125:43686;;;;;-1:-1:-1;;;;;4125:43686:0;12060:15;4125:43686;;-1:-1:-1;;;;;;4125:43686:0;;;;;;12060:15;;4125:43686;;12161:45;4125:43686;11909:10;12161:45;;47722:81;47477:225;47722:81;4125:43686;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;47477:225;;;;4125:43686;47477:225;;4125:43686;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;17520:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;17555:24;4125:43686;;;;;;;17616:11;:40;;;;4125:43686;;;;;17691:11;;4125:43686;;17777:17;;;:::i;:::-;17831:21;;;;:::i;:::-;17893:25;;;;;:::i;:::-;17936:8;;;;;;:19;;;4125:43686;;;;17991:13;;;4125:43686;;;;;;18060:15;18221:71;;;;;;:::i;:::-;18391:20;;;4125:43686;;18553:54;;;:::i;:::-;5244:2;18610:1;5244:2;;;;;;;18530:81;18596:1;5244:2;;;;;;;18625:27;;18928:31;18625:27;;;;18621:60;;4125:43686;-1:-1:-1;18708:23:0;;;;;;:49;;;18843;;;;;:::i;:::-;18928:31;;;:::i;:::-;18977:6;18973:55;;18708:49;19056:10;;;4125:43686;;19129:17;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;;;19176:56:0;;19199:10;4125:43686;19176:56;;4125:43686;47477:225;4125:43686;;;;;;;;;;;;;;;-1:-1:-1;;;;;19176:9:0;4125:43686;19176:56;;;;;;;4125:43686;19176:56;;;;18708:49;19242:5;;:14;4125:43686;;;19242:14;:::i;:::-;4125:43686;;19333:6;47477:225;;;19333:6;:::i;:::-;4125:43686;;;19350:11;4125:43686;;;;;19350:27;4125:43686;;;19350:27;:::i;:::-;4125:43686;;19387:4;-1:-1:-1;;;;;4125:43686:0;;19387:41;;;;;4125:43686;;-1:-1:-1;;;19387:41:0;;47477:225;4125:43686;19387:41;;4125:43686;;;;;;;;;;;;;47477:225;4125:43686;;;47477:225;19387:41;;;;;;;;;18708:49;4125:43686;;;;19530:71;4125:43686;;;;;;;;;;;;;;;19530:71;;19585:15;;19530:71;4125:43686;19530:71;;;:::i;:::-;;;;;;;;;;;;;;;;18708:49;4125:43686;;;;;;;;;19703:64;;47477:225;;;19703:64;47477:225;;;4125:43686;19703:64;;;:::i;:::-;;;;;;;;;;;;;;18708:49;19781:8;4125:43686;19781:8;;;;20002:32;19781:8;19777:108;;18708:49;-1:-1:-1;;4125:43686:0;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;20002:32;47477:225;47722:81;4125:43686;;;;;;;;;;19777:108;19832:3;47477:225;;;19832:3;:::i;:::-;4125:43686;;19350:11;4125:43686;;19850:24;4125:43686;;;;;;19850:24;:::i;:::-;4125:43686;;19777:108;;;;19703:64;;;;4125:43686;19703:64;;4125:43686;19703:64;;;;;;4125:43686;19703:64;;;:::i;:::-;;;4125:43686;;;;;;;19703:64;;;;;-1:-1:-1;19703:64:0;;19530:71;;;;4125:43686;19530:71;;4125:43686;19530:71;;;;;;4125:43686;19530:71;;;:::i;:::-;;;4125:43686;;;;;19530:71;;;;;;;-1:-1:-1;19530:71:0;;19387:41;;;;;;:::i;:::-;4125:43686;;19387:41;;;4125:43686;;;;19387:41;4125:43686;;;;;;;;;19176:56;;;4125:43686;19176:56;4125:43686;19176:56;;;;;;;:::i;:::-;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;18973:55;18572:6;5244:2;;;;;;18572:6;5244:2;;;18993:35;;;;:::i;:::-;18973:55;;;;18708:49;;;;;;18621:60;5244:2;;18621:60;;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;17936:19;17948:7;;;;17936:19;;17616:40;4125:43686;;;;17631:15;:25;17616:40;;;4125:43686;;;;;;;;;;;;;;;5330:27;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;46733:557;;;;;;4125:43686;46733:557;4125:43686;;46733:557;;;4125:43686;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;5794:44;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5392:33;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;:::i;:::-;;;:::i;:::-;-1:-1:-1;;;;;4125:43686:0;;;;;569:84;4125:43686;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;:::i;:::-;;;;:::i;:::-;1285:10;;4125:43686;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:10;1332:43;4125:43686;1285:10;1332:43;;4125:43686;;;1392:4;4125:43686;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;6002:27;4125:43686;6002:27;;;;;4125:43686;6002:27;;;:::i;:::-;4125:43686;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;:::i;:::-;47477:225;;;;;;;4125:43686;;;28172:7;4125:43686;;;;;;;47711:1;;-1:-1:-1;;;;;4125:43686:0;;;28207:24;;4125:43686;;28268:10;;:24;4125:43686;;;;;;;;;;;28376:15;:26;4125:43686;;;;;28483:14;4125:43686;;;;;;;;28523:11;28519:206;;4125:43686;28784:17;;;;;:::i;:::-;28829:19;28875:18;28829:19;;;:::i;:::-;28875:18;;:::i;:::-;28949:258;;;;29014:12;;:26;;;28949:258;29010:47;;28949:258;29311:26;;;;;;29355:16;;4125:43686;;;29426:5;;4125:43686;48284:217;5207:4;48284:217;;;5207:4;48284:217;;;;;;;;;;;;29400:16;;;4125:43686;;;-1:-1:-1;;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;-1:-1:-1;;;4125:43686:0;;;29520:27;;4125:43686;;;;;;;;;29520:27;47722:81;47477:225;47722:81;4125:43686;;;-1:-1:-1;;;4125:43686:0;;;;;29311:26;;;;;29010:47;29042:15;;-1:-1:-1;29010:47:0;;29014:26;29030:10;;;;29014:26;;28949:258;29139:11;;:26;;;28949:258;29135:46;28949:258;29135:46;4125:43686;;-1:-1:-1;28949:258:0;;29139:26;29154:11;;;;29139:26;;28519:206;4125:43686;28565:5;;4125:43686;28583:6;28565:14;4125:43686;;28565:14;;;:::i;:::-;4125:43686;28607:8;;28603:112;;28519:206;;;;;28603:112;28665:35;28635:12;;;4125:43686;28635:12;;:::i;28665:35::-;;4125:43686;;28665:9;-1:-1:-1;;;;;4125:43686:0;28665:35;;;;;;;;28603:112;;;;;;28665:35;;;4125:43686;28665:35;4125:43686;28665:35;;;;;;;:::i;:::-;;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;;20284:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;20319:24;4125:43686;;;;;;;20380:11;:40;;;;4125:43686;;;;;20455:10;;4125:43686;;20540:17;;;:::i;:::-;20594:21;;;;;:::i;:::-;20656:25;;;;;:::i;:::-;20699:8;;;;;;:19;;;4125:43686;;;;20754:11;;;4125:43686;;;;;;20821:16;20985:70;;;;;;:::i;:::-;21154:20;;;;4125:43686;;21316:54;;;:::i;:::-;5244:2;21373:1;5244:2;;;;;;;21293:81;5244:2;21359:1;5244:2;;;;;;;21388:27;21689:31;21388:27;;;;;;;21606:47;21388:27;;21384:60;;4125:43686;-1:-1:-1;21471:23:0;;;;;;:49;;21606:47;:::i;:::-;21689:31;;;:::i;:::-;21738:6;21734:55;;21471:49;21817:10;;;4125:43686;;21890:17;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;;;21937:56:0;;21960:10;4125:43686;21937:56;;4125:43686;47477:225;4125:43686;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21937:9:0;4125:43686;21937:56;;;;;;;4125:43686;21937:56;;;21471:49;22003:5;;:14;4125:43686;;;22003:14;:::i;:::-;4125:43686;;22056:6;47477:225;;;22056:6;:::i;:::-;4125:43686;;;22073:11;4125:43686;;;;;22073:28;4125:43686;;;22073:28;:::i;:::-;4125:43686;;22111:4;-1:-1:-1;;;;;4125:43686:0;;22111:42;;;;;4125:43686;;-1:-1:-1;;;22111:42:0;;47477:225;4125:43686;22111:42;;4125:43686;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;-1:-1:-1;22111:42:0;;;;;;;;;;;;21471:49;4125:43686;;22255:70;4125:43686;;;;;;;;;;;;;22255:70;;22309:15;;22255:70;4125:43686;22255:70;;;:::i;22111:42::-;4125:43686;22111:42;;;;;4125:43686;22111:42;;;:::i;:::-;22255:70;4125:43686;22111:42;;;;;;;;4125:43686;;;;;;;;;21937:56;;;4125:43686;21937:56;4125:43686;21937:56;;;;;;;:::i;:::-;;;4125:43686;;;;;;;;;21734:55;21335:6;5244:2;;;;;21335:6;5244:2;;;21754:35;;;:::i;:::-;21734:55;;;;5244:2;;;;4125:43686;5244:2;;4125:43686;5244:2;;4125:43686;5244:2;21471:49;;;;21606:47;:::i;21384:60::-;5244:2;;21384:60;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;20699:19;20711:7;;;;20699:19;;4125:43686;;;;;;;;;;;;;;;;;;20380:40;4125:43686;;;;20395:15;:25;20380:40;;;4125:43686;;;;;;;;;47477:225;;4125:43686;47477:225;4125:43686;47477:225;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;;;;;:::i;:::-;5244:2;;;4125:43686;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;-1:-1:-1;;;;;4125:43686:0;;:::i;:::-;;;;6195:57;4125:43686;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1057:10;;;4125:43686;;1047:9;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1057:10;1105:41;4125:43686;1057:10;1105:41;;4125:43686;;;1163:4;4125:43686;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;-1:-1:-1;;4125:43686:0;;;;;9834:69;4125:43686;;;;;;9834:69;;:::i;:::-;9961:16;9980:5;4125:43686;9961:16;;:::i;:::-;4125:43686;9961:24;:51;;;;4125:43686;9957:79;;4125:43686;10054:15;;:::i;:::-;4125:43686;10054:20;:48;;;;;4125:43686;;;;;;;;10131:8;4125:43686;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9961:16;4125:43686;;;;;;;;;;;;;;;;;;;;;;;10274:30;4125:43686;;;;;;;;;;;;;;10274:30;4125:43686;;;;;;;;;;;10021:15;;;4125:43686;;;;;10054:48;10078:15;;4125:43686;-1:-1:-1;;;;;10078:15:0;;:::i;:::-;4125:43686;;;;10078:24;;10054:48;;;9961:51;9989:15;9980:5;4125:43686;9989:15;;:::i;:::-;4125:43686;9989:23;9961:51;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;35784:17;35842:28;35784:17;35765:37;35784:17;;;:::i;35842:28::-;35888:10;;;;:22;;;4125:43686;35888:33;;;4125:43686;;;;35967:40;;;;;:::i;:::-;36078:10;;;;;:::i;:::-;36116:12;;;;:::i;:::-;36155;36337:31;36155:12;36253:48;36211:16;36155:12;;;;:::i;:::-;36211:16;;;:::i;:::-;36253:48;;;;:::i;:::-;36337:31;;;:::i;:::-;36386:6;36382:51;;4125:43686;-1:-1:-1;4125:43686:0;;;;36470:7;4125:43686;;;;;36470:21;;4125:43686;;;36514:13;;;;;;:29;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36382:51;36414:6;5244:2;;36414:6;5244:2;;;48284:217;36414:6;48284:217;;;36414:6;48284:217;;;;;;;;;;;4125:43686;48284:217;;36382:51;;;48284:217;;4125:43686;48284:217;4125:43686;48284:217;;35888:33;35914:7;;;;35888:33;;:22;35902:8;;;;35888:22;;4125:43686;;;;;;;:::i;:::-;;33690:28;33632:17;33613:37;33632:17;;;:::i;33690:28::-;33736:13;;;;:25;;;4125:43686;33736:36;;;4125:43686;;;;33877:71;;;;;:::i;:::-;34024:10;;;;;:::i;:::-;34281:31;34062:13;;;;;:::i;:::-;34102:11;34196:49;34157:16;34102:11;;;;:::i;34157:16::-;34196:49;;;;:::i;:::-;34281:31;;:::i;:::-;34330:6;34326:63;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34326:63;34370:6;5244:2;;;;;;34370:6;5244:2;;;4125:43686;34350:39;;;;:::i;:::-;34326:63;;;;33736:36;33765:7;;;;33736:36;;:25;33753:8;;;;33736:25;;4125:43686;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4125:43686:0;;30494:4;30474:25;;30494:4;;;30602:10;:27;;:58;;;30470:526;30598:121;;30470:526;774:10;4125:43686;;764:9;4125:43686;;;;;;;;;;;;;764:35;4125:43686;;;764:35;:::i;:::-;4125:43686;;;;;764:9;4125:43686;;;;;;;;;;;;;809:33;4125:43686;;;809:33;:::i;:::-;4125:43686;;;;;774:10;4125:43686;;;;;;;;;;-1:-1:-1;;;;;;;;;;;857:54:0;4125:43686;;;;857:54;4125:43686;30598:121;30968:17;;;4125:43686;30687:17;4125:43686;;30687:17;30602:58;-1:-1:-1;30602:10:0;30655:4;-1:-1:-1;;;;;4125:43686:0;30633:27;;30602:58;;30470:526;30759:4;-1:-1:-1;;;;;4125:43686:0;30739:25;;30470:526;30735:261;30968:17;;;4125:43686;30968:17;4125:43686;;30968:17;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;44665:37;44684:17;;;:::i;44665:37::-;44721:12;;;:::i;:::-;4125:43686;;-1:-1:-1;;;44804:18:0;;4125:43686;44804:18;;4125:43686;;;;;;;;44804:18;4125:43686;44804:4;-1:-1:-1;;;;;4125:43686:0;44804:18;;;;;;;4125:43686;44804:18;4125:43686;;;;;;;;44804:18;;;4125:43686;;;;;;;44836:19;44832:143;44836:19;;;-1:-1:-1;;;;;4125:43686:0;;;;;44832:143;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;44832:143;-1:-1:-1;;;;;4125:43686:0;;;;;44832:143;;44804:18;;;;;;4125:43686;44804:18;;;;;4125:43686;44804:18;4125:43686;44804:18;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;44804:18:0;-1:-1:-1;44804:18:0;;;;;;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1508:25:0;;;:54;;;;4125:43686;;;;;;;;;1508:54;-1:-1:-1;;;1537:25:0;;-1:-1:-1;1508:54:0;;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;-1:-1:-1;;;;;4125:43686:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;46733:557;;;;;;4125:43686;46733:557;4125:43686;46733:557;;;4125:43686;;46733:557;;-1:-1:-1;;46733:557:0;;;;;;;;;;;;;;;;;;;;4125:43686;46733:557;8231:40;4125:43686;46733:557;;;;;;;;;;;;4125:43686;;8231:40;;;-1:-1:-1;;;4125:43686:0;8231:40;;4125:43686;;;;;;;;;;;;;;;8231:40;;46733:557;;8231:40;;;;;;:::i;4125:43686::-;;;;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;-1:-1:-1;;4125:43686:0;;;;:::o;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;:::o;:::-;6002:27;4125:43686;;;;;;6002:27;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;-1:-1:-1;4125:43686:0;:::o;:::-;5244:2;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;5244:2;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;46733:557;;4125:43686;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;4125:43686:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;4125:43686:0;;;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5244:2::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;44057:308::-;4125:43686;;;;44156:7;4125:43686;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;44187:24;44183:38;;4125:43686;;;;;44235:11;44231:25;;44270:16;;4125:43686;44270:21;44266:35;;4125:43686;;;;;;;44057:308;:::o;44318:40::-;44341:17;;;:::i;:::-;44057:308;:::o;44266:35::-;44293:8;;4125:43686;44293:8;:::o;44231:25::-;44248:8;;;4125:43686;44248:8;:::o;4125:43686::-;9961:16;4125:43686;;;;;;;;;:::o;:::-;9989:15;4125:43686;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;46733:557;4125:43686;46733:557;;4125:43686;;:::i;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;4125:43686:0;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;41974:2077::-;;;;42426:10;4125:43686;42457:12;;;;;42453:315;;42792:13;;;;:::i;:::-;42819:9;;;;42815:24;;41974:2077;42861:11;;;;:::i;:::-;42892:16;;;;:::i;:::-;42926;;;;:::i;:::-;42966;;;;:::i;:::-;43005;;;;:::i;:::-;43044;;;;:::i;:::-;43083:13;;;;:::i;:::-;43121;;;;:::i;:::-;43255:9;;4125:43686;43255:9;;;43266:6;;;;;;44023:21;;;;;;;;44024:9;;44023:21;44024:9;;;41974:2077;:::o;44023:21::-;;4125:43686;41974:2077;:::o;43274:3::-;43587:20;43310:9;;;;43299:21;43310:9;;;;:::i;:::-;43299:21;:::i;:::-;4125:43686;;;;;;43340:12;43441:14;43340:12;;;:::i;:::-;4125:43686;;;;;;43385:7;4125:43686;;;43412:15;4125:43686;;;;43412:15;;:::i;:::-;4125:43686;43441:14;:::i;:::-;4125:43686;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43552:21;;;:::i;43587:20::-;4125:43686;;;;;43652:19;4125:43686;;;;;;43652:19;;:::i;:::-;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;43704:24;;;;:32;;43274:3;43704:61;;;;;;43274:3;43685:81;;;:::i;:::-;4125:43686;;;;;43781:215;;43274:3;;;;;;;;:::i;:::-;43255:9;;;;;;;43781:215;43822:16;;4125:43686;;;;;;;;;43885:23;;43943:8;;;43942:39;43274:3;43942:39;;4125:43686;43942:39;43926:55;;;;:::i;:::-;4125:43686;43781:215;;;;;43942:39;48284:217;;;;;;;;;;;5207:4;48284:217;;;;5207:4;43274:3;48284:217;;43942:39;;43885:23;;;;;43704:61;4125:43686;;;;43740:15;:25;;-1:-1:-1;43704:61:0;;:32;;;;;;42815:24;42830:9;;;42815:24;;;42453:315;4125:43686;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;42485:272;;;;;;;4125:43686;42485:272;:::o;7432:149::-;4125:43686;;7532:40;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;;7532:40;;;;;;:::i;:::-;4125:43686;7522:51;;7432:149;:::o;8435:1090::-;;;;;;;;-1:-1:-1;;;;;4125:43686:0;8694:15;;8686:23;;4125:43686;;;8764:1;;-1:-1:-1;;;;;4125:43686:0;;;8744:22;;4125:43686;;8808:34;;;;;:::i;:::-;8859:17;;;;:::i;:::-;8764:1;4125:43686;;;8894:7;4125:43686;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;8982:216;;4125:43686;8764:1;4125:43686;;;;8982:216;;8764:1;4125:43686;;8982:216;;;4125:43686;;;;;8982:216;;;4125:43686;;;8982:216;;;4125:43686;8764:1;4125:43686;;8982:216;;;4125:43686;8764:1;4125:43686;;8764:1;4125:43686;8894:7;4125:43686;;;8764:1;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8982:216;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;;;;4125:43686:0;;;;;;;;;;;;;;;9209:10;4125:43686;;;;;;;;;;;;9209:10;4125:43686;;:::i;:::-;;;;;;;;;;46733:557;;;4125:43686;;;;;;;;8764:1;4125:43686;9244:12;4125:43686;;;8764:1;4125:43686;;;;;;;;;;;;;;;:::i;:::-;;;;;;8435:1090;4125:43686;8764:1;4125:43686;;;;;;;;8982:216;4125:43686;;;;;9296:46;4125:43686;8764:1;4125:43686;;;;;;;;46733:557;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;8764:1;4125:43686;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;9296:46;;;;9357:12;;;;;:27;;;4125:43686;9353:166;;4125:43686;8435:1090;;;;;;;:::o;9353:166::-;9408:27;;;9353:166;4125:43686;;;10460:17;;;:::i;:::-;10514:21;;;;;:::i;:::-;10644:4;10658:7;10644:4;;;10658:7;:::i;:::-;4125:43686;8764:1;4125:43686;10676:11;4125:43686;;;8764:1;4125:43686;10676:29;4125:43686;;;10676:29;:::i;:::-;4125:43686;;10742:6;10644:4;;;10742:6;:::i;:::-;8764:1;4125:43686;10676:11;4125:43686;;;8764:1;4125:43686;10759:27;4125:43686;;;10759:27;:::i;:::-;4125:43686;;;;;10825:16;;;;;10824:58;;;10892:4;-1:-1:-1;;;;;4125:43686:0;;10892:40;;;;;4125:43686;;-1:-1:-1;;;10892:40:0;;10644:4;10892:40;;;4125:43686;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;-1:-1:-1;10892:40:0;;;;;;;;;10824:58;10970:7;4125:43686;10970:7;;4125:43686;;10942:40;;;;;4125:43686;;-1:-1:-1;;;10942:40:0;;10644:4;10892:40;10942;;4125:43686;;;;;;;;;;;;;;;;;;;;10942:40;;;;;;;;;;;;;10824:58;-1:-1:-1;4125:43686:0;;;-1:-1:-1;;;11051:68:0;;4125:43686;;10892:40;11051:68;;4125:43686;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;8982:216;4125:43686;;;;;;;;;;;;;;;;;;;;;;;11051:68;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;10644:4;4125:43686;;;;8694:15;4125:43686;;;;11051:68;;;;;;;;8764:1;;;;11051:68;;;10824:58;11134:10;;;11130:211;;10824:58;11354:10;;11350:211;;10824:58;4125:43686;;;;;8982:216;4125:43686;;;11674:38;4125:43686;;;;;;;11608:16;11607:52;;;;;;;;4125:43686;;;;;;;;;;;;;11674:38;9353:166;;;;;;;;11607:52;;;11350:211;4125:43686;11394:67;4125:43686;;;;;;;;;;;;;;;11394:67;;10644:4;;;10892:40;11394:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;11350:211;4125:43686;11674:38;4125:43686;;;;;11505:3;8982:216;4125:43686;;;;;;10644:4;11505:3;:::i;:::-;4125:43686;;;10676:11;4125:43686;;11523:27;4125:43686;;;;;;11523:27;:::i;:::-;4125:43686;;11350:211;;;;;;;;;;;;;11394:67;;;;;;;4125:43686;11394:67;;;;;;4125:43686;11394:67;;;;;;4125:43686;11394:67;;;:::i;:::-;;;4125:43686;;;;;;;;11394:67;;;;;;;4125:43686;11674:38;11394:67;;;;;-1:-1:-1;11394:67:0;;;4125:43686;;;;;;;;;11130:211;4125:43686;;11174:67;4125:43686;;;;;;;;;;;;;;11174:67;;10644:4;;;10892:40;11174:67;;;:::i;:::-;;;;;;;;;;;;;;11130:211;4125:43686;11285:3;4125:43686;;;10644:4;11285:3;:::i;:::-;4125:43686;;;;10676:11;4125:43686;;11303:27;4125:43686;;;;;;11303:27;:::i;:::-;4125:43686;;11130:211;;11174:67;;;4125:43686;11174:67;;4125:43686;11174:67;;;;;;4125:43686;11174:67;;;:::i;:::-;;;4125:43686;;;;;11174:67;;;;;;-1:-1:-1;11174:67:0;;11051:68;;;;;;;8982:216;11051:68;;8982:216;11051:68;;;;;;8982:216;11051:68;;;:::i;:::-;;;4125:43686;;;;;;;;;;;;;;;11051:68;;;;;;;4125:43686;;;;11051:68;;;-1:-1:-1;11051:68:0;;10942:40;;;;;;;;;:::i;:::-;4125:43686;;10942:40;;;;;;4125:43686;;;;10892:40;;;;;8764:1;10892:40;;:::i;:::-;8764:1;10892:40;;;;10824:58;;;;4125:43686;;;;8764:1;4125:43686;;8764:1;4125:43686;9408:27;9424:11;;;;9408:27;;9357;9373:11;;;;9357:27;;4125:43686;;;;;;;;;;46733:557;;;;;;;;4125:43686;;;8764:1;4125:43686;;8764:1;4125:43686;;8764:1;4125:43686;;;;;;;;8982:216;4125:43686;;;9296:46;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;46733:557;;4125:43686;;;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;8764:1;4125:43686;;8764:1;4125:43686;;;;9209:10;4125:43686;;;;;;;;;;;;;;;;;;;;;9209:10;4125:43686;;;;;;;;;;;;;8764:1;4125:43686;;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;8764:1;4125:43686;;8764:1;4125:43686;;;;;8764:1;4125:43686;;8764:1;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;:::o;:::-;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;5244:2;;;4125:43686;;;;;;;;7202:224;;;4125:43686;;7363:54;7202:224;4125:43686;;7363:54;;;;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;;;;;;;7363:54;;;;;;;;;;;:::i;38972:2996::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39736:10;4125:43686;39736:17;;39767:12;;;;;;39763:582;;40369:13;;;;;;:::i;:::-;40355:27;;40396:9;;;;;40392:24;;38972:2996;40438:11;;;;;;:::i;:::-;;;40472:16;;;;:::i;:::-;40460:28;;40512:16;;;;:::i;:::-;40498:30;;40551:16;;;;:::i;:::-;40538:29;;40589:16;;;;:::i;:::-;40577:28;;40626:13;;;;:::i;:::-;40615:24;;40659:13;;;;:::i;:::-;40649:23;;40688:16;;;;:::i;:::-;40682:22;;40731:16;;;;:::i;:::-;40714:33;;4125:43686;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;46733:557;;4125:43686;;;;:::i;:::-;;;;;;;;;40757:23;;;;;40799:15;;;;:::i;:::-;40790:24;;40836:13;;;;:::i;:::-;40824:25;;40869:16;;;;:::i;:::-;40859:26;;40904:16;;;;:::i;:::-;40895:25;;40943:16;;;;:::i;:::-;40930:29;;40982:16;;;;:::i;:::-;40969:29;;4125:43686;41057:9;;41068:6;;;;;;;;-1:-1:-1;41941:9:0;;;;;;;;41940:21;;38972:2996;:::o;41940:21::-;4125:43686;38972:2996;:::o;41076:3::-;41100:21;41111:9;;;;;;:::i;41100:21::-;4125:43686;;;;;;;;;;;;41154:7;4125:43686;;;;;;;41179:17;;;;;;:::i;:::-;4125:43686;;;;;41227:11;4125:43686;;;;;;41210:32;;;;;;:::i;:::-;4125:43686;41263:11;;;;:::i;:::-;4125:43686;;;;41227:11;4125:43686;;;;;;41288:33;;;;;;:::i;:::-;4125:43686;41496:16;4125:43686;;;;;;;;;;41335:25;;;;;;:::i;:::-;4125:43686;41374:24;;;;;;:::i;:::-;4125:43686;;;;;;;;;41412:22;;;;;;:::i;:::-;4125:43686;;;;;;;;;41457:5;;;4125:43686;41448:14;;;;;;:::i;:::-;4125:43686;41496:16;4125:43686;41476:36;;;;;;:::i;:::-;4125:43686;;;;;41537:12;4125:43686;;;;;;;:::i;:::-;41526:27;;;;;:::i;:::-;;;;;;;:::i;:::-;;4125:43686;;;41567:19;;;;;;:::i;:::-;4125:43686;41600:25;;;;;;:::i;:::-;4125:43686;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;41640:273;;41076:3;;;;;;:::i;:::-;;;41057:9;;41640:273;41777:22;;;;41715:18;;41777:22;41715:18;:::i;41777:22::-;41751:48;;;;;;:::i;:::-;4125:43686;41751:48;;;;;;:::i;:::-;4125:43686;41833:9;;;;;;:::i;:::-;4125:43686;41817:25;;;;;;:::i;:::-;4125:43686;41876:22;:10;;;;;;:::i;:::-;4125:43686;41889:9;;;;;;:::i;:::-;4125:43686;41876:22;;:::i;:::-;41860:38;;;;;;:::i;:::-;4125:43686;41640:273;;;4125:43686;;;;;;;;;;;;;40392:24;40407:9;;;;40392:24;;39763:582;4125:43686;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39795:539;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4125:43686;39795:539;:::o;4125:43686::-;;;;;;;;;;;;7587:371;-1:-1:-1;4125:43686:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7721:12;;;7720:46;7721:12;;;7720:46;;4125:43686;;;;;;:::i;:::-;;;;7780:171;;4125:43686;7868:4;4125:43686;7780:171;;4125:43686;7868:4;4125:43686;7780:171;;4125:43686;5244:2;4125:43686;7780:171;;4125:43686;7587:371;:::o;7720:46::-;;;7964:175;4125:43686;;8091:5;;;;4125:43686;;;;;;;8098:8;;;4125:43686;;;8118:11;4125:43686;;;;;8108:8;;;4125:43686;;8118:11;;4125:43686;;8098:8;4125:43686;8073:57;8091:5;8073:57;;4125:43686;;;8098:8;4125:43686;;;8108:8;4125:43686;;;8118:11;4125:43686;;;;;;;;8073:57;;;;;;:::i;45365:400::-;;;45560:12;;;:::i;:::-;4125:43686;;-1:-1:-1;;;45549:24:0;;;;;4125:43686;;;;;;;45549:24;4125:43686;45549:4;-1:-1:-1;;;;;4125:43686:0;45549:24;;;;;;;-1:-1:-1;;;45549:24:0;;;45365:400;-1:-1:-1;4125:43686:0;45587:16;;;-1:-1:-1;;;;;4125:43686:0;;;;;45583:176;45365:400::o;45583:176::-;-1:-1:-1;;;;;4125:43686:0;;;;;;45365:400::o;45549:24::-;;;;;;;;4125:43686;45549:24;4125:43686;45549:24;;;;;;;:::i;:::-;;;;;;;;;;;;;45771:394;;;45950:14;;45946:28;;46004:21;;;;:::i;:::-;4125:43686;46028:5;4125:43686;;;;;;46028:5;4125:43686;;;;;;;46066:22;;;:::i;:::-;5244:2;46065:43;4125:43686;;;;;;;;;;;;;;46130:23;;;:::i;:::-;46157:1;5244:2;;;;;;;45771:394;:::o;:::-;;;45950:14;;45946:28;;46004:21;;;;:::i;:::-;4125:43686;46028:5;4125:43686;;;;;;46028:5;4125:43686;;;;;;;46066:22;;;:::i;:::-;5244:2;46028:5;5244:2;;46028:5;5244:2;;;;46130:23;46065:43;;;;:::i;:::-;46130:23;;:::i;45946:28::-;45966:8;;;;4125:43686;45966:8;:::o;12485:896::-;13306:21;12485:896;13306:16;13346:28;12485:896;;13195:36;12665:27;12681:10;;;;:::i;:::-;12665:27;;:::i;:::-;4125:43686;13214:16;13161:11;12952:36;4125:43686;;;12971:16;12915:12;12874:14;12806:40;5244:2;12806:40;;;;:::i;:::-;12874:14;;;:::i;:::-;12915:12;;;:::i;:::-;12971:16;;;:::i;:::-;12952:36;;:::i;:::-;13054:39;13121:13;13054:39;;5244:2;13054:39;;;;:::i;:::-;13121:13;;:::i;:::-;13161:11;;:::i;13195:36::-;4125:43686;12778:1;4125:43686;13306:16;;:::i;:::-;:21;:::i;:::-;13346:28;;:::i;16072:1118::-;;;;4125:43686;;;;;16231:8;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16264:34;;4125:43686;16263:59;16259:73;;16384:469;;16072:1118;4125:43686;;;;;;;16863:321;;16072:1118;;;:::o;16863:321::-;16917:10;;;;:::i;:::-;16945:8;;16941:233;;16072:1118;;;:::o;16941:233::-;48284:217;17001:4;48284:217;;;;;;;17001:4;48284:217;;;;;;;;;;;;17052:4;17044:12;;17052:4;;;-1:-1:-1;;5244:2:0;;;;;;;4125:43686;17052:4;17044:46;;;4125:43686;;48284:217;;;;;;;;;;;;;;;17052:4;17108:51;48284:217;;17108:51;;:::i;17044:46::-;17052:4;5244:2;17052:4;5244:2;;;;4125:43686;17052:4;17044:46;;;;16384:469;4125:43686;;;;16443:7;4125:43686;;;;;;;;;;;;;;;;;16491:26;;;;;16490:62;-1:-1:-1;;;;;4125:43686:0;16490:62;4125:43686;;16570:15;:26;;;4125:43686;;;;16616:23;4125:43686;;;16616:23;;:::i;:::-;16566:277;;16384:469;;;;;16566:277;16570:15;;;;;;;;16664:23;16660:183;;16566:277;;;;;;16660:183;16570:15;4125:43686;16774:35;16773:55;16570:15;4125:43686;16725:23;16766:62;16570:15;;;;16725:23;:::i;:::-;4125:43686;;;16774:35;:::i;:::-;4125:43686;;;16773:55;;:::i;:::-;16766:62;;:::i;:::-;16660:183;;;;;;16490:62;4125:43686;;-1:-1:-1;;;;;4125:43686:0;;;;-1:-1:-1;;;;;16490:62:0;;;16259:73;-1:-1:-1;4125:43686:0;;-1:-1:-1;;;;;;;16324:8:0:o;48505:333::-;48587:249;;;;;;;;;;;34370:6;48587:249;;;;34370:6;48587:249;;;;;;;;48505:333;:::o;:::-;21335:6;5244:2;48587:249;;;5244:2;48587:249;;;;;;;;;;;21335:6;48587:249;;;;;;;;48505:333;:::o;:::-;48587:249;;;;;;;;;;;4125:43686;48587:249;;;;4125:43686;48587:249;;;;;;;;48505:333;:::o;46171:406::-;;5244:2;46373:27;4125:43686;;;;;;;;;;;;;;46430:28;;;;:::i;:::-;4125:43686;46385:5;4125:43686;;;;;;46385:5;4125:43686;;;;;;;46547:23;46490:35;;;;:::i;46171:406::-;;;;46385:5;5244:2;;46385:5;5244:2;;;;46430:28;46373:27;;;;:::i;:::-;46430:28;;;:::i;14300:925::-;;14555:10;;;;:::i;:::-;48284:217;14549:4;48284:217;;;;14549:4;48284:217;;;;;;;;;;;4125:43686;;;14698:40;14865:16;14806:13;14766;14698:40;5244:2;14698:40;;;;:::i;:::-;14766:13;;;:::i;:::-;14806;;;:::i;:::-;14865:16;;;:::i;:::-;48284:217;;14549:4;48284:217;;;14549:4;48284:217;;;;;;;;;;;15032:12;14926:39;14993:12;14926:39;;5244:2;14926:39;15088:16;14926:39;;;:::i;:::-;14993:12;;:::i;:::-;15032;;:::i;:::-;15088:16;;;:::i;:::-;48284:217;;14549:4;48284:217;;;14549:4;48284:217;;;;;;;;;;;15209:8;48284:217;15150:21;48284:217;15150:16;48284:217;;;;14669:1;4125:43686;48284:217;;15150:16;:::i;:21::-;48284:217;;;;;;;;;;;;;;;;15209:8;48284:217;;14300:925;:::o;13413:853::-;14232:27;13413:853;;14192:16;:21;13413:853;14130:37;13651:28;13668:10;;;;:::i;13651:28::-;4125:43686;14150:16;14095:12;13911:37;4125:43686;;;13931:16;13873:13;13832;13765:40;5244:2;13765:40;;;;:::i;13873:13::-;13931:16;;;:::i;1575:197::-;-1:-1:-1;;;;;;;;;;;1711:54:0;-1:-1:-1;1575:197:0;;;;4125:43686;;;;;;;;;;1663:9;4125:43686;;;;;;;;;;;;;1663:33;4125:43686;;;1663:33;:::i;1711:54::-;;;;1575:197::o;1778:191::-;;-1:-1:-1;;;;;;;;;;;1910:52:0;-1:-1:-1;1778:191:0;;4125:43686;;;;;;;;;;1864:9;4125:43686;;;;;;;;;;;;;1864:31;4125:43686;;;1864:31;:::i;45101:258::-;4125:43686;-1:-1:-1;4125:43686:0;45183:11;4125:43686;;;-1:-1:-1;4125:43686:0;;45255:4;-1:-1:-1;4125:43686:0;45237:9;4125:43686;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;45316:4;4125:43686;-1:-1:-1;4125:43686:0;45237:9;4125:43686;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;45101:258;:::o;15258:808::-;15501:10;;;;:::i;:::-;48284:217;15495:4;48284:217;;;;15495:4;48284:217;;;;;;;;;;;4125:43686;;;15576:40;15744:16;15683:14;15643:12;15576:40;5244:2;15576:40;;;;:::i;15683:14::-;15744:16;;;:::i;:::-;48284:217;;15495:4;48284:217;;;15495:4;48284:217;;;;;;;;;;;15892:13;15789:38;15854:10;15789:38;;5244:2;15789:38;15950:16;15789:38;;;:::i;15892:13::-;15950:16;;;:::i;12306:146::-;48284:217;5207:4;48284:217;;;5207:4;48284:217;;;;;;;;;;;;12306:146;:::o

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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

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