MON Price: $0.019197 (+4.79%)

Contract

0x07edc2cF5c59fB786Dbd45242389C2A987A0F2A5

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo49.100338932142394827 MON

MON Value

$0.94 (@ $0.02/MON)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Collect V3Fees387500412025-11-29 11:15:3356 days ago1764414933IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387478182025-11-29 11:00:2956 days ago1764414029IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387456012025-11-29 10:45:3056 days ago1764413130IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387434032025-11-29 10:30:3056 days ago1764412230IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387411812025-11-29 10:15:2656 days ago1764411326IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387390282025-11-29 10:00:5156 days ago1764410451IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387367742025-11-29 9:45:3556 days ago1764409535IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387345222025-11-29 9:30:2156 days ago1764408621IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387323032025-11-29 9:15:1956 days ago1764407719IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387301142025-11-29 9:00:2556 days ago1764406825IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387279102025-11-29 8:45:2556 days ago1764405925IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387257032025-11-29 8:30:2256 days ago1764405022IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387235002025-11-29 8:15:2556 days ago1764404125IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387213102025-11-29 8:00:2656 days ago1764403226IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387191012025-11-29 7:45:2656 days ago1764402326IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387169182025-11-29 7:30:3656 days ago1764401436IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387146792025-11-29 7:15:2756 days ago1764400527IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387124972025-11-29 7:00:4356 days ago1764399643IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387102402025-11-29 6:45:2556 days ago1764398725IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387080742025-11-29 6:30:4656 days ago1764397846IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387058242025-11-29 6:15:3156 days ago1764396931IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387036272025-11-29 6:00:3556 days ago1764396035IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees387013982025-11-29 5:45:2756 days ago1764395127IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees386992282025-11-29 5:30:4256 days ago1764394242IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
Collect V3Fees386969562025-11-29 5:15:1756 days ago1764393317IN
0x07edc2cF...987A0F2A5
0 MON0.03011937102
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
385880082025-11-28 17:02:1257 days ago1764349332
0x07edc2cF...987A0F2A5
154.7528345 MON
385879632025-11-28 17:01:5357 days ago1764349313
0x07edc2cF...987A0F2A5
0.0003825 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.0001 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.00014999 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.00004999 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.00004999 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.00004999 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.00004999 MON
385779952025-11-28 15:55:1657 days ago1764345316
0x07edc2cF...987A0F2A5
0.00004999 MON
385779832025-11-28 15:55:1157 days ago1764345311
0x07edc2cF...987A0F2A5
0.00099999 MON
385659892025-11-28 14:34:5957 days ago1764340499
0x07edc2cF...987A0F2A5
0.07650038 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.0200001 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.03000014 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.01000004 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.01000004 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.01000004 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.01000004 MON
385622052025-11-28 14:09:4257 days ago1764338982
0x07edc2cF...987A0F2A5
0.01000004 MON
385621932025-11-28 14:09:3757 days ago1764338977
0x07edc2cF...987A0F2A5
0.20000099 MON
383881872025-11-27 18:46:2458 days ago1764269184
0x07edc2cF...987A0F2A5
0.0002 MON
383881872025-11-27 18:46:2458 days ago1764269184
0x07edc2cF...987A0F2A5
0.0003 MON
383881872025-11-27 18:46:2458 days ago1764269184
0x07edc2cF...987A0F2A5
0.0001 MON
383881872025-11-27 18:46:2458 days ago1764269184
0x07edc2cF...987A0F2A5
0.0001 MON
383881872025-11-27 18:46:2458 days ago1764269184
0x07edc2cF...987A0F2A5
0.0001 MON
383881872025-11-27 18:46:2458 days ago1764269184
0x07edc2cF...987A0F2A5
0.0001 MON
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FeeDistributor

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at monadscan.com on 2025-11-27
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/// -----------------------------------------------------------------------
/// Interfaces
/// -----------------------------------------------------------------------

interface INonFungiblePositionManager {
    struct CollectParams {
        uint256 tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }
    
    function collect(CollectParams calldata params)
        external
        payable
        returns (uint256 amount0, uint256 amount1);
    
    function positions(uint256 tokenId)
        external
        view
        returns (
            uint96 nonce,
            address operator,
            address token0,
            address token1,
            uint24 fee,
            int24 tickLower,
            int24 tickUpper,
            uint128 liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );
}

interface IWMON {
    function withdraw(uint256) external;
}

/// @title Ownable
/// @notice Minimal ownable implementation to avoid external imports.
contract Ownable {
    address public owner;

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

    constructor() {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}

/// @title FeeDistributor
/// @notice Central hub for distributing MON/native fees for Gain.fun tokens, with:
///         - Bonding curve fees: 2% total (1% creator, 0.3% stakers, 0.2% platform, 0.5% others)
///         - V3 LP fees: 1% total (0.5% creator, 0.15% stakers, 0.1% platform, 0.25% others)
///         - claim-based creator rewards,
///         - claim-based Twitter/KOL handle share (bags.fm-style),
///         - on-chain wallet ↔ Twitter handle binding,
///         - CTO override for token creator.
contract FeeDistributor is Ownable {
    // ---------------------------------------------------------------------
    // Constants (BPS of total fee)
    // ---------------------------------------------------------------------

    // Bonding Curve fees (2% total)
    uint16 public constant BC_CREATOR_BPS   = 5000; // 50% = 1% of 2%
    uint16 public constant BC_STAKING_BPS   = 1500; // 15% = 0.3% of 2%
    uint16 public constant BC_PLATFORM_BPS  = 1000; // 10% = 0.2% of 2%
    uint16 public constant BC_OTHER1_BPS     = 500;  // 5% = 0.1% of 2%
    uint16 public constant BC_OTHER2_BPS    = 500;  // 5% = 0.1% of 2%
    uint16 public constant BC_OTHER3_BPS    = 500;  // 5% = 0.1% of 2%
    uint16 public constant BC_OTHER4_BPS    = 500;  // 5% = 0.1% of 2%
    uint16 public constant BC_OTHER5_BPS    = 500;  // 5% = 0.1% of 2%
    uint16 public constant BC_TOTAL_BPS     = 10000;

    // V3 LP fees (1% total)
    uint16 public constant V3_CREATOR_BPS   = 5000; // 50% = 0.5% of 1%
    uint16 public constant V3_STAKING_BPS   = 1500; // 15% = 0.15% of 1%
    uint16 public constant V3_PLATFORM_BPS  = 1000; // 10% = 0.1% of 1%
    uint16 public constant V3_OTHER1_BPS    = 500;  // 5% = 0.05% of 1%
    uint16 public constant V3_OTHER2_BPS    = 500;  // 5% = 0.05% of 1%
    uint16 public constant V3_OTHER3_BPS    = 500;  // 5% = 0.05% of 1%
    uint16 public constant V3_OTHER4_BPS    = 500;  // 5% = 0.05% of 1%
    uint16 public constant V3_OTHER5_BPS    = 500;  // 5% = 0.05% of 1%
    uint16 public constant V3_TOTAL_BPS     = 10000;

    // For handle share: fraction of CREATOR portion (0–10000 = 0–100% of creator share)
    uint16 public constant HANDLE_BPS_DENOMINATOR = 10000;

    // ---------------------------------------------------------------------
    // Per-token creator config
    // ---------------------------------------------------------------------

    struct TokenConfig {
        address creator;
        bool exists;
    }

    /// @notice token => config (creator)
    mapping(address => TokenConfig) public tokenConfig;

    /// @notice Aggregated creator rewards (all tokens) that are not yet claimed
    /// @dev Includes BOTH bonding curve fees AND V3 fees (after distribution)
    mapping(address => uint256) public creatorUnclaimed;

    /// @notice Aggregated creator rewards already claimed (lifetime)
    /// @dev Includes BOTH bonding curve fees AND V3 fees (after claiming)
    mapping(address => uint256) public creatorClaimed;

    /// @notice V3 fees unclaimed (separate from bonding curve fees)
    /// @dev Tracks V3 fees separately for accurate UI display
    mapping(address => uint256) public creatorV3Unclaimed;

    /// @notice V3 fees claimed (separate from bonding curve fees)
    /// @dev Tracks V3 fees separately for accurate UI display
    mapping(address => uint256) public creatorV3Claimed;

    // ---------------------------------------------------------------------
    // Twitter binding (wallet ↔ handle)
    // ---------------------------------------------------------------------

    /// @notice Wallet → normalized twitter handle (lowercase, no '@')
    mapping(address => string) public twitterHandleOf;

    /// @notice Wallet → handle hash (for quick lookup)
    mapping(address => bytes32) public handleHashOfWallet;

    /// @notice Handle hash → wallet (unique; one handle = one wallet)
    mapping(bytes32 => address) public walletOfHandleHash;

    /// @notice Handle hash → normalized handle string
    mapping(bytes32 => string) public handleLabel;

    // ---------------------------------------------------------------------
    // Per-token handle share config
    // ---------------------------------------------------------------------

    struct HandleShare {
        bytes32 handleHash;   // which handle gets share
        uint16  bpsOfCreator; // share of creator's 50% (0–10000)
    }

    /// @notice token => handle share config
    mapping(address => HandleShare) public tokenHandleShare;

    /// @notice token => handleHash => unclaimed native rewards for that handle
    mapping(address => mapping(bytes32 => uint256)) public handleUnclaimed;

    /// @notice token => handleHash => claimed (lifetime) native rewards
    mapping(address => mapping(bytes32 => uint256)) public handleClaimed;

    // ---------------------------------------------------------------------
    // Admin wallet (for manual operations)
    // ---------------------------------------------------------------------

    /// @notice Admin wallet that can call edit functions (setRecipients, etc.)
    ///         Owner (Factory) can set/update admin wallet.
    address public adminWallet;

    event AdminWalletUpdated(address indexed newAdmin);

    // ---------------------------------------------------------------------
    // Protocol recipient wallets
    // ---------------------------------------------------------------------

    address public platformWallet;
    address public stakingWallet;
    address public other1Wallet;
    address public other2Wallet;
    address public other3Wallet;
    address public other4Wallet;
    address public other5Wallet;

    /// @notice Staking contract address (for auto-distributing staking rewards).
    address public stakingContract;

    /// @notice BondingCurve contract address (allowed to register graduation NFTs).
    address public bondingCurve;

    // ---------------------------------------------------------------------
    // V3 LP Fee Escrow System
    // ---------------------------------------------------------------------

    /// @notice Uniswap V3 NonFungiblePositionManager address
    address public positionManager;

    /// @notice WMON token address (for unwrapping) - Hardcoded
    address public constant wmon = 0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A;

    /// @notice Track V3 LP NFT per token
    mapping(address => uint256) public tokenNftId;  // token => NFT tokenId

    /// @notice Track V3 LP fees collected per token (escrowed)
    mapping(address => uint256) public v3FeesCollectedMon;  // token => total MON collected
    mapping(address => uint256) public v3FeesCollectedToken; // token => total token collected

    /// @notice Track last collection timestamp per token
    mapping(address => uint256) public lastCollectionTime;  // token => timestamp

    // ---------------------------------------------------------------------
    // Events
    // ---------------------------------------------------------------------

    event TokenCreatorSet(address indexed token, address indexed creator);

    event RecipientsUpdated(
        address indexed platformWallet,
        address indexed stakingWallet,
        address indexed other1Wallet,
        address other2Wallet,
        address other3Wallet,
        address other4Wallet,
        address other5Wallet
    );

    event TwitterHandleBound(address indexed wallet, bytes32 indexed handleHash, string handle);
    event TwitterHandleUnbound(address indexed wallet, bytes32 indexed handleHash, string handle);

    event TokenHandleShareSet(
        address indexed token,
        bytes32 indexed handleHash,
        string handle,
        uint16 bpsOfCreator
    );

    event CreatorAccrued(
        address indexed creator,
        address indexed token,
        uint256 netAmount,
        uint256 grossAmount
    );

    event HandleAccrued(
        address indexed token,
        bytes32 indexed handleHash,
        uint256 amount
    );

    event CreatorClaimed(address indexed creator, uint256 amount);

    event HandleClaimed(
        address indexed token,
        bytes32 indexed handleHash,
        address indexed wallet,
        uint256 amount
    );

    /// @notice Simplified to avoid stack-too-deep
    event FeeDistributed(
        address indexed token,
        uint256 totalAmount,
        uint256 creatorGross,
        uint256 creatorNet,
        uint256 handleAmount,
        uint256 stakingAmount,
        uint256 platformAmount
    );

    event V3NftRegistered(address indexed token, uint256 indexed tokenId);
    event V3FeesCollected(address indexed token, uint256 monAmount, uint256 tokenAmount);
    event V3FeesDistributed(address indexed token, uint256 monAmount, uint256 tokenAmount);
    event StakingContractUpdated(address indexed stakingContract);
    event BondingCurveUpdated(address indexed bondingCurve);

    // ---------------------------------------------------------------------
    // Constructor
    // ---------------------------------------------------------------------

    /// @param _platformWallet Initial platform wallet (must not be zero)
    /// @param _positionManager Uniswap V3 NonFungiblePositionManager address (can be zero initially)
    constructor(address _platformWallet, address _positionManager) {
        require(_platformWallet != address(0), "FeeDistributor: platform wallet is zero");
        platformWallet = _platformWallet;
        positionManager = _positionManager;

        emit RecipientsUpdated(
            platformWallet,
            stakingWallet,
            other1Wallet,
            other2Wallet,
            other3Wallet,
            other4Wallet,
            other5Wallet
        );
    }

    // ---------------------------------------------------------------------
    // Internal: handle normalize + hash
    // ---------------------------------------------------------------------

    /// @dev Normalize handle: strip leading '@', lowercase ASCII, prefix "twitter:"
    function _normalizeAndHash(string memory handle)
        internal
        pure
        returns (bytes32 hh, string memory norm)
    {
        bytes memory s = bytes(handle);
        uint256 len = s.length;
        require(len > 0, "FeeDistributor: empty handle");

        uint256 start = 0;
        if (s[0] == bytes1(uint8(64))) { // '@'
            require(len > 1, "FeeDistributor: empty handle");
            start = 1;
        }

        bytes memory t = new bytes(len - start);
        for (uint256 i = start; i < len; i++) {
            uint8 c = uint8(s[i]);
            if (c >= 65 && c <= 90) {
                t[i - start] = bytes1(c + 32); // A–Z -> a–z
            } else {
                t[i - start] = s[i];
            }
        }

        norm = string(t);
        hh = keccak256(abi.encodePacked("twitter:", t));
    }

    // ---------------------------------------------------------------------
    // Modifiers
    // ---------------------------------------------------------------------

    modifier onlyOwnerOrAdmin() {
        require(
            msg.sender == owner || msg.sender == adminWallet,
            "FeeDistributor: not owner/admin"
        );
        _;
    }

    modifier onlyTokenCreatorOrOwner(address token) {
        TokenConfig memory cfg = tokenConfig[token];
        require(cfg.exists, "FeeDistributor: token not configured");
        require(
            msg.sender == cfg.creator || msg.sender == owner || msg.sender == adminWallet,
            "FeeDistributor: not creator/owner/admin"
        );
        _;
    }

    // ---------------------------------------------------------------------
    // Owner/Admin configuration
    // ---------------------------------------------------------------------

    /// @notice Set or update the admin wallet (only owner can do this).
    /// @dev Admin wallet can call edit functions like setRecipients, setTokenCreator.
    function setAdminWallet(address _adminWallet) external onlyOwner {
        adminWallet = _adminWallet;
        emit AdminWalletUpdated(_adminWallet);
    }

    /// @notice Set or update the creator for a given token (CTO override).
    /// @dev Old creator retains their unclaimed balance; new creator earns future rewards.
    ///      Can be called by owner (Factory) or admin wallet.
    function setTokenCreator(address token, address creator) external onlyOwnerOrAdmin {
        require(token != address(0), "FeeDistributor: token is zero address");

        tokenConfig[token] = TokenConfig({
            creator: creator,
            exists: true
        });

        emit TokenCreatorSet(token, creator);
    }

    /// @notice Update protocol recipient wallets.
    /// @dev Only platformWallet is required; others can be zero (their share will go to platform).
    ///      Can be called by owner (Factory) or admin wallet.
    function setRecipients(
        address _platformWallet,
        address _stakingWallet,
        address _other1Wallet,
        address _other2Wallet,
        address _other3Wallet,
        address _other4Wallet,
        address _other5Wallet
    ) external onlyOwnerOrAdmin {
        require(_platformWallet != address(0), "FeeDistributor: platform wallet is zero");

        platformWallet = _platformWallet;
        stakingWallet  = _stakingWallet;
        other1Wallet   = _other1Wallet;
        other2Wallet   = _other2Wallet;
        other3Wallet   = _other3Wallet;
        other4Wallet   = _other4Wallet;
        other5Wallet   = _other5Wallet;

        emit RecipientsUpdated(
            platformWallet,
            stakingWallet,
            other1Wallet,
            other2Wallet,
            other3Wallet,
            other4Wallet,
            other5Wallet
        );
    }

    /// @notice Set Position Manager address (only owner).
    /// @dev WMON address is hardcoded as constant.
    function setV3Addresses(address _positionManager) external onlyOwner {
        positionManager = _positionManager;
    }

    /// @notice Set staking contract address (only owner).
    function setStakingContract(address _stakingContract) external onlyOwner {
        stakingContract = _stakingContract;
        emit StakingContractUpdated(_stakingContract);
    }

    /// @notice Set BondingCurve contract address (only owner).
    /// @dev This address is allowed to register graduation NFTs.
    function setBondingCurve(address _bondingCurve) external onlyOwner {
        bondingCurve = _bondingCurve;
        emit BondingCurveUpdated(_bondingCurve);
    }

    // ---------------------------------------------------------------------
    // Wallet ↔ Twitter binding
    // ---------------------------------------------------------------------

    function bindTwitterHandle(string memory handle) external {
        (bytes32 hh, string memory norm) = _normalizeAndHash(handle);

        address currentOwner = walletOfHandleHash[hh];
        require(
            currentOwner == address(0) || currentOwner == msg.sender,
            "FeeDistributor: handle already bound"
        );

        // Clear old binding of this wallet if different
        bytes32 oldHash = handleHashOfWallet[msg.sender];
        if (oldHash != bytes32(0) && oldHash != hh) {
            if (walletOfHandleHash[oldHash] == msg.sender) {
                walletOfHandleHash[oldHash] = address(0);
            }
        }

        twitterHandleOf[msg.sender] = norm;
        handleHashOfWallet[msg.sender] = hh;
        walletOfHandleHash[hh] = msg.sender;
        handleLabel[hh] = norm;

        emit TwitterHandleBound(msg.sender, hh, norm);
    }

    /// @notice Unbind your current Twitter handle from your wallet.
    function unbindTwitterHandle() external {
        bytes32 hh = handleHashOfWallet[msg.sender];
        require(hh != bytes32(0), "FeeDistributor: no handle bound");

        string memory norm = twitterHandleOf[msg.sender];

        handleHashOfWallet[msg.sender] = bytes32(0);
        twitterHandleOf[msg.sender] = "";
        if (walletOfHandleHash[hh] == msg.sender) {
            walletOfHandleHash[hh] = address(0);
        }

        emit TwitterHandleUnbound(msg.sender, hh, norm);
    }

    /// @notice Get the wallet currently bound to a given handle string.
    function getWalletForHandle(string memory handle) external view returns (address) {
        (bytes32 hh, ) = _normalizeAndHash(handle);
        return walletOfHandleHash[hh];
    }

    // ---------------------------------------------------------------------
    // Token handle share (bags.fm-style)
    // ---------------------------------------------------------------------

    /// @notice Creator (or owner) sets how much of their 50% share goes to a given handle.
    /// @param token         Token address.
    /// @param handle        Twitter handle string (with or without '@').
    /// @param bpsOfCreator  BPS of creator's 50% (0–10000).
    ///                      Example: 3000 = 30% of creator share (15% of total fee).
    function setTokenHandleShare(
        address token,
        string memory handle,
        uint16 bpsOfCreator
    ) external onlyTokenCreatorOrOwner(token) {
        if (bpsOfCreator == 0 || bytes(handle).length == 0) {
            // disable handle share
            tokenHandleShare[token] = HandleShare({
                handleHash: bytes32(0),
                bpsOfCreator: 0
            });
            emit TokenHandleShareSet(token, bytes32(0), "", 0);
            return;
        }

        require(bpsOfCreator <= HANDLE_BPS_DENOMINATOR, "FeeDistributor: handle bps too high");

        (bytes32 hh, string memory norm) = _normalizeAndHash(handle);

        tokenHandleShare[token] = HandleShare({
            handleHash: hh,
            bpsOfCreator: bpsOfCreator
        });

        handleLabel[hh] = norm;

        emit TokenHandleShareSet(token, hh, norm, bpsOfCreator);
    }

    // ---------------------------------------------------------------------
    // Internal helpers
    // ---------------------------------------------------------------------

    /// @dev Apply handle share on the creator's gross share.
    ///      Returns (creatorNet, handleAmount).
    function _applyHandleShare(
        address token,
        uint256 creatorGross
    ) internal returns (uint256 creatorNet, uint256 handleAmount) {
        creatorNet = creatorGross;
        HandleShare memory hs = tokenHandleShare[token];

        bytes32 hh = hs.handleHash;
        if (creatorGross == 0 || hh == bytes32(0) || hs.bpsOfCreator == 0) {
            return (creatorNet, 0);
        }

        handleAmount = (creatorGross * hs.bpsOfCreator) / HANDLE_BPS_DENOMINATOR;
        if (handleAmount == 0) {
            return (creatorNet, 0);
        }

        creatorNet = creatorGross - handleAmount;
        handleUnclaimed[token][hh] += handleAmount;

        emit HandleAccrued(token, hh, handleAmount);
    }

    function _sendNative(address to, uint256 amount) internal {
        if (amount == 0) return;
        (bool ok, ) = payable(to).call{value: amount}("");
        require(ok, "FeeDistributor: native transfer failed");
    }

    // ---------------------------------------------------------------------
    // Fee distribution (BondingCurve/tax tokens call this)
    // ---------------------------------------------------------------------

    /// @dev Struct to reduce stack depth in fee distribution
    struct DistributionAmounts {
        uint256 creatorGross;
        uint256 creatorNet;
        uint256 handleAmount;
        uint256 stakingAmount;
        uint256 platformAmount;
        uint256 sum;
    }

    /// @dev Internal fee distribution logic for bonding curve fees (2% total).
    function _distributeBondingCurveFee(address token, uint256 amount) internal {
        require(amount > 0, "FeeDistributor: no value sent");

        TokenConfig memory cfg = tokenConfig[token];

        DistributionAmounts memory dist;
        dist.creatorGross  = (amount * BC_CREATOR_BPS)  / BC_TOTAL_BPS;
        dist.stakingAmount = (amount * BC_STAKING_BPS)  / BC_TOTAL_BPS;
        dist.platformAmount= (amount * BC_PLATFORM_BPS) / BC_TOTAL_BPS;

        dist.sum = dist.creatorGross + dist.stakingAmount + dist.platformAmount;
        uint256 otherAmount;

        // other1
        otherAmount = (amount * BC_OTHER1_BPS) / BC_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other1Wallet != address(0)) {
                _sendNative(other1Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other2
        otherAmount = (amount * BC_OTHER2_BPS) / BC_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other2Wallet != address(0)) {
                _sendNative(other2Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other3
        otherAmount = (amount * BC_OTHER3_BPS) / BC_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other3Wallet != address(0)) {
                _sendNative(other3Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other4
        otherAmount = (amount * BC_OTHER4_BPS) / BC_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other4Wallet != address(0)) {
                _sendNative(other4Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other5
        otherAmount = (amount * BC_OTHER5_BPS) / BC_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other5Wallet != address(0)) {
                _sendNative(other5Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // rounding dust → platform
        uint256 remainder = amount - dist.sum;
        dist.platformAmount += remainder;

        // --- Creator share (gross -> net, optional handle escrow) ---
        if (dist.creatorGross > 0 && cfg.creator != address(0)) {
            (dist.creatorNet, dist.handleAmount) = _applyHandleShare(token, dist.creatorGross);

            if (dist.creatorNet > 0) {
                creatorUnclaimed[cfg.creator] += dist.creatorNet;
                emit CreatorAccrued(cfg.creator, token, dist.creatorNet, dist.creatorGross);
            }
        } else {
            // no creator configured -> send whole creator share to platform
            dist.platformAmount += dist.creatorGross;
            dist.creatorGross = 0;
        }

        // --- Staking (auto-send to staking contract, or platform fallback) ---
        if (dist.stakingAmount > 0) {
            if (stakingContract != address(0)) {
                // Call addRewards() with value (staking contract will distribute to stakers)
                (bool success, ) = payable(stakingContract).call{value: dist.stakingAmount}(
                    abi.encodeWithSignature("addRewards()")
                );
                if (!success) {
                    // If call fails, fallback to platform
                    dist.platformAmount += dist.stakingAmount;
                    dist.stakingAmount = 0;
                }
            } else if (stakingWallet != address(0)) {
                _sendNative(stakingWallet, dist.stakingAmount);
            } else {
                dist.platformAmount += dist.stakingAmount;
                dist.stakingAmount = 0;
            }
        }

        // --- Platform (auto-send, fallback to owner) ---
        if (dist.platformAmount > 0) {
            address target = platformWallet != address(0) ? platformWallet : owner;
            _sendNative(target, dist.platformAmount);
        }

        emit FeeDistributed(
            token,
            amount,
            dist.creatorGross,
            dist.creatorNet,
            dist.handleAmount,
            dist.stakingAmount,
            dist.platformAmount
        );
    }

    /// @dev Internal fee distribution logic for V3 LP fees (1% total).
    function _distributeV3LpFee(address token, uint256 amount) internal {
        require(amount > 0, "FeeDistributor: no value sent");

        TokenConfig memory cfg = tokenConfig[token];

        DistributionAmounts memory dist;
        dist.creatorGross  = (amount * V3_CREATOR_BPS)  / V3_TOTAL_BPS;
        dist.stakingAmount = (amount * V3_STAKING_BPS)  / V3_TOTAL_BPS;
        dist.platformAmount= (amount * V3_PLATFORM_BPS) / V3_TOTAL_BPS;

        dist.sum = dist.creatorGross + dist.stakingAmount + dist.platformAmount;
        uint256 otherAmount;

        // other1
        otherAmount = (amount * V3_OTHER1_BPS) / V3_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other1Wallet != address(0)) {
                _sendNative(other1Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other2
        otherAmount = (amount * V3_OTHER2_BPS) / V3_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other2Wallet != address(0)) {
                _sendNative(other2Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other3
        otherAmount = (amount * V3_OTHER3_BPS) / V3_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other3Wallet != address(0)) {
                _sendNative(other3Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other4
        otherAmount = (amount * V3_OTHER4_BPS) / V3_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other4Wallet != address(0)) {
                _sendNative(other4Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // other5
        otherAmount = (amount * V3_OTHER5_BPS) / V3_TOTAL_BPS;
        dist.sum += otherAmount;
        if (otherAmount > 0) {
            if (other5Wallet != address(0)) {
                _sendNative(other5Wallet, otherAmount);
            } else {
                dist.platformAmount += otherAmount;
            }
        }

        // rounding dust → platform
        uint256 remainder = amount - dist.sum;
        dist.platformAmount += remainder;

        // --- Creator share (gross -> net, optional handle escrow) ---
        if (dist.creatorGross > 0 && cfg.creator != address(0)) {
            (dist.creatorNet, dist.handleAmount) = _applyHandleShare(token, dist.creatorGross);

            if (dist.creatorNet > 0) {
                creatorUnclaimed[cfg.creator] += dist.creatorNet;  // Keep for backward compatibility
                creatorV3Unclaimed[cfg.creator] += dist.creatorNet;  // Track V3 fees separately
                emit CreatorAccrued(cfg.creator, token, dist.creatorNet, dist.creatorGross);
            }
        } else {
            // no creator configured -> send whole creator share to platform
            dist.platformAmount += dist.creatorGross;
            dist.creatorGross = 0;
        }

        // --- Staking (auto-send to staking contract, or platform fallback) ---
        if (dist.stakingAmount > 0) {
            if (stakingContract != address(0)) {
                // Call addRewards() with value (staking contract will distribute to stakers)
                (bool success, ) = payable(stakingContract).call{value: dist.stakingAmount}(
                    abi.encodeWithSignature("addRewards()")
                );
                if (!success) {
                    // If call fails, fallback to platform
                    dist.platformAmount += dist.stakingAmount;
                    dist.stakingAmount = 0;
                }
            } else if (stakingWallet != address(0)) {
                _sendNative(stakingWallet, dist.stakingAmount);
            } else {
                dist.platformAmount += dist.stakingAmount;
                dist.stakingAmount = 0;
            }
        }

        // --- Platform (auto-send, fallback to owner) ---
        if (dist.platformAmount > 0) {
            address target = platformWallet != address(0) ? platformWallet : owner;
            _sendNative(target, dist.platformAmount);
        }

        emit FeeDistributed(
            token,
            amount,
            dist.creatorGross,
            dist.creatorNet,
            dist.handleAmount,
            dist.stakingAmount,
            dist.platformAmount
        );
    }

    /// @notice Distribute a fee for a given token (from bonding curve).
    /// @dev Caller sends MON/native as msg.value. Typically BondingCurve or tax-token.
    ///      Split uses bonding curve fee distribution (2% total).
    ///      Creator's 50% portion optionally gets shared with a Twitter handle (bags.fm-style).
    /// @param token The token for which this fee was generated.
    function distributeFee(address token) external payable {
        _distributeBondingCurveFee(token, msg.value);
    }

    // ---------------------------------------------------------------------
    // Claim functions (claim-based rewards)
    // ---------------------------------------------------------------------

    /// @notice Claim all accumulated creator rewards for the caller (from all tokens).
    /// @dev Claims both Curve and V3 fees together (backward compatibility).
    function claimCreatorRewards() external {
        uint256 amount = creatorUnclaimed[msg.sender];
        require(amount > 0, "FeeDistributor: no creator rewards");

        // Track V3 fees separately
        uint256 v3Amount = creatorV3Unclaimed[msg.sender];

        creatorUnclaimed[msg.sender] = 0;
        creatorV3Unclaimed[msg.sender] = 0;  // Clear V3 unclaimed
        
        creatorClaimed[msg.sender] += amount;  // Keep for backward compatibility
        creatorV3Claimed[msg.sender] += v3Amount;  // Track V3 claimed separately

        _sendNative(msg.sender, amount);

        emit CreatorClaimed(msg.sender, amount);
    }

    /// @notice Claim only bonding curve fees (excludes V3 fees).
    function claimCurveRewards() external {
        uint256 totalUnclaimed = creatorUnclaimed[msg.sender];
        uint256 v3Unclaimed = creatorV3Unclaimed[msg.sender];
        uint256 curveAmount = totalUnclaimed > v3Unclaimed ? totalUnclaimed - v3Unclaimed : 0;
        
        require(curveAmount > 0, "FeeDistributor: no curve rewards");

        // Update balances
        creatorUnclaimed[msg.sender] = v3Unclaimed;  // Keep only V3 unclaimed
        creatorClaimed[msg.sender] += curveAmount;  // Track total claimed

        _sendNative(msg.sender, curveAmount);

        emit CreatorClaimed(msg.sender, curveAmount);
    }

    /// @notice Claim only V3 pool fees (excludes bonding curve fees).
    function claimV3Rewards() external {
        uint256 v3Amount = creatorV3Unclaimed[msg.sender];
        require(v3Amount > 0, "FeeDistributor: no V3 rewards");
        
        // Safety check: ensure creatorUnclaimed >= v3Amount (should always be true, but check for safety)
        require(creatorUnclaimed[msg.sender] >= v3Amount, "FeeDistributor: invalid state");

        // Update balances
        creatorUnclaimed[msg.sender] -= v3Amount;  // Subtract V3 from total
        creatorV3Unclaimed[msg.sender] = 0;  // Clear V3 unclaimed
        
        creatorClaimed[msg.sender] += v3Amount;  // Track total claimed
        creatorV3Claimed[msg.sender] += v3Amount;  // Track V3 claimed separately

        _sendNative(msg.sender, v3Amount);

        emit CreatorClaimed(msg.sender, v3Amount);
    }

    /// @notice Claim handle rewards for the caller's currently bound handle for a given token.
    /// @dev Uses handleHashOfWallet[msg.sender]; if wallet unbound, reverts.
    function claimHandleRewards(address token) external {
        bytes32 hh = handleHashOfWallet[msg.sender];
        require(hh != bytes32(0), "FeeDistributor: no handle bound");

        uint256 amount = handleUnclaimed[token][hh];
        require(amount > 0, "FeeDistributor: no handle rewards");

        handleUnclaimed[token][hh] = 0;
        handleClaimed[token][hh] += amount;

        _sendNative(msg.sender, amount);

        emit HandleClaimed(token, hh, msg.sender, amount);
    }

    // ---------------------------------------------------------------------
    // Views / helpers for frontend
    // ---------------------------------------------------------------------

    /// @notice Get current handle share config for a token (normalized handle + bps).
    function getTokenHandleInfo(address token)
        external
        view
        returns (string memory handle, uint16 bpsOfCreator)
    {
        HandleShare memory hs = tokenHandleShare[token];
        handle = handleLabel[hs.handleHash];
        bpsOfCreator = hs.bpsOfCreator;
    }

    /// @notice Get handle stats for a token + wallet (using wallet's bound handle).
    /// @dev unclaimed/claimed are for that (token, handle) pair.
    function getHandleStatsForWallet(address token, address wallet)
        external
        view
        returns (
            string memory handle,
            uint16 bpsOfCreator,
            uint256 unclaimed,
            uint256 claimed
        )
    {
        bytes32 hh = handleHashOfWallet[wallet];
        HandleShare memory hs = tokenHandleShare[token];
        handle = handleLabel[hh];

        if (hh == hs.handleHash) {
            bpsOfCreator = hs.bpsOfCreator;
        } else {
            bpsOfCreator = 0;
        }

        unclaimed = handleUnclaimed[token][hh];
        claimed = handleClaimed[token][hh];
    }

    /// @notice Simple view: get token creator wallet + their bound handle.
    function getTokenCreator(address token)
        external
        view
        returns (address creatorWallet, string memory creatorHandle)
    {
        TokenConfig memory cfg = tokenConfig[token];
        creatorWallet = cfg.creator;
        creatorHandle = twitterHandleOf[creatorWallet];
    }

    /// @notice Simple view: full info for token page (creator + active handle + pending amounts).
    function getTokenFullInfo(address token)
        external
        view
        returns (
            address creatorWallet,
            string memory creatorHandle,
            string memory activeHandle,
            address activeHandleWallet,
            uint16 handleShareBps,
            uint256 creatorUnclaimedAmount,
            uint256 handleUnclaimedAmount
        )
    {
        TokenConfig memory cfg = tokenConfig[token];
        creatorWallet = cfg.creator;
        creatorHandle = twitterHandleOf[creatorWallet];

        HandleShare memory hs = tokenHandleShare[token];
        bytes32 hh = hs.handleHash;

        activeHandle = handleLabel[hh];
        activeHandleWallet = walletOfHandleHash[hh];
        handleShareBps = hs.bpsOfCreator;

        creatorUnclaimedAmount = creatorUnclaimed[creatorWallet];
        handleUnclaimedAmount = handleUnclaimed[token][hh];
    }

    // ---------------------------------------------------------------------
    // V3 LP Fee Escrow System
    // ---------------------------------------------------------------------

    /// @notice Register V3 LP NFT from BondingCurve (only BondingCurve can call).
    /// @dev Only the authorized BondingCurve contract can register NFTs.
    function registerGraduationNft(address token, uint256 tokenId) external {
        require(msg.sender == bondingCurve, "FeeDistributor: not BondingCurve");
        require(bondingCurve != address(0), "FeeDistributor: BondingCurve not set");
        require(tokenNftId[token] == 0, "FeeDistributor: NFT already registered");
        require(token != address(0), "FeeDistributor: token is zero");
        require(tokenId > 0, "FeeDistributor: tokenId is zero");
        
        tokenNftId[token] = tokenId;
        emit V3NftRegistered(token, tokenId);
    }

    /// @notice Get claimable V3 fees for a token (from tokensOwed in position).
    /// @dev Returns fees that are already accrued but not yet collected.
    function getClaimableV3Fees(address token)
        external
        view
        returns (uint256 monAmount, uint256 tokenAmount)
    {
        uint256 tokenId = tokenNftId[token];
        if (tokenId == 0 || positionManager == address(0)) return (0, 0);
        
        // Get position data
        (
            , // uint96 nonce
            , // address operator
            address token0,
            address token1,
            , // uint24 fee
            , // int24 tickLower
            , // int24 tickUpper
            , // uint128 liquidity
            , // uint256 feeGrowthInside0LastX128
            , // uint256 feeGrowthInside1LastX128
            uint128 tokensOwed0,
            uint128 tokensOwed1
        ) = INonFungiblePositionManager(positionManager).positions(tokenId);
        
        // tokensOwed are fees that accumulated but not yet collected
        // Determine which is WMON and which is token
        if (token0 == wmon) {
            monAmount = uint256(tokensOwed0);
            tokenAmount = uint256(tokensOwed1);
        } else if (token1 == wmon) {
            monAmount = uint256(tokensOwed1);
            tokenAmount = uint256(tokensOwed0);
        } else {
            // WMON not found in pair (shouldn't happen)
            return (0, 0);
        }
    }

    /// @notice Get total V3 fees collected (already harvested) for a token.
    function getCollectedV3Fees(address token)
        external
        view
        returns (uint256 monAmount, uint256 tokenAmount)
    {
        return (v3FeesCollectedMon[token], v3FeesCollectedToken[token]);
    }

    /// @notice Get creator's share of V3 fees (claimable + collected).
    function getCreatorV3Rewards(address token, address creator)
        external
        view
        returns (
            uint256 claimableMon,
            uint256 claimableToken,
            uint256 collectedMon,
            uint256 collectedToken
        )
    {
        TokenConfig memory cfg = tokenConfig[token];
        if (cfg.creator != creator) return (0, 0, 0, 0);
        
        // Get claimable fees (inline calculation to avoid external call)
        uint256 tokenId = tokenNftId[token];
        uint256 monOwed = 0;
        uint256 tokenOwed = 0;
        
        if (tokenId > 0 && positionManager != address(0)) {
            (
                , // uint96 nonce
                , // address operator
                address token0,
                address token1,
                , // uint24 fee
                , // int24 tickLower
                , // int24 tickUpper
                , // uint128 liquidity
                , // uint256 feeGrowthInside0LastX128
                , // uint256 feeGrowthInside1LastX128
                uint128 tokensOwed0,
                uint128 tokensOwed1
            ) = INonFungiblePositionManager(positionManager).positions(tokenId);
            
            if (token0 == wmon) {
                monOwed = uint256(tokensOwed0);
                tokenOwed = uint256(tokensOwed1);
            } else if (token1 == wmon) {
                monOwed = uint256(tokensOwed1);
                tokenOwed = uint256(tokensOwed0);
            }
        }
        
        // Calculate creator's share (50% of V3 LP fees)
        claimableMon = (monOwed * V3_CREATOR_BPS) / V3_TOTAL_BPS;
        claimableToken = (tokenOwed * V3_CREATOR_BPS) / V3_TOTAL_BPS;
        
        // Get already collected fees (that are in escrow)
        collectedMon = (v3FeesCollectedMon[token] * V3_CREATOR_BPS) / V3_TOTAL_BPS;
        collectedToken = (v3FeesCollectedToken[token] * V3_CREATOR_BPS) / V3_TOTAL_BPS;
    }

    /// @notice Get creator's Curve fees (bonding curve only, excludes V3 fees).
    /// @dev Returns Curve fees by subtracting V3 fees from total creatorUnclaimed/creatorClaimed.
    function getCreatorCurveRewards(address creator)
        external
        view
        returns (
            uint256 curveUnclaimed,
            uint256 curveClaimed
        )
    {
        uint256 totalUnclaimed = creatorUnclaimed[creator];
        uint256 totalClaimed = creatorClaimed[creator];
        uint256 v3Unclaimed = creatorV3Unclaimed[creator];
        uint256 v3Claimed = creatorV3Claimed[creator];
        
        // Curve = Total - V3
        curveUnclaimed = totalUnclaimed > v3Unclaimed ? totalUnclaimed - v3Unclaimed : 0;
        curveClaimed = totalClaimed > v3Claimed ? totalClaimed - v3Claimed : 0;
    }

    /// @notice Get creator's V3 fees (separate tracking).
    /// @dev Returns V3 fees that have been distributed and are claimable/claimed.
    function getCreatorV3RewardsSeparate(address creator)
        external
        view
        returns (
            uint256 v3Unclaimed,
            uint256 v3Claimed
        )
    {
        v3Unclaimed = creatorV3Unclaimed[creator];
        v3Claimed = creatorV3Claimed[creator];
    }

    /// @notice Collect V3 fees from LP position and escrow them (Option 1: Manual).
    /// @dev Can be called by anyone (or restrict to owner/admin if preferred).
    function collectV3Fees(address token) external {
        uint256 tokenId = tokenNftId[token];
        require(tokenId > 0, "FeeDistributor: no NFT for token");
        require(positionManager != address(0), "FeeDistributor: positionManager not set");
        
        // Get position to determine token order
        (, , address token0, address token1, , , , , , , , ) = 
            INonFungiblePositionManager(positionManager).positions(tokenId);
        
        // Collect fees from V3 position
        (uint256 amount0, uint256 amount1) = INonFungiblePositionManager(positionManager).collect(
            INonFungiblePositionManager.CollectParams({
                tokenId: tokenId,
                recipient: address(this),  // Send to FeeDistributor
                amount0Max: type(uint128).max,
                amount1Max: type(uint128).max
            })
        );
        
        // Determine which is WMON and which is token
        uint256 monAmount;
        uint256 tokenAmount;
        
        if (token0 == wmon) {
            monAmount = amount0;
            tokenAmount = amount1;
        } else if (token1 == wmon) {
            monAmount = amount1;
            tokenAmount = amount0;
        } else {
            revert("FeeDistributor: WMON not in pair");
        }
        
        // Unwrap WMON to MON if needed
        if (monAmount > 0) {
            IWMON(wmon).withdraw(monAmount);
        }
        
        // Escrow the fees
        v3FeesCollectedMon[token] += monAmount;
        v3FeesCollectedToken[token] += tokenAmount;
        lastCollectionTime[token] = block.timestamp;
        
        emit V3FeesCollected(token, monAmount, tokenAmount);
    }

    /// @notice Distribute escrowed V3 fees using existing distributeFee logic.
    /// @dev Converts token fees to MON first (or distributes separately).
    function distributeEscrowedV3Fees(address token) external {
        uint256 monAmount = v3FeesCollectedMon[token];
        uint256 tokenAmount = v3FeesCollectedToken[token];
        
        require(monAmount > 0 || tokenAmount > 0, "FeeDistributor: no escrowed fees");
        
        // Reset escrow
        v3FeesCollectedMon[token] = 0;
        v3FeesCollectedToken[token] = 0;
        
        // Distribute MON fees (using existing logic)
        if (monAmount > 0) {
            _distributeV3LpFee(token, monAmount);
        }
        
        // For token fees, you might want to swap to MON first, or distribute separately
        // For now, we'll just emit the event - you can add token distribution logic later
        if (tokenAmount > 0) {
            // TODO: Swap token to MON or distribute token directly
            // For now, just emit event
        }
        
        emit V3FeesDistributed(token, monAmount, tokenAmount);
    }

    // ---------------------------------------------------------------------
    // Fallbacks
    // ---------------------------------------------------------------------

    /// @notice Accept plain native deposits (will NOT be distributed automatically)
    receive() external payable {}

    fallback() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_platformWallet","type":"address"},{"internalType":"address","name":"_positionManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bondingCurve","type":"address"}],"name":"BondingCurveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"netAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grossAmount","type":"uint256"}],"name":"CreatorAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreatorClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorGross","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorNet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"handleAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformAmount","type":"uint256"}],"name":"FeeDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bytes32","name":"handleHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HandleAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bytes32","name":"handleHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HandleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"platformWallet","type":"address"},{"indexed":true,"internalType":"address","name":"stakingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"other1Wallet","type":"address"},{"indexed":false,"internalType":"address","name":"other2Wallet","type":"address"},{"indexed":false,"internalType":"address","name":"other3Wallet","type":"address"},{"indexed":false,"internalType":"address","name":"other4Wallet","type":"address"},{"indexed":false,"internalType":"address","name":"other5Wallet","type":"address"}],"name":"RecipientsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakingContract","type":"address"}],"name":"StakingContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"}],"name":"TokenCreatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bytes32","name":"handleHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"handle","type":"string"},{"indexed":false,"internalType":"uint16","name":"bpsOfCreator","type":"uint16"}],"name":"TokenHandleShareSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"bytes32","name":"handleHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"handle","type":"string"}],"name":"TwitterHandleBound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"bytes32","name":"handleHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"handle","type":"string"}],"name":"TwitterHandleUnbound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"monAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"V3FeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"monAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"V3FeesDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"V3NftRegistered","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BC_CREATOR_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_OTHER1_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_OTHER2_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_OTHER3_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_OTHER4_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_OTHER5_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_PLATFORM_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_STAKING_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BC_TOTAL_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HANDLE_BPS_DENOMINATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_CREATOR_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_OTHER1_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_OTHER2_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_OTHER3_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_OTHER4_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_OTHER5_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_PLATFORM_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_STAKING_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_TOTAL_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"handle","type":"string"}],"name":"bindTwitterHandle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bondingCurve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCreatorRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimCurveRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimHandleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimV3Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"collectV3Fees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creatorClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creatorUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creatorV3Claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creatorV3Unclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"distributeEscrowedV3Fees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"distributeFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getClaimableV3Fees","outputs":[{"internalType":"uint256","name":"monAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getCollectedV3Fees","outputs":[{"internalType":"uint256","name":"monAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"name":"getCreatorCurveRewards","outputs":[{"internalType":"uint256","name":"curveUnclaimed","type":"uint256"},{"internalType":"uint256","name":"curveClaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"creator","type":"address"}],"name":"getCreatorV3Rewards","outputs":[{"internalType":"uint256","name":"claimableMon","type":"uint256"},{"internalType":"uint256","name":"claimableToken","type":"uint256"},{"internalType":"uint256","name":"collectedMon","type":"uint256"},{"internalType":"uint256","name":"collectedToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"name":"getCreatorV3RewardsSeparate","outputs":[{"internalType":"uint256","name":"v3Unclaimed","type":"uint256"},{"internalType":"uint256","name":"v3Claimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"getHandleStatsForWallet","outputs":[{"internalType":"string","name":"handle","type":"string"},{"internalType":"uint16","name":"bpsOfCreator","type":"uint16"},{"internalType":"uint256","name":"unclaimed","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenCreator","outputs":[{"internalType":"address","name":"creatorWallet","type":"address"},{"internalType":"string","name":"creatorHandle","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenFullInfo","outputs":[{"internalType":"address","name":"creatorWallet","type":"address"},{"internalType":"string","name":"creatorHandle","type":"string"},{"internalType":"string","name":"activeHandle","type":"string"},{"internalType":"address","name":"activeHandleWallet","type":"address"},{"internalType":"uint16","name":"handleShareBps","type":"uint16"},{"internalType":"uint256","name":"creatorUnclaimedAmount","type":"uint256"},{"internalType":"uint256","name":"handleUnclaimedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenHandleInfo","outputs":[{"internalType":"string","name":"handle","type":"string"},{"internalType":"uint16","name":"bpsOfCreator","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"handle","type":"string"}],"name":"getWalletForHandle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"handleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"handleHashOfWallet","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"handleLabel","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"handleUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCollectionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"other1Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"other2Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"other3Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"other4Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"other5Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"registerGraduationNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adminWallet","type":"address"}],"name":"setAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bondingCurve","type":"address"}],"name":"setBondingCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformWallet","type":"address"},{"internalType":"address","name":"_stakingWallet","type":"address"},{"internalType":"address","name":"_other1Wallet","type":"address"},{"internalType":"address","name":"_other2Wallet","type":"address"},{"internalType":"address","name":"_other3Wallet","type":"address"},{"internalType":"address","name":"_other4Wallet","type":"address"},{"internalType":"address","name":"_other5Wallet","type":"address"}],"name":"setRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"creator","type":"address"}],"name":"setTokenCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"handle","type":"string"},{"internalType":"uint16","name":"bpsOfCreator","type":"uint16"}],"name":"setTokenHandleShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_positionManager","type":"address"}],"name":"setV3Addresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenConfig","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenHandleShare","outputs":[{"internalType":"bytes32","name":"handleHash","type":"bytes32"},{"internalType":"uint16","name":"bpsOfCreator","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"twitterHandleOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unbindTwitterHandle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"v3FeesCollectedMon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"v3FeesCollectedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"walletOfHandleHash","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wmon","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561000f575f5ffd5b5060405161477038038061477083398101604081905261002e9161018f565b5f80546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b0382166100d65760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a20706c6174666f726d2077616c6c6574206044820152666973207a65726f60c81b606482015260840160405180910390fd5b600e80546001600160a01b03199081166001600160a01b038581169182179093556017805490921684841617909155601054600f5460115460125460135460145460408051948916855292881660208501529087169183019190915285166060820152918416931691907f0ecc98265682cd56ae3665dff6d63e2392a9ed52f34725a8d4700c185c5e222c9060800160405180910390a450506101c0565b80516001600160a01b038116811461018a575f5ffd5b919050565b5f5f604083850312156101a0575f5ffd5b6101a983610174565b91506101b760208401610174565b90509250929050565b6145a3806101cd5f395ff3fe608060405260043610610419575f3560e01c80637d86b8a51161021b578063c75aad7b11610121578063ee99205c116100af578063f971762011610076578063f971762014610c88578063fa2af9da14610cbe578063fcb44e20146105c7578063fe136c4e14610cdd578063ff3d7a1814610d3c57005b8063ee99205c14610bb6578063ef717c7014610bd5578063eff1d50e14610c16578063f2fde38b14610c35578063f7fc5b9814610c5457005b8063dc0e641a116100f3578063dc0e641a14610b20578063e92ebec0146105c7578063eb75b64d14610b3f578063ebe6436514610b5e578063ecc9eda614610b8957005b8063c75aad7b14610a6f578063c78418b914610aa5578063c8166d02146105c7578063ca2bbf3014610ad257005b8063a1e8364f116101a9578063b1dcce2c11610170578063b1dcce2c146109de578063b2308d8e146109f2578063b5d331c414610a1d578063bc69b9e814610a3c578063c68a89b514610a5057005b8063a1e8364f146105c7578063aa74513914610949578063ad1e627114610974578063b151df6a146109b3578063b19f17b41461047657005b80638da5cb5b116101ed5780638da5cb5b146108cd57806393434d47146108eb5780639d9f0815146105c75780639dd373b9146108ff578063a13bd3b31461091e57005b80637d86b8a51461085857806385e144f91461087f57806387c5c5d1146105c75780638d2cce40146108ae57005b80634e281a7b116103205780636c7b14a5116102ae5780637983a2fc116102755780637983a2fc146107ee5780637a096bf9146104d75780637a3fdbe01461081a5780637ae64c8d146108395780637c40d3711461058057005b80636c7b14a5146107855780636e9d7600146105805780637352f67c146106b55780637433a05c146107b0578063791b98bc146107cf57005b806360239dad116102f257806360239dad14610708578063662bbedd14610733578063670f91f714610752578063686b2e13146105c757806368cc97ef1461076657005b80634e281a7b146106a25780634ef81f30146106b55780635aa4a914146106ca5780635c2cb5bf146106e957005b8063314a8265116103a857806343ff1fb81161036f57806343ff1fb81461061a57806344182dfb146106395780634535f5ca1461065857806345bd3bf4146105c75780634c89193e1461067757005b8063314a82651461059557806332e499c5146105c757806335082933146105dc57806336b19cd7146105fb5780633fe8bfd8146105c757005b8063196817d1116103ec578063196817d1146104d757806323f4a666146104ec57806328f42d461461050b57806329afaab71461052a578063302a41f01461058057005b806306ee6ad81461041b57806308ae669114610457578063097b50251461047657806314ff625e1461049e575b005b348015610426575f5ffd5b50600f5461043a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610462575f5ffd5b5060125461043a906001600160a01b031681565b348015610481575f5ffd5b5061048b6103e881565b60405161ffff909116815260200161044e565b3480156104a9575f5ffd5b506104c96104b8366004613e0b565b60036020525f908152604090205481565b60405190815260200161044e565b3480156104e2575f5ffd5b5061048b6105dc81565b3480156104f7575f5ffd5b50610419610506366004613e0b565b610d5b565b348015610516575f5ffd5b50610419610525366004613e0b565b610e5c565b348015610535575f5ffd5b5061056b610544366004613e0b565b6001600160a01b03165f908152600460209081526040808320546005909252909120549091565b6040805192835260208301919091520161044e565b34801561058b575f5ffd5b5061048b61271081565b3480156105a0575f5ffd5b506105b46105af366004613e0b565b610fdc565b60405161044e9796959493929190613e5b565b3480156105d2575f5ffd5b5061048b6101f481565b3480156105e7575f5ffd5b506104196105f6366004613e0b565b61121c565b348015610606575f5ffd5b50600d5461043a906001600160a01b031681565b348015610625575f5ffd5b50610419610634366004613e0b565b61128e565b348015610644575f5ffd5b50610419610653366004613ec4565b611300565b348015610663575f5ffd5b50610419610672366004613efb565b611453565b348015610682575f5ffd5b506104c9610691366004613e0b565b60076020525f908152604090205481565b6104196106b0366004613e0b565b6115f7565b3480156106c0575f5ffd5b5061048b61138881565b3480156106d5575f5ffd5b506104196106e4366004613e0b565b611604565b3480156106f4575f5ffd5b5060135461043a906001600160a01b031681565b348015610713575f5ffd5b506104c9610722366004613e0b565b60196020525f908152604090205481565b34801561073e575f5ffd5b5061041961074d366004613f8c565b61164f565b34801561075d575f5ffd5b5061041961186c565b348015610771575f5ffd5b5061056b610780366004613e0b565b61195d565b348015610790575f5ffd5b506104c961079f366004613e0b565b60046020525f908152604090205481565b3480156107bb575f5ffd5b506104196107ca366004613e0b565b611ac6565b3480156107da575f5ffd5b5060175461043a906001600160a01b031681565b3480156107f9575f5ffd5b5061080d610808366004613e0b565b611e74565b60405161044e9190613fb6565b348015610825575f5ffd5b50610419610834366004614067565b611f0b565b348015610844575f5ffd5b5061080d6108533660046140a1565b61209f565b348015610863575f5ffd5b5061043a733bd359c1119da7da1d913d1c4d2b7c461115433a81565b34801561088a575f5ffd5b5061089e610899366004613ec4565b6120b7565b60405161044e94939291906140b8565b3480156108b9575f5ffd5b506104196108c83660046140ea565b6121f5565b3480156108d8575f5ffd5b505f5461043a906001600160a01b031681565b3480156108f6575f5ffd5b506104196124de565b34801561090a575f5ffd5b50610419610919366004613e0b565b6125ea565b348015610929575f5ffd5b506104c9610938366004613e0b565b60026020525f908152604090205481565b348015610954575f5ffd5b506104c9610963366004613e0b565b60056020525f908152604090205481565b34801561097f575f5ffd5b5061099361098e366004613ec4565b61265c565b60408051948552602085019390935291830152606082015260800161044e565b3480156109be575f5ffd5b506104c96109cd366004613e0b565b60186020525f908152604090205481565b3480156109e9575f5ffd5b506104196128b4565b3480156109fd575f5ffd5b506104c9610a0c366004613e0b565b601a6020525f908152604090205481565b348015610a28575f5ffd5b5061043a610a37366004614067565b612a5e565b348015610a47575f5ffd5b50610419612a88565b348015610a5b575f5ffd5b5060115461043a906001600160a01b031681565b348015610a7a575f5ffd5b506104c9610a89366004613f8c565b600c60209081525f928352604080842090915290825290205481565b348015610ab0575f5ffd5b50610ac4610abf366004613e0b565b612bfb565b60405161044e929190614150565b348015610add575f5ffd5b50610b08610aec366004613e0b565b600a6020525f90815260409020805460019091015461ffff1682565b6040805192835261ffff90911660208301520161044e565b348015610b2b575f5ffd5b5061056b610b3a366004613e0b565b612cd5565b348015610b4a575f5ffd5b5060145461043a906001600160a01b031681565b348015610b69575f5ffd5b506104c9610b78366004613e0b565b601b6020525f908152604090205481565b348015610b94575f5ffd5b50610ba8610ba3366004613e0b565b612d4a565b60405161044e929190614173565b348015610bc1575f5ffd5b5060155461043a906001600160a01b031681565b348015610be0575f5ffd5b5061056b610bef366004613e0b565b6001600160a01b03165f90815260196020908152604080832054601a909252909120549091565b348015610c21575f5ffd5b5060165461043a906001600160a01b031681565b348015610c40575f5ffd5b50610419610c4f366004613e0b565b612e24565b348015610c5f575f5ffd5b5061043a610c6e3660046140a1565b60086020525f90815260409020546001600160a01b031681565b348015610c93575f5ffd5b506104c9610ca2366004613f8c565b600b60209081525f928352604080842090915290825290205481565b348015610cc9575f5ffd5b50600e5461043a906001600160a01b031681565b348015610ce8575f5ffd5b50610d1d610cf7366004613e0b565b60016020525f90815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b03909316835290151560208301520161044e565b348015610d47575f5ffd5b5060105461043a906001600160a01b031681565b6001600160a01b0381165f90815260196020908152604080832054601a9092529091205481151580610d8c57505f81115b610ddd5760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f20657363726f776564206665657360448201526064015b60405180910390fd5b6001600160a01b0383165f908152601960209081526040808320839055601a9091528120558115610e1257610e128383612f0b565b60408051838152602081018390526001600160a01b038516917fec32302a04d508b3b28a6e489c039509dc1363532ed831bfc73b007759bbcdc491015b60405180910390a2505050565b335f9081526007602052604090205480610eb85760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f2068616e646c6520626f756e64006044820152606401610dd4565b6001600160a01b0382165f908152600b6020908152604080832084845290915290205480610f325760405162461bcd60e51b815260206004820152602160248201527f4665654469737472696275746f723a206e6f2068616e646c65207265776172646044820152607360f81b6064820152608401610dd4565b6001600160a01b0383165f818152600b602090815260408083208684528252808320839055928252600c815282822085835290529081208054839290610f799084906141ac565b90915550610f89905033826135b4565b336001600160a01b031682846001600160a01b03167f92b534463e1ee4f769d68240f369a60341ce499586e91cb83de220fc9abe88ed84604051610fcf91815260200190565b60405180910390a4505050565b6001600160a01b038181165f908152600160209081526040808320815180830183529054948516808252600160a01b90950460ff1615158184015284845260069092528220805460609384939092839283928392909161103b906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611067906141c5565b80156110b25780601f10611089576101008083540402835291602001916110b2565b820191905f5260205f20905b81548152906001019060200180831161109557829003601f168201915b5050506001600160a01b038c165f908152600a6020908152604080832081518083018352815480825260019092015461ffff1681850152818552600990935292208054959c5090949193509150611108906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611134906141c5565b801561117f5780601f106111565761010080835404028352916020019161117f565b820191905f5260205f20905b81548152906001019060200180831161116257829003601f168201915b5050505050975060085f8281526020019081526020015f205f9054906101000a90046001600160a01b031696508160200151955060025f8b6001600160a01b03166001600160a01b031681526020019081526020015f20549450600b5f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8281526020019081526020015f20549350505050919395979092949650565b5f546001600160a01b031633146112455760405162461bcd60e51b8152600401610dd4906141fd565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f65ef617d87f7e47ab080058ac1d5ebf06817bbd817e49898ab9f9532405ecd9b905f90a250565b5f546001600160a01b031633146112b75760405162461bcd60e51b8152600401610dd4906141fd565b601680546001600160a01b0319166001600160a01b0383169081179091556040517fc4fda5d836a9aaafabd3088c5f5dcabfe179c3b392b09dbac0e8727667f3c776905f90a250565b5f546001600160a01b03163314806113225750600d546001600160a01b031633145b61136e5760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f74206f776e65722f61646d696e006044820152606401610dd4565b6001600160a01b0382166113d25760405162461bcd60e51b815260206004820152602560248201527f4665654469737472696275746f723a20746f6b656e206973207a65726f206164604482015264647265737360d81b6064820152608401610dd4565b6040805180820182526001600160a01b03808416808352600160208085018281528885165f818152939092528683209551865491511515600160a01b026001600160a81b031990921695169490941793909317909355925190917fc2b9e48c87971930b3535e0acb2a4b96c7287072255994d8caeea5328dc8ef0391a35050565b5f546001600160a01b03163314806114755750600d546001600160a01b031633145b6114c15760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f74206f776e65722f61646d696e006044820152606401610dd4565b6001600160a01b0387166115275760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a20706c6174666f726d2077616c6c6574206044820152666973207a65726f60c81b6064820152608401610dd4565b600e80546001600160a01b03199081166001600160a01b038a8116918217909355600f805483168a85169081179091556010805484168a86169081179091556011805485168a87169081179091556012805486168a88169081179091556013805487168a8916908117909155601480549097169789169788179096556040805192835260208301919091528101949094526060840194909452917f0ecc98265682cd56ae3665dff6d63e2392a9ed52f34725a8d4700c185c5e222c9060800160405180910390a450505050505050565b6116018134613672565b50565b5f546001600160a01b0316331461162d5760405162461bcd60e51b8152600401610dd4906141fd565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031633146116a95760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f7420426f6e64696e6743757276656044820152606401610dd4565b6016546001600160a01b031661170d5760405162461bcd60e51b8152602060048201526024808201527f4665654469737472696275746f723a20426f6e64696e674375727665206e6f74604482015263081cd95d60e21b6064820152608401610dd4565b6001600160a01b0382165f90815260186020526040902054156117815760405162461bcd60e51b815260206004820152602660248201527f4665654469737472696275746f723a204e465420616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610dd4565b6001600160a01b0382166117d75760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a20746f6b656e206973207a65726f0000006044820152606401610dd4565b5f81116118265760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a20746f6b656e4964206973207a65726f006044820152606401610dd4565b6001600160a01b0382165f81815260186020526040808220849055518392917fc9784cea8d2c30f4e33ec792d8b9fe9055b92f4e24a3748c789490e56d290c2b91a35050565b335f9081526002602090815260408083205460049092528220549091818311611895575f61189f565b61189f8284614232565b90505f81116118f05760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f20637572766520726577617264736044820152606401610dd4565b335f90815260026020908152604080832085905560039091528120805483929061191b9084906141ac565b9091555061192b905033826135b4565b60405181815233907fd3a47810d5b7bf060f5a846b2900e17ee7ebfc6e5f09c2c5fc978b967375e3c490602001610e4f565b6001600160a01b0381165f90815260186020526040812054819080158061198d57506017546001600160a01b0316155b1561199d57505f93849350915050565b60175460405163133f757160e31b8152600481018390525f918291829182916001600160a01b03909116906399fbab889060240161018060405180830381865afa1580156119ed573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a11919061428e565b9b509b50505050505050955095505050733bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316846001600160a01b031603611a6b57816001600160801b03169650806001600160801b03169550611abc565b733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b03841601611aad57806001600160801b03169650816001600160801b03169550611abc565b505f9788975095505050505050565b5050505050915091565b6001600160a01b0381165f9081526018602052604090205480611b2b5760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f204e465420666f7220746f6b656e6044820152606401610dd4565b6017546001600160a01b0316611b935760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a20706f736974696f6e4d616e61676572206044820152661b9bdd081cd95d60ca1b6064820152608401610dd4565b60175460405163133f757160e31b8152600481018390525f9182916001600160a01b03909116906399fbab889060240161018060405180830381865afa158015611bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c03919061428e565b5050601754604080516080810182528f81523060208201526001600160801b038183018190526060820152905163fc6f786560e01b8152999d50979b505f9a508a99506001600160a01b03169763fc6f786597611c6b97509550600401935061436892505050565b60408051808303815f875af1158015611c86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611caa91906143ab565b90925090505f80733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b03871601611ce0575082905081611d57565b733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b03861601611d0f575081905082611d57565b60405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a20574d4f4e206e6f7420696e20706169726044820152606401610dd4565b8115611dbe57604051632e1a7d4d60e01b815260048101839052733bd359c1119da7da1d913d1c4d2b7c461115433a90632e1a7d4d906024015f604051808303815f87803b158015611da7575f5ffd5b505af1158015611db9573d5f5f3e3d5ffd5b505050505b6001600160a01b0388165f9081526019602052604081208054849290611de59084906141ac565b90915550506001600160a01b0388165f908152601a602052604081208054839290611e119084906141ac565b90915550506001600160a01b0388165f818152601b602090815260409182902042905581518581529081018490527f95d527d1f3395eb32e2ced24e8f7f5ec4e18ea5427dfe60ac1fe88642c7361a4910160405180910390a25050505050505050565b60066020525f908152604090208054611e8c906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb8906141c5565b8015611f035780601f10611eda57610100808354040283529160200191611f03565b820191905f5260205f20905b815481529060010190602001808311611ee657829003601f168201915b505050505081565b5f5f611f1683613a8c565b5f8281526008602052604090205491935091506001600160a01b0316801580611f4757506001600160a01b03811633145b611f9f5760405162461bcd60e51b8152602060048201526024808201527f4665654469737472696275746f723a2068616e646c6520616c726561647920626044820152631bdd5b9960e21b6064820152608401610dd4565b335f908152600760205260409020548015801590611fbd5750838114155b15611ffd575f81815260086020526040902054336001600160a01b0390911603611ffd575f81815260086020526040902080546001600160a01b03191690555b335f9081526006602052604090206120158482614411565b50335f8181526007602090815260408083208890558783526008825280832080546001600160a01b03191690941790935560099052206120558482614411565b5083336001600160a01b03167f8e0acfaadfec23c32c4265b99babad83b73a03944fdf2a24c38094a032b56b95856040516120909190613fb6565b60405180910390a35050505050565b60096020525f908152604090208054611e8c906141c5565b6001600160a01b038082165f908152600760209081526040808320549386168352600a8252808320815180830183528154815260019091015461ffff1681840152848452600990925282208054606094849384939192909190612119906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612145906141c5565b80156121905780601f1061216757610100808354040283529160200191612190565b820191905f5260205f20905b81548152906001019060200180831161217357829003601f168201915b50505050509550805f015182036121ad57806020015194506121b1565b5f94505b506001600160a01b039096165f818152600b602090815260408083208a8452825280832054938352600c825280832099835298905296909620549396929594505050565b6001600160a01b038381165f908152600160209081526040918290208251808401909352549283168252600160a01b90920460ff161515918101829052849161228c5760405162461bcd60e51b8152602060048201526024808201527f4665654469737472696275746f723a20746f6b656e206e6f7420636f6e6669676044820152631d5c995960e21b6064820152608401610dd4565b80516001600160a01b03163314806122ad57505f546001600160a01b031633145b806122c25750600d546001600160a01b031633145b61231e5760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a206e6f742063726561746f722f6f776e656044820152663917b0b236b4b760c91b6064820152608401610dd4565b61ffff8316158061232e57508351155b156123be576040805180820182525f80825260208083018281526001600160a01b038a16808452600a83528584209451855590516001909401805461ffff191661ffff9095169490941790935583518481529384018290528301819052917f7f648e14577bb175572cecb4fab1bbbcc25c3840ac1829b8f6207d742a28b55e9060600160405180910390a36124d7565b61271061ffff841611156124205760405162461bcd60e51b815260206004820152602360248201527f4665654469737472696275746f723a2068616e646c652062707320746f6f20686044820152620d2ced60eb1b6064820152608401610dd4565b5f5f61242b86613a8c565b60408051808201825283815261ffff89811660208084019182526001600160a01b038e165f908152600a82528581209451855591516001909401805461ffff19169490931693909317909155848152600990915220919350915061248f8282614411565b5081876001600160a01b03167f7f648e14577bb175572cecb4fab1bbbcc25c3840ac1829b8f6207d742a28b55e83886040516124cc929190614173565b60405180910390a350505b5050505050565b335f90815260026020526040902054806125455760405162461bcd60e51b815260206004820152602260248201527f4665654469737472696275746f723a206e6f2063726561746f72207265776172604482015261647360f01b6064820152608401610dd4565b335f908152600460209081526040808320805460028452828520859055908490556003909252822080549192849261257e9084906141ac565b9091555050335f90815260056020526040812080548392906125a19084906141ac565b909155506125b1905033836135b4565b60405182815233907fd3a47810d5b7bf060f5a846b2900e17ee7ebfc6e5f09c2c5fc978b967375e3c49060200160405180910390a25050565b5f546001600160a01b031633146126135760405162461bcd60e51b8152600401610dd4906141fd565b601580546001600160a01b0319166001600160a01b0383169081179091556040517f6397f5b135542bb3f477cb346cfab5abdec1251d08dc8f8d4efb4ffe122ea0bf905f90a250565b6001600160a01b038281165f908152600160209081526040808320815180830190925254808516808352600160a01b90910460ff1615159282019290925291928392839283928716146126bb575f5f5f5f9450945094509450506128ab565b6001600160a01b0387165f90815260186020526040812054908082158015906126ee57506017546001600160a01b031615155b156128045760175460405163133f757160e31b8152600481018590525f918291829182916001600160a01b03909116906399fbab889060240161018060405180830381865afa158015612743573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612767919061428e565b9b509b50505050505050955095505050733bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316846001600160a01b0316036127c157816001600160801b03169550806001600160801b031694506127ff565b733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b038416016127ff57806001600160801b03169550816001600160801b031694505b505050505b612710612813611388846144cc565b61281d91906144e3565b975061271061282e611388836144cc565b61283891906144e3565b6001600160a01b038b165f908152601960205260409020549097506127109061286490611388906144cc565b61286e91906144e3565b6001600160a01b038b165f908152601a60205260409020549096506127109061289a90611388906144cc565b6128a491906144e3565b9450505050505b92959194509250565b335f90815260076020526040902054806129105760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f2068616e646c6520626f756e64006044820152606401610dd4565b335f9081526006602052604081208054612929906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612955906141c5565b80156129a05780601f10612977576101008083540402835291602001916129a0565b820191905f5260205f20905b81548152906001019060200180831161298357829003601f168201915b5050335f81815260076020908152604080832083905580518083018252838152938352600690915290209495506129dc93509150839050614411565b505f82815260086020526040902054336001600160a01b0390911603612a18575f82815260086020526040902080546001600160a01b03191690555b81336001600160a01b03167ff7129563dfed00fb57275470a393d0e2fd8ca5a4da3afa7a41872696b283a9a183604051612a529190613fb6565b60405180910390a35050565b5f5f612a6983613a8c565b505f908152600860205260409020546001600160a01b03169392505050565b335f9081526004602052604090205480612ae45760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a206e6f20563320726577617264730000006044820152606401610dd4565b335f90815260026020526040902054811115612b425760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a20696e76616c69642073746174650000006044820152606401610dd4565b335f9081526002602052604081208054839290612b60908490614232565b9091555050335f908152600460209081526040808320839055600390915281208054839290612b909084906141ac565b9091555050335f9081526005602052604081208054839290612bb39084906141ac565b90915550612bc3905033826135b4565b60405181815233907fd3a47810d5b7bf060f5a846b2900e17ee7ebfc6e5f09c2c5fc978b967375e3c49060200160405180910390a250565b6001600160a01b038181165f908152600160209081526040808320815180830183529054948516808252600160a01b90950460ff16151581840152848452600690925290912080546060929190612c51906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c7d906141c5565b8015612cc85780601f10612c9f57610100808354040283529160200191612cc8565b820191905f5260205f20905b815481529060010190602001808311612cab57829003601f168201915b5050505050915050915091565b6001600160a01b0381165f9081526002602090815260408083205460038352818420546004845282852054600590945291842054849391929190818411612d1c575f612d26565b612d268285614232565b9550808311612d35575f612d3f565b612d3f8184614232565b945050505050915091565b6001600160a01b0381165f908152600a6020908152604080832081518083018352815480825260019092015461ffff1681850152908452600990925282208054606093929190612d99906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc5906141c5565b8015612e105780601f10612de757610100808354040283529160200191612e10565b820191905f5260205f20905b815481529060010190602001808311612df357829003601f168201915b505050505092508060200151915050915091565b5f546001600160a01b03163314612e4d5760405162461bcd60e51b8152600401610dd4906141fd565b6001600160a01b038116612eb25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd4565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f8111612f5a5760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a206e6f2076616c75652073656e740000006044820152606401610dd4565b6001600160a01b038281165f9081526001602090815260408083208151808301835290549485168152600160a01b90940460ff16151584830152805160c0810182528381529182018390528101829052606081018290526080810182905260a0810191909152612710612fcf611388856144cc565b612fd991906144e3565b8152612710612fea6105dc856144cc565b612ff491906144e3565b60608201526127106130086103e8856144cc565b61301291906144e3565b608082018190526060820151825161302a91906141ac565b61303491906141ac565b60a08201525f6127106130496101f4866144cc565b61305391906144e3565b9050808260a00181815161306791906141ac565b90525080156130b2576010546001600160a01b03161561309c57601054613097906001600160a01b0316826135b4565b6130b2565b80826080018181516130ae91906141ac565b9052505b6127106130c16101f4866144cc565b6130cb91906144e3565b9050808260a0018181516130df91906141ac565b905250801561312a576011546001600160a01b0316156131145760115461310f906001600160a01b0316826135b4565b61312a565b808260800181815161312691906141ac565b9052505b6127106131396101f4866144cc565b61314391906144e3565b9050808260a00181815161315791906141ac565b90525080156131a2576012546001600160a01b03161561318c57601254613187906001600160a01b0316826135b4565b6131a2565b808260800181815161319e91906141ac565b9052505b6127106131b16101f4866144cc565b6131bb91906144e3565b9050808260a0018181516131cf91906141ac565b905250801561321a576013546001600160a01b031615613204576013546131ff906001600160a01b0316826135b4565b61321a565b808260800181815161321691906141ac565b9052505b6127106132296101f4866144cc565b61323391906144e3565b9050808260a00181815161324791906141ac565b9052508015613292576014546001600160a01b03161561327c57601454613277906001600160a01b0316826135b4565b613292565b808260800181815161328e91906141ac565b9052505b5f8260a00151856132a39190614232565b905080836080018181516132b791906141ac565b9052508251158015906132d3575083516001600160a01b031615155b156133b2576132e586845f0151613ccb565b604085015260208401819052156133ad5760208084015185516001600160a01b03165f9081526002909252604082208054919290916133259084906141ac565b909155505060208084015185516001600160a01b03165f9081526004909252604082208054919290916133599084906141ac565b90915550508351602084810151855160408051928352928201526001600160a01b038981169316917f0d4cef82a4f7c87c7bf598878d7b68f98bb9a0e98b5fec2b8e96f444fb40f37f910160405180910390a35b6133cc565b82516080840180516133c59083906141ac565b9052505f83525b6060830151156134ee576015546001600160a01b03161561349d57601554606084015160408051600481526024810182526020810180516001600160e01b031663014d6aed60e41b17905290515f936001600160a01b0316929161342f91614519565b5f6040518083038185875af1925050503d805f8114613469576040519150601f19603f3d011682016040523d82523d5f602084013e61346e565b606091505b50509050806134975783606001518460800181815161348d91906141ac565b9052505f60608501525b506134ee565b600f546001600160a01b0316156134ce57600f5460608401516134c9916001600160a01b0316906135b4565b6134ee565b8260600151836080018181516134e491906141ac565b9052505f60608401525b60808301511561353957600e545f906001600160a01b031661351a575f546001600160a01b0316613527565b600e546001600160a01b03165b90506135378185608001516135b4565b505b82516020808501516040808701516060808901516080808b015185518e8152978801989098529386019490945284015282015260a08101919091526001600160a01b038716907fe205594824e0b766055113357eb9ca852cce628f1cd9cd5672527343a4e469079060c00160405180910390a2505050505050565b805f036135bf575050565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613608576040519150601f19603f3d011682016040523d82523d5f602084013e61360d565b606091505b505090508061366d5760405162461bcd60e51b815260206004820152602660248201527f4665654469737472696275746f723a206e6174697665207472616e736665722060448201526519985a5b195960d21b6064820152608401610dd4565b505050565b5f81116136c15760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a206e6f2076616c75652073656e740000006044820152606401610dd4565b6001600160a01b038281165f9081526001602090815260408083208151808301835290549485168152600160a01b90940460ff16151584830152805160c0810182528381529182018390528101829052606081018290526080810182905260a0810191909152612710613736611388856144cc565b61374091906144e3565b81526127106137516105dc856144cc565b61375b91906144e3565b606082015261271061376f6103e8856144cc565b61377991906144e3565b608082018190526060820151825161379191906141ac565b61379b91906141ac565b60a08201525f6127106137b06101f4866144cc565b6137ba91906144e3565b9050808260a0018181516137ce91906141ac565b9052508015613819576010546001600160a01b031615613803576010546137fe906001600160a01b0316826135b4565b613819565b808260800181815161381591906141ac565b9052505b6127106138286101f4866144cc565b61383291906144e3565b9050808260a00181815161384691906141ac565b9052508015613891576011546001600160a01b03161561387b57601154613876906001600160a01b0316826135b4565b613891565b808260800181815161388d91906141ac565b9052505b6127106138a06101f4866144cc565b6138aa91906144e3565b9050808260a0018181516138be91906141ac565b9052508015613909576012546001600160a01b0316156138f3576012546138ee906001600160a01b0316826135b4565b613909565b808260800181815161390591906141ac565b9052505b6127106139186101f4866144cc565b61392291906144e3565b9050808260a00181815161393691906141ac565b9052508015613981576013546001600160a01b03161561396b57601354613966906001600160a01b0316826135b4565b613981565b808260800181815161397d91906141ac565b9052505b6127106139906101f4866144cc565b61399a91906144e3565b9050808260a0018181516139ae91906141ac565b90525080156139f9576014546001600160a01b0316156139e3576014546139de906001600160a01b0316826135b4565b6139f9565b80826080018181516139f591906141ac565b9052505b5f8260a0015185613a0a9190614232565b90508083608001818151613a1e91906141ac565b905250825115801590613a3a575083516001600160a01b031615155b156133b257613a4c86845f0151613ccb565b604085015260208401819052156133ad5760208084015185516001600160a01b03165f9081526002909252604082208054919290916133599084906141ac565b80515f90606090839080613ae25760405162461bcd60e51b815260206004820152601c60248201527f4665654469737472696275746f723a20656d7074792068616e646c65000000006044820152606401610dd4565b81515f90600160fe1b9084908390613afc57613afc614524565b01602001516001600160f81b03191603613b645760018211613b605760405162461bcd60e51b815260206004820152601c60248201527f4665654469737472696275746f723a20656d7074792068616e646c65000000006044820152606401610dd4565b5060015b5f613b6f8284614232565b67ffffffffffffffff811115613b8757613b87613fc8565b6040519080825280601f01601f191660200182016040528015613bb1576020820181803683370190505b509050815b83811015613c95575f858281518110613bd157613bd1614524565b016020015160f81c905060418110801590613bf05750605a8160ff1611155b15613c3957613c00816020614538565b60f81b83613c0e8685614232565b81518110613c1e57613c1e614524565b60200101906001600160f81b03191690815f1a905350613c8c565b858281518110613c4b57613c4b614524565b01602001516001600160f81b03191683613c658685614232565b81518110613c7557613c75614524565b60200101906001600160f81b03191690815f1a9053505b50600101613bb6565b5080945080604051602001613caa9190614551565b60405160208183030381529060405280519060200120955050505050915091565b6001600160a01b0382165f908152600a602090815260408083208151808301909252805480835260019091015461ffff1692820192909252839291831580613d11575080155b80613d225750602082015161ffff16155b15613d3257505f9150613df09050565b602082015161271090613d499061ffff16876144cc565b613d5391906144e3565b9250825f03613d6757505f9150613df09050565b613d718386614232565b6001600160a01b0387165f908152600b60209081526040808320858452909152812080549296508592909190613da89084906141ac565b909155505060405183815281906001600160a01b038816907f0250a3283d2094fdc6db498e1475e74e424a6eceda9e99f2ec15be2c4d3883b59060200160405180910390a350505b9250929050565b6001600160a01b0381168114611601575f5ffd5b5f60208284031215613e1b575f5ffd5b8135613e2681613df7565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038816815260e0602082018190525f90613e7e90830189613e2d565b8281036040840152613e908189613e2d565b6001600160a01b03979097166060840152505061ffff93909316608084015260a083019190915260c0909101529392505050565b5f5f60408385031215613ed5575f5ffd5b8235613ee081613df7565b91506020830135613ef081613df7565b809150509250929050565b5f5f5f5f5f5f5f60e0888a031215613f11575f5ffd5b8735613f1c81613df7565b96506020880135613f2c81613df7565b95506040880135613f3c81613df7565b94506060880135613f4c81613df7565b93506080880135613f5c81613df7565b925060a0880135613f6c81613df7565b915060c0880135613f7c81613df7565b8091505092959891949750929550565b5f5f60408385031215613f9d575f5ffd5b8235613fa881613df7565b946020939093013593505050565b602081525f613e266020830184613e2d565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613feb575f5ffd5b813567ffffffffffffffff81111561400557614005613fc8565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561403457614034613fc8565b60405281815283820160200185101561404b575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215614077575f5ffd5b813567ffffffffffffffff81111561408d575f5ffd5b61409984828501613fdc565b949350505050565b5f602082840312156140b1575f5ffd5b5035919050565b608081525f6140ca6080830187613e2d565b61ffff959095166020830152506040810192909252606090910152919050565b5f5f5f606084860312156140fc575f5ffd5b833561410781613df7565b9250602084013567ffffffffffffffff811115614122575f5ffd5b61412e86828701613fdc565b925050604084013561ffff81168114614145575f5ffd5b809150509250925092565b6001600160a01b03831681526040602082018190525f9061409990830184613e2d565b604081525f6141856040830185613e2d565b905061ffff831660208301529392505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156141bf576141bf614198565b92915050565b600181811c908216806141d957607f821691505b6020821081036141f757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b818103818111156141bf576141bf614198565b805161425081613df7565b919050565b805162ffffff81168114614250575f5ffd5b8051600281900b8114614250575f5ffd5b80516001600160801b0381168114614250575f5ffd5b5f5f5f5f5f5f5f5f5f5f5f5f6101808d8f0312156142aa575f5ffd5b8c516bffffffffffffffffffffffff811681146142c5575f5ffd5b9b506142d360208e01614245565b9a506142e160408e01614245565b99506142ef60608e01614245565b98506142fd60808e01614255565b975061430b60a08e01614267565b965061431960c08e01614267565b955061432760e08e01614278565b6101008e01516101208f0151919650945092506143476101408e01614278565b91506143566101608e01614278565b90509295989b509295989b509295989b565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f5f604083850312156143bc575f5ffd5b505080516020909101519092909150565b601f82111561366d57805f5260205f20601f840160051c810160208510156143f25750805b601f840160051c820191505b818110156124d7575f81556001016143fe565b815167ffffffffffffffff81111561442b5761442b613fc8565b61443f8161443984546141c5565b846143cd565b6020601f821160018114614471575f831561445a5750848201515b5f19600385901b1c1916600184901b1784556124d7565b5f84815260208120601f198516915b828110156144a05787850151825560209485019460019092019101614480565b50848210156144bd57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b80820281158282048414176141bf576141bf614198565b5f826144fd57634e487b7160e01b5f52601260045260245ffd5b500490565b5f81518060208401855e5f93019283525090919050565b5f613e268284614502565b634e487b7160e01b5f52603260045260245ffd5b60ff81811683821601908111156141bf576141bf614198565b673a3bb4ba3a32b91d60c11b81525f613e26600883018461450256fea2646970667358221220ab549d56225fdd57c073c00152121c6866fd080d9fc8efd934543f86f9cb309764736f6c634300081e0033000000000000000000000000300dba24233b87ec0bcfaebe89d586619f02cacf0000000000000000000000007197e214c0b767cfb76fb734ab638e2c192f4e53

Deployed Bytecode

0x608060405260043610610419575f3560e01c80637d86b8a51161021b578063c75aad7b11610121578063ee99205c116100af578063f971762011610076578063f971762014610c88578063fa2af9da14610cbe578063fcb44e20146105c7578063fe136c4e14610cdd578063ff3d7a1814610d3c57005b8063ee99205c14610bb6578063ef717c7014610bd5578063eff1d50e14610c16578063f2fde38b14610c35578063f7fc5b9814610c5457005b8063dc0e641a116100f3578063dc0e641a14610b20578063e92ebec0146105c7578063eb75b64d14610b3f578063ebe6436514610b5e578063ecc9eda614610b8957005b8063c75aad7b14610a6f578063c78418b914610aa5578063c8166d02146105c7578063ca2bbf3014610ad257005b8063a1e8364f116101a9578063b1dcce2c11610170578063b1dcce2c146109de578063b2308d8e146109f2578063b5d331c414610a1d578063bc69b9e814610a3c578063c68a89b514610a5057005b8063a1e8364f146105c7578063aa74513914610949578063ad1e627114610974578063b151df6a146109b3578063b19f17b41461047657005b80638da5cb5b116101ed5780638da5cb5b146108cd57806393434d47146108eb5780639d9f0815146105c75780639dd373b9146108ff578063a13bd3b31461091e57005b80637d86b8a51461085857806385e144f91461087f57806387c5c5d1146105c75780638d2cce40146108ae57005b80634e281a7b116103205780636c7b14a5116102ae5780637983a2fc116102755780637983a2fc146107ee5780637a096bf9146104d75780637a3fdbe01461081a5780637ae64c8d146108395780637c40d3711461058057005b80636c7b14a5146107855780636e9d7600146105805780637352f67c146106b55780637433a05c146107b0578063791b98bc146107cf57005b806360239dad116102f257806360239dad14610708578063662bbedd14610733578063670f91f714610752578063686b2e13146105c757806368cc97ef1461076657005b80634e281a7b146106a25780634ef81f30146106b55780635aa4a914146106ca5780635c2cb5bf146106e957005b8063314a8265116103a857806343ff1fb81161036f57806343ff1fb81461061a57806344182dfb146106395780634535f5ca1461065857806345bd3bf4146105c75780634c89193e1461067757005b8063314a82651461059557806332e499c5146105c757806335082933146105dc57806336b19cd7146105fb5780633fe8bfd8146105c757005b8063196817d1116103ec578063196817d1146104d757806323f4a666146104ec57806328f42d461461050b57806329afaab71461052a578063302a41f01461058057005b806306ee6ad81461041b57806308ae669114610457578063097b50251461047657806314ff625e1461049e575b005b348015610426575f5ffd5b50600f5461043a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610462575f5ffd5b5060125461043a906001600160a01b031681565b348015610481575f5ffd5b5061048b6103e881565b60405161ffff909116815260200161044e565b3480156104a9575f5ffd5b506104c96104b8366004613e0b565b60036020525f908152604090205481565b60405190815260200161044e565b3480156104e2575f5ffd5b5061048b6105dc81565b3480156104f7575f5ffd5b50610419610506366004613e0b565b610d5b565b348015610516575f5ffd5b50610419610525366004613e0b565b610e5c565b348015610535575f5ffd5b5061056b610544366004613e0b565b6001600160a01b03165f908152600460209081526040808320546005909252909120549091565b6040805192835260208301919091520161044e565b34801561058b575f5ffd5b5061048b61271081565b3480156105a0575f5ffd5b506105b46105af366004613e0b565b610fdc565b60405161044e9796959493929190613e5b565b3480156105d2575f5ffd5b5061048b6101f481565b3480156105e7575f5ffd5b506104196105f6366004613e0b565b61121c565b348015610606575f5ffd5b50600d5461043a906001600160a01b031681565b348015610625575f5ffd5b50610419610634366004613e0b565b61128e565b348015610644575f5ffd5b50610419610653366004613ec4565b611300565b348015610663575f5ffd5b50610419610672366004613efb565b611453565b348015610682575f5ffd5b506104c9610691366004613e0b565b60076020525f908152604090205481565b6104196106b0366004613e0b565b6115f7565b3480156106c0575f5ffd5b5061048b61138881565b3480156106d5575f5ffd5b506104196106e4366004613e0b565b611604565b3480156106f4575f5ffd5b5060135461043a906001600160a01b031681565b348015610713575f5ffd5b506104c9610722366004613e0b565b60196020525f908152604090205481565b34801561073e575f5ffd5b5061041961074d366004613f8c565b61164f565b34801561075d575f5ffd5b5061041961186c565b348015610771575f5ffd5b5061056b610780366004613e0b565b61195d565b348015610790575f5ffd5b506104c961079f366004613e0b565b60046020525f908152604090205481565b3480156107bb575f5ffd5b506104196107ca366004613e0b565b611ac6565b3480156107da575f5ffd5b5060175461043a906001600160a01b031681565b3480156107f9575f5ffd5b5061080d610808366004613e0b565b611e74565b60405161044e9190613fb6565b348015610825575f5ffd5b50610419610834366004614067565b611f0b565b348015610844575f5ffd5b5061080d6108533660046140a1565b61209f565b348015610863575f5ffd5b5061043a733bd359c1119da7da1d913d1c4d2b7c461115433a81565b34801561088a575f5ffd5b5061089e610899366004613ec4565b6120b7565b60405161044e94939291906140b8565b3480156108b9575f5ffd5b506104196108c83660046140ea565b6121f5565b3480156108d8575f5ffd5b505f5461043a906001600160a01b031681565b3480156108f6575f5ffd5b506104196124de565b34801561090a575f5ffd5b50610419610919366004613e0b565b6125ea565b348015610929575f5ffd5b506104c9610938366004613e0b565b60026020525f908152604090205481565b348015610954575f5ffd5b506104c9610963366004613e0b565b60056020525f908152604090205481565b34801561097f575f5ffd5b5061099361098e366004613ec4565b61265c565b60408051948552602085019390935291830152606082015260800161044e565b3480156109be575f5ffd5b506104c96109cd366004613e0b565b60186020525f908152604090205481565b3480156109e9575f5ffd5b506104196128b4565b3480156109fd575f5ffd5b506104c9610a0c366004613e0b565b601a6020525f908152604090205481565b348015610a28575f5ffd5b5061043a610a37366004614067565b612a5e565b348015610a47575f5ffd5b50610419612a88565b348015610a5b575f5ffd5b5060115461043a906001600160a01b031681565b348015610a7a575f5ffd5b506104c9610a89366004613f8c565b600c60209081525f928352604080842090915290825290205481565b348015610ab0575f5ffd5b50610ac4610abf366004613e0b565b612bfb565b60405161044e929190614150565b348015610add575f5ffd5b50610b08610aec366004613e0b565b600a6020525f90815260409020805460019091015461ffff1682565b6040805192835261ffff90911660208301520161044e565b348015610b2b575f5ffd5b5061056b610b3a366004613e0b565b612cd5565b348015610b4a575f5ffd5b5060145461043a906001600160a01b031681565b348015610b69575f5ffd5b506104c9610b78366004613e0b565b601b6020525f908152604090205481565b348015610b94575f5ffd5b50610ba8610ba3366004613e0b565b612d4a565b60405161044e929190614173565b348015610bc1575f5ffd5b5060155461043a906001600160a01b031681565b348015610be0575f5ffd5b5061056b610bef366004613e0b565b6001600160a01b03165f90815260196020908152604080832054601a909252909120549091565b348015610c21575f5ffd5b5060165461043a906001600160a01b031681565b348015610c40575f5ffd5b50610419610c4f366004613e0b565b612e24565b348015610c5f575f5ffd5b5061043a610c6e3660046140a1565b60086020525f90815260409020546001600160a01b031681565b348015610c93575f5ffd5b506104c9610ca2366004613f8c565b600b60209081525f928352604080842090915290825290205481565b348015610cc9575f5ffd5b50600e5461043a906001600160a01b031681565b348015610ce8575f5ffd5b50610d1d610cf7366004613e0b565b60016020525f90815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b03909316835290151560208301520161044e565b348015610d47575f5ffd5b5060105461043a906001600160a01b031681565b6001600160a01b0381165f90815260196020908152604080832054601a9092529091205481151580610d8c57505f81115b610ddd5760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f20657363726f776564206665657360448201526064015b60405180910390fd5b6001600160a01b0383165f908152601960209081526040808320839055601a9091528120558115610e1257610e128383612f0b565b60408051838152602081018390526001600160a01b038516917fec32302a04d508b3b28a6e489c039509dc1363532ed831bfc73b007759bbcdc491015b60405180910390a2505050565b335f9081526007602052604090205480610eb85760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f2068616e646c6520626f756e64006044820152606401610dd4565b6001600160a01b0382165f908152600b6020908152604080832084845290915290205480610f325760405162461bcd60e51b815260206004820152602160248201527f4665654469737472696275746f723a206e6f2068616e646c65207265776172646044820152607360f81b6064820152608401610dd4565b6001600160a01b0383165f818152600b602090815260408083208684528252808320839055928252600c815282822085835290529081208054839290610f799084906141ac565b90915550610f89905033826135b4565b336001600160a01b031682846001600160a01b03167f92b534463e1ee4f769d68240f369a60341ce499586e91cb83de220fc9abe88ed84604051610fcf91815260200190565b60405180910390a4505050565b6001600160a01b038181165f908152600160209081526040808320815180830183529054948516808252600160a01b90950460ff1615158184015284845260069092528220805460609384939092839283928392909161103b906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611067906141c5565b80156110b25780601f10611089576101008083540402835291602001916110b2565b820191905f5260205f20905b81548152906001019060200180831161109557829003601f168201915b5050506001600160a01b038c165f908152600a6020908152604080832081518083018352815480825260019092015461ffff1681850152818552600990935292208054959c5090949193509150611108906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611134906141c5565b801561117f5780601f106111565761010080835404028352916020019161117f565b820191905f5260205f20905b81548152906001019060200180831161116257829003601f168201915b5050505050975060085f8281526020019081526020015f205f9054906101000a90046001600160a01b031696508160200151955060025f8b6001600160a01b03166001600160a01b031681526020019081526020015f20549450600b5f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8281526020019081526020015f20549350505050919395979092949650565b5f546001600160a01b031633146112455760405162461bcd60e51b8152600401610dd4906141fd565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f65ef617d87f7e47ab080058ac1d5ebf06817bbd817e49898ab9f9532405ecd9b905f90a250565b5f546001600160a01b031633146112b75760405162461bcd60e51b8152600401610dd4906141fd565b601680546001600160a01b0319166001600160a01b0383169081179091556040517fc4fda5d836a9aaafabd3088c5f5dcabfe179c3b392b09dbac0e8727667f3c776905f90a250565b5f546001600160a01b03163314806113225750600d546001600160a01b031633145b61136e5760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f74206f776e65722f61646d696e006044820152606401610dd4565b6001600160a01b0382166113d25760405162461bcd60e51b815260206004820152602560248201527f4665654469737472696275746f723a20746f6b656e206973207a65726f206164604482015264647265737360d81b6064820152608401610dd4565b6040805180820182526001600160a01b03808416808352600160208085018281528885165f818152939092528683209551865491511515600160a01b026001600160a81b031990921695169490941793909317909355925190917fc2b9e48c87971930b3535e0acb2a4b96c7287072255994d8caeea5328dc8ef0391a35050565b5f546001600160a01b03163314806114755750600d546001600160a01b031633145b6114c15760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f74206f776e65722f61646d696e006044820152606401610dd4565b6001600160a01b0387166115275760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a20706c6174666f726d2077616c6c6574206044820152666973207a65726f60c81b6064820152608401610dd4565b600e80546001600160a01b03199081166001600160a01b038a8116918217909355600f805483168a85169081179091556010805484168a86169081179091556011805485168a87169081179091556012805486168a88169081179091556013805487168a8916908117909155601480549097169789169788179096556040805192835260208301919091528101949094526060840194909452917f0ecc98265682cd56ae3665dff6d63e2392a9ed52f34725a8d4700c185c5e222c9060800160405180910390a450505050505050565b6116018134613672565b50565b5f546001600160a01b0316331461162d5760405162461bcd60e51b8152600401610dd4906141fd565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031633146116a95760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f7420426f6e64696e6743757276656044820152606401610dd4565b6016546001600160a01b031661170d5760405162461bcd60e51b8152602060048201526024808201527f4665654469737472696275746f723a20426f6e64696e674375727665206e6f74604482015263081cd95d60e21b6064820152608401610dd4565b6001600160a01b0382165f90815260186020526040902054156117815760405162461bcd60e51b815260206004820152602660248201527f4665654469737472696275746f723a204e465420616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610dd4565b6001600160a01b0382166117d75760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a20746f6b656e206973207a65726f0000006044820152606401610dd4565b5f81116118265760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a20746f6b656e4964206973207a65726f006044820152606401610dd4565b6001600160a01b0382165f81815260186020526040808220849055518392917fc9784cea8d2c30f4e33ec792d8b9fe9055b92f4e24a3748c789490e56d290c2b91a35050565b335f9081526002602090815260408083205460049092528220549091818311611895575f61189f565b61189f8284614232565b90505f81116118f05760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f20637572766520726577617264736044820152606401610dd4565b335f90815260026020908152604080832085905560039091528120805483929061191b9084906141ac565b9091555061192b905033826135b4565b60405181815233907fd3a47810d5b7bf060f5a846b2900e17ee7ebfc6e5f09c2c5fc978b967375e3c490602001610e4f565b6001600160a01b0381165f90815260186020526040812054819080158061198d57506017546001600160a01b0316155b1561199d57505f93849350915050565b60175460405163133f757160e31b8152600481018390525f918291829182916001600160a01b03909116906399fbab889060240161018060405180830381865afa1580156119ed573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a11919061428e565b9b509b50505050505050955095505050733bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316846001600160a01b031603611a6b57816001600160801b03169650806001600160801b03169550611abc565b733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b03841601611aad57806001600160801b03169650816001600160801b03169550611abc565b505f9788975095505050505050565b5050505050915091565b6001600160a01b0381165f9081526018602052604090205480611b2b5760405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a206e6f204e465420666f7220746f6b656e6044820152606401610dd4565b6017546001600160a01b0316611b935760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a20706f736974696f6e4d616e61676572206044820152661b9bdd081cd95d60ca1b6064820152608401610dd4565b60175460405163133f757160e31b8152600481018390525f9182916001600160a01b03909116906399fbab889060240161018060405180830381865afa158015611bdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c03919061428e565b5050601754604080516080810182528f81523060208201526001600160801b038183018190526060820152905163fc6f786560e01b8152999d50979b505f9a508a99506001600160a01b03169763fc6f786597611c6b97509550600401935061436892505050565b60408051808303815f875af1158015611c86573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611caa91906143ab565b90925090505f80733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b03871601611ce0575082905081611d57565b733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b03861601611d0f575081905082611d57565b60405162461bcd60e51b815260206004820181905260248201527f4665654469737472696275746f723a20574d4f4e206e6f7420696e20706169726044820152606401610dd4565b8115611dbe57604051632e1a7d4d60e01b815260048101839052733bd359c1119da7da1d913d1c4d2b7c461115433a90632e1a7d4d906024015f604051808303815f87803b158015611da7575f5ffd5b505af1158015611db9573d5f5f3e3d5ffd5b505050505b6001600160a01b0388165f9081526019602052604081208054849290611de59084906141ac565b90915550506001600160a01b0388165f908152601a602052604081208054839290611e119084906141ac565b90915550506001600160a01b0388165f818152601b602090815260409182902042905581518581529081018490527f95d527d1f3395eb32e2ced24e8f7f5ec4e18ea5427dfe60ac1fe88642c7361a4910160405180910390a25050505050505050565b60066020525f908152604090208054611e8c906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb8906141c5565b8015611f035780601f10611eda57610100808354040283529160200191611f03565b820191905f5260205f20905b815481529060010190602001808311611ee657829003601f168201915b505050505081565b5f5f611f1683613a8c565b5f8281526008602052604090205491935091506001600160a01b0316801580611f4757506001600160a01b03811633145b611f9f5760405162461bcd60e51b8152602060048201526024808201527f4665654469737472696275746f723a2068616e646c6520616c726561647920626044820152631bdd5b9960e21b6064820152608401610dd4565b335f908152600760205260409020548015801590611fbd5750838114155b15611ffd575f81815260086020526040902054336001600160a01b0390911603611ffd575f81815260086020526040902080546001600160a01b03191690555b335f9081526006602052604090206120158482614411565b50335f8181526007602090815260408083208890558783526008825280832080546001600160a01b03191690941790935560099052206120558482614411565b5083336001600160a01b03167f8e0acfaadfec23c32c4265b99babad83b73a03944fdf2a24c38094a032b56b95856040516120909190613fb6565b60405180910390a35050505050565b60096020525f908152604090208054611e8c906141c5565b6001600160a01b038082165f908152600760209081526040808320549386168352600a8252808320815180830183528154815260019091015461ffff1681840152848452600990925282208054606094849384939192909190612119906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612145906141c5565b80156121905780601f1061216757610100808354040283529160200191612190565b820191905f5260205f20905b81548152906001019060200180831161217357829003601f168201915b50505050509550805f015182036121ad57806020015194506121b1565b5f94505b506001600160a01b039096165f818152600b602090815260408083208a8452825280832054938352600c825280832099835298905296909620549396929594505050565b6001600160a01b038381165f908152600160209081526040918290208251808401909352549283168252600160a01b90920460ff161515918101829052849161228c5760405162461bcd60e51b8152602060048201526024808201527f4665654469737472696275746f723a20746f6b656e206e6f7420636f6e6669676044820152631d5c995960e21b6064820152608401610dd4565b80516001600160a01b03163314806122ad57505f546001600160a01b031633145b806122c25750600d546001600160a01b031633145b61231e5760405162461bcd60e51b815260206004820152602760248201527f4665654469737472696275746f723a206e6f742063726561746f722f6f776e656044820152663917b0b236b4b760c91b6064820152608401610dd4565b61ffff8316158061232e57508351155b156123be576040805180820182525f80825260208083018281526001600160a01b038a16808452600a83528584209451855590516001909401805461ffff191661ffff9095169490941790935583518481529384018290528301819052917f7f648e14577bb175572cecb4fab1bbbcc25c3840ac1829b8f6207d742a28b55e9060600160405180910390a36124d7565b61271061ffff841611156124205760405162461bcd60e51b815260206004820152602360248201527f4665654469737472696275746f723a2068616e646c652062707320746f6f20686044820152620d2ced60eb1b6064820152608401610dd4565b5f5f61242b86613a8c565b60408051808201825283815261ffff89811660208084019182526001600160a01b038e165f908152600a82528581209451855591516001909401805461ffff19169490931693909317909155848152600990915220919350915061248f8282614411565b5081876001600160a01b03167f7f648e14577bb175572cecb4fab1bbbcc25c3840ac1829b8f6207d742a28b55e83886040516124cc929190614173565b60405180910390a350505b5050505050565b335f90815260026020526040902054806125455760405162461bcd60e51b815260206004820152602260248201527f4665654469737472696275746f723a206e6f2063726561746f72207265776172604482015261647360f01b6064820152608401610dd4565b335f908152600460209081526040808320805460028452828520859055908490556003909252822080549192849261257e9084906141ac565b9091555050335f90815260056020526040812080548392906125a19084906141ac565b909155506125b1905033836135b4565b60405182815233907fd3a47810d5b7bf060f5a846b2900e17ee7ebfc6e5f09c2c5fc978b967375e3c49060200160405180910390a25050565b5f546001600160a01b031633146126135760405162461bcd60e51b8152600401610dd4906141fd565b601580546001600160a01b0319166001600160a01b0383169081179091556040517f6397f5b135542bb3f477cb346cfab5abdec1251d08dc8f8d4efb4ffe122ea0bf905f90a250565b6001600160a01b038281165f908152600160209081526040808320815180830190925254808516808352600160a01b90910460ff1615159282019290925291928392839283928716146126bb575f5f5f5f9450945094509450506128ab565b6001600160a01b0387165f90815260186020526040812054908082158015906126ee57506017546001600160a01b031615155b156128045760175460405163133f757160e31b8152600481018590525f918291829182916001600160a01b03909116906399fbab889060240161018060405180830381865afa158015612743573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612767919061428e565b9b509b50505050505050955095505050733bd359c1119da7da1d913d1c4d2b7c461115433a6001600160a01b0316846001600160a01b0316036127c157816001600160801b03169550806001600160801b031694506127ff565b733bd359c1119da7da1d913d1c4d2b7c4611154339196001600160a01b038416016127ff57806001600160801b03169550816001600160801b031694505b505050505b612710612813611388846144cc565b61281d91906144e3565b975061271061282e611388836144cc565b61283891906144e3565b6001600160a01b038b165f908152601960205260409020549097506127109061286490611388906144cc565b61286e91906144e3565b6001600160a01b038b165f908152601a60205260409020549096506127109061289a90611388906144cc565b6128a491906144e3565b9450505050505b92959194509250565b335f90815260076020526040902054806129105760405162461bcd60e51b815260206004820152601f60248201527f4665654469737472696275746f723a206e6f2068616e646c6520626f756e64006044820152606401610dd4565b335f9081526006602052604081208054612929906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612955906141c5565b80156129a05780601f10612977576101008083540402835291602001916129a0565b820191905f5260205f20905b81548152906001019060200180831161298357829003601f168201915b5050335f81815260076020908152604080832083905580518083018252838152938352600690915290209495506129dc93509150839050614411565b505f82815260086020526040902054336001600160a01b0390911603612a18575f82815260086020526040902080546001600160a01b03191690555b81336001600160a01b03167ff7129563dfed00fb57275470a393d0e2fd8ca5a4da3afa7a41872696b283a9a183604051612a529190613fb6565b60405180910390a35050565b5f5f612a6983613a8c565b505f908152600860205260409020546001600160a01b03169392505050565b335f9081526004602052604090205480612ae45760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a206e6f20563320726577617264730000006044820152606401610dd4565b335f90815260026020526040902054811115612b425760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a20696e76616c69642073746174650000006044820152606401610dd4565b335f9081526002602052604081208054839290612b60908490614232565b9091555050335f908152600460209081526040808320839055600390915281208054839290612b909084906141ac565b9091555050335f9081526005602052604081208054839290612bb39084906141ac565b90915550612bc3905033826135b4565b60405181815233907fd3a47810d5b7bf060f5a846b2900e17ee7ebfc6e5f09c2c5fc978b967375e3c49060200160405180910390a250565b6001600160a01b038181165f908152600160209081526040808320815180830183529054948516808252600160a01b90950460ff16151581840152848452600690925290912080546060929190612c51906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c7d906141c5565b8015612cc85780601f10612c9f57610100808354040283529160200191612cc8565b820191905f5260205f20905b815481529060010190602001808311612cab57829003601f168201915b5050505050915050915091565b6001600160a01b0381165f9081526002602090815260408083205460038352818420546004845282852054600590945291842054849391929190818411612d1c575f612d26565b612d268285614232565b9550808311612d35575f612d3f565b612d3f8184614232565b945050505050915091565b6001600160a01b0381165f908152600a6020908152604080832081518083018352815480825260019092015461ffff1681850152908452600990925282208054606093929190612d99906141c5565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc5906141c5565b8015612e105780601f10612de757610100808354040283529160200191612e10565b820191905f5260205f20905b815481529060010190602001808311612df357829003601f168201915b505050505092508060200151915050915091565b5f546001600160a01b03163314612e4d5760405162461bcd60e51b8152600401610dd4906141fd565b6001600160a01b038116612eb25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd4565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f8111612f5a5760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a206e6f2076616c75652073656e740000006044820152606401610dd4565b6001600160a01b038281165f9081526001602090815260408083208151808301835290549485168152600160a01b90940460ff16151584830152805160c0810182528381529182018390528101829052606081018290526080810182905260a0810191909152612710612fcf611388856144cc565b612fd991906144e3565b8152612710612fea6105dc856144cc565b612ff491906144e3565b60608201526127106130086103e8856144cc565b61301291906144e3565b608082018190526060820151825161302a91906141ac565b61303491906141ac565b60a08201525f6127106130496101f4866144cc565b61305391906144e3565b9050808260a00181815161306791906141ac565b90525080156130b2576010546001600160a01b03161561309c57601054613097906001600160a01b0316826135b4565b6130b2565b80826080018181516130ae91906141ac565b9052505b6127106130c16101f4866144cc565b6130cb91906144e3565b9050808260a0018181516130df91906141ac565b905250801561312a576011546001600160a01b0316156131145760115461310f906001600160a01b0316826135b4565b61312a565b808260800181815161312691906141ac565b9052505b6127106131396101f4866144cc565b61314391906144e3565b9050808260a00181815161315791906141ac565b90525080156131a2576012546001600160a01b03161561318c57601254613187906001600160a01b0316826135b4565b6131a2565b808260800181815161319e91906141ac565b9052505b6127106131b16101f4866144cc565b6131bb91906144e3565b9050808260a0018181516131cf91906141ac565b905250801561321a576013546001600160a01b031615613204576013546131ff906001600160a01b0316826135b4565b61321a565b808260800181815161321691906141ac565b9052505b6127106132296101f4866144cc565b61323391906144e3565b9050808260a00181815161324791906141ac565b9052508015613292576014546001600160a01b03161561327c57601454613277906001600160a01b0316826135b4565b613292565b808260800181815161328e91906141ac565b9052505b5f8260a00151856132a39190614232565b905080836080018181516132b791906141ac565b9052508251158015906132d3575083516001600160a01b031615155b156133b2576132e586845f0151613ccb565b604085015260208401819052156133ad5760208084015185516001600160a01b03165f9081526002909252604082208054919290916133259084906141ac565b909155505060208084015185516001600160a01b03165f9081526004909252604082208054919290916133599084906141ac565b90915550508351602084810151855160408051928352928201526001600160a01b038981169316917f0d4cef82a4f7c87c7bf598878d7b68f98bb9a0e98b5fec2b8e96f444fb40f37f910160405180910390a35b6133cc565b82516080840180516133c59083906141ac565b9052505f83525b6060830151156134ee576015546001600160a01b03161561349d57601554606084015160408051600481526024810182526020810180516001600160e01b031663014d6aed60e41b17905290515f936001600160a01b0316929161342f91614519565b5f6040518083038185875af1925050503d805f8114613469576040519150601f19603f3d011682016040523d82523d5f602084013e61346e565b606091505b50509050806134975783606001518460800181815161348d91906141ac565b9052505f60608501525b506134ee565b600f546001600160a01b0316156134ce57600f5460608401516134c9916001600160a01b0316906135b4565b6134ee565b8260600151836080018181516134e491906141ac565b9052505f60608401525b60808301511561353957600e545f906001600160a01b031661351a575f546001600160a01b0316613527565b600e546001600160a01b03165b90506135378185608001516135b4565b505b82516020808501516040808701516060808901516080808b015185518e8152978801989098529386019490945284015282015260a08101919091526001600160a01b038716907fe205594824e0b766055113357eb9ca852cce628f1cd9cd5672527343a4e469079060c00160405180910390a2505050505050565b805f036135bf575050565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613608576040519150601f19603f3d011682016040523d82523d5f602084013e61360d565b606091505b505090508061366d5760405162461bcd60e51b815260206004820152602660248201527f4665654469737472696275746f723a206e6174697665207472616e736665722060448201526519985a5b195960d21b6064820152608401610dd4565b505050565b5f81116136c15760405162461bcd60e51b815260206004820152601d60248201527f4665654469737472696275746f723a206e6f2076616c75652073656e740000006044820152606401610dd4565b6001600160a01b038281165f9081526001602090815260408083208151808301835290549485168152600160a01b90940460ff16151584830152805160c0810182528381529182018390528101829052606081018290526080810182905260a0810191909152612710613736611388856144cc565b61374091906144e3565b81526127106137516105dc856144cc565b61375b91906144e3565b606082015261271061376f6103e8856144cc565b61377991906144e3565b608082018190526060820151825161379191906141ac565b61379b91906141ac565b60a08201525f6127106137b06101f4866144cc565b6137ba91906144e3565b9050808260a0018181516137ce91906141ac565b9052508015613819576010546001600160a01b031615613803576010546137fe906001600160a01b0316826135b4565b613819565b808260800181815161381591906141ac565b9052505b6127106138286101f4866144cc565b61383291906144e3565b9050808260a00181815161384691906141ac565b9052508015613891576011546001600160a01b03161561387b57601154613876906001600160a01b0316826135b4565b613891565b808260800181815161388d91906141ac565b9052505b6127106138a06101f4866144cc565b6138aa91906144e3565b9050808260a0018181516138be91906141ac565b9052508015613909576012546001600160a01b0316156138f3576012546138ee906001600160a01b0316826135b4565b613909565b808260800181815161390591906141ac565b9052505b6127106139186101f4866144cc565b61392291906144e3565b9050808260a00181815161393691906141ac565b9052508015613981576013546001600160a01b03161561396b57601354613966906001600160a01b0316826135b4565b613981565b808260800181815161397d91906141ac565b9052505b6127106139906101f4866144cc565b61399a91906144e3565b9050808260a0018181516139ae91906141ac565b90525080156139f9576014546001600160a01b0316156139e3576014546139de906001600160a01b0316826135b4565b6139f9565b80826080018181516139f591906141ac565b9052505b5f8260a0015185613a0a9190614232565b90508083608001818151613a1e91906141ac565b905250825115801590613a3a575083516001600160a01b031615155b156133b257613a4c86845f0151613ccb565b604085015260208401819052156133ad5760208084015185516001600160a01b03165f9081526002909252604082208054919290916133599084906141ac565b80515f90606090839080613ae25760405162461bcd60e51b815260206004820152601c60248201527f4665654469737472696275746f723a20656d7074792068616e646c65000000006044820152606401610dd4565b81515f90600160fe1b9084908390613afc57613afc614524565b01602001516001600160f81b03191603613b645760018211613b605760405162461bcd60e51b815260206004820152601c60248201527f4665654469737472696275746f723a20656d7074792068616e646c65000000006044820152606401610dd4565b5060015b5f613b6f8284614232565b67ffffffffffffffff811115613b8757613b87613fc8565b6040519080825280601f01601f191660200182016040528015613bb1576020820181803683370190505b509050815b83811015613c95575f858281518110613bd157613bd1614524565b016020015160f81c905060418110801590613bf05750605a8160ff1611155b15613c3957613c00816020614538565b60f81b83613c0e8685614232565b81518110613c1e57613c1e614524565b60200101906001600160f81b03191690815f1a905350613c8c565b858281518110613c4b57613c4b614524565b01602001516001600160f81b03191683613c658685614232565b81518110613c7557613c75614524565b60200101906001600160f81b03191690815f1a9053505b50600101613bb6565b5080945080604051602001613caa9190614551565b60405160208183030381529060405280519060200120955050505050915091565b6001600160a01b0382165f908152600a602090815260408083208151808301909252805480835260019091015461ffff1692820192909252839291831580613d11575080155b80613d225750602082015161ffff16155b15613d3257505f9150613df09050565b602082015161271090613d499061ffff16876144cc565b613d5391906144e3565b9250825f03613d6757505f9150613df09050565b613d718386614232565b6001600160a01b0387165f908152600b60209081526040808320858452909152812080549296508592909190613da89084906141ac565b909155505060405183815281906001600160a01b038816907f0250a3283d2094fdc6db498e1475e74e424a6eceda9e99f2ec15be2c4d3883b59060200160405180910390a350505b9250929050565b6001600160a01b0381168114611601575f5ffd5b5f60208284031215613e1b575f5ffd5b8135613e2681613df7565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038816815260e0602082018190525f90613e7e90830189613e2d565b8281036040840152613e908189613e2d565b6001600160a01b03979097166060840152505061ffff93909316608084015260a083019190915260c0909101529392505050565b5f5f60408385031215613ed5575f5ffd5b8235613ee081613df7565b91506020830135613ef081613df7565b809150509250929050565b5f5f5f5f5f5f5f60e0888a031215613f11575f5ffd5b8735613f1c81613df7565b96506020880135613f2c81613df7565b95506040880135613f3c81613df7565b94506060880135613f4c81613df7565b93506080880135613f5c81613df7565b925060a0880135613f6c81613df7565b915060c0880135613f7c81613df7565b8091505092959891949750929550565b5f5f60408385031215613f9d575f5ffd5b8235613fa881613df7565b946020939093013593505050565b602081525f613e266020830184613e2d565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613feb575f5ffd5b813567ffffffffffffffff81111561400557614005613fc8565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561403457614034613fc8565b60405281815283820160200185101561404b575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215614077575f5ffd5b813567ffffffffffffffff81111561408d575f5ffd5b61409984828501613fdc565b949350505050565b5f602082840312156140b1575f5ffd5b5035919050565b608081525f6140ca6080830187613e2d565b61ffff959095166020830152506040810192909252606090910152919050565b5f5f5f606084860312156140fc575f5ffd5b833561410781613df7565b9250602084013567ffffffffffffffff811115614122575f5ffd5b61412e86828701613fdc565b925050604084013561ffff81168114614145575f5ffd5b809150509250925092565b6001600160a01b03831681526040602082018190525f9061409990830184613e2d565b604081525f6141856040830185613e2d565b905061ffff831660208301529392505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156141bf576141bf614198565b92915050565b600181811c908216806141d957607f821691505b6020821081036141f757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b818103818111156141bf576141bf614198565b805161425081613df7565b919050565b805162ffffff81168114614250575f5ffd5b8051600281900b8114614250575f5ffd5b80516001600160801b0381168114614250575f5ffd5b5f5f5f5f5f5f5f5f5f5f5f5f6101808d8f0312156142aa575f5ffd5b8c516bffffffffffffffffffffffff811681146142c5575f5ffd5b9b506142d360208e01614245565b9a506142e160408e01614245565b99506142ef60608e01614245565b98506142fd60808e01614255565b975061430b60a08e01614267565b965061431960c08e01614267565b955061432760e08e01614278565b6101008e01516101208f0151919650945092506143476101408e01614278565b91506143566101608e01614278565b90509295989b509295989b509295989b565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f5f604083850312156143bc575f5ffd5b505080516020909101519092909150565b601f82111561366d57805f5260205f20601f840160051c810160208510156143f25750805b601f840160051c820191505b818110156124d7575f81556001016143fe565b815167ffffffffffffffff81111561442b5761442b613fc8565b61443f8161443984546141c5565b846143cd565b6020601f821160018114614471575f831561445a5750848201515b5f19600385901b1c1916600184901b1784556124d7565b5f84815260208120601f198516915b828110156144a05787850151825560209485019460019092019101614480565b50848210156144bd57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b80820281158282048414176141bf576141bf614198565b5f826144fd57634e487b7160e01b5f52601260045260245ffd5b500490565b5f81518060208401855e5f93019283525090919050565b5f613e268284614502565b634e487b7160e01b5f52603260045260245ffd5b60ff81811683821601908111156141bf576141bf614198565b673a3bb4ba3a32b91d60c11b81525f613e26600883018461450256fea2646970667358221220ab549d56225fdd57c073c00152121c6866fd080d9fc8efd934543f86f9cb309764736f6c634300081e0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000300dba24233b87ec0bcfaebe89d586619f02cacf0000000000000000000000007197e214c0b767cfb76fb734ab638e2c192f4e53

-----Decoded View---------------
Arg [0] : _platformWallet (address): 0x300Dba24233b87Ec0BcfAeBe89d586619F02caCf
Arg [1] : _positionManager (address): 0x7197E214c0b767cFB76Fb734ab638E2c192F4E53

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000300dba24233b87ec0bcfaebe89d586619f02cacf
Arg [1] : 0000000000000000000000007197e214c0b767cfb76fb734ab638e2c192f4e53


Deployed Bytecode Sourcemap

2390:45209:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7468:28;;;;;;;;;;-1:-1:-1;7468:28:0;;;;-1:-1:-1;;;;;7468:28:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;7468:28:0;;;;;;;;7571:27;;;;;;;;;;-1:-1:-1;7571:27:0;;;;-1:-1:-1;;;;;7571:27:0;;;2809:46;;;;;;;;;;;;2851:4;2809:46;;;;;396:6:1;384:19;;;366:38;;354:2;339:18;2809:46:0;222:188:1;4871:49:0;;;;;;;;;;-1:-1:-1;4871:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;949:25:1;;;937:2;922:18;4871:49:0;803:177:1;3402:46:0;;;;;;;;;;;;3444:4;3402:46;;46286:973;;;;;;;;;;-1:-1:-1;46286:973:0;;;;;:::i;:::-;;:::i;34823:502::-;;;;;;;;;;-1:-1:-1;34823:502:0;;;;;:::i;:::-;;:::i;43920:294::-;;;;;;;;;;-1:-1:-1;43920:294:0;;;;;:::i;:::-;-1:-1:-1;;;;;44131:27:0;44038:19;44131:27;;;:18;:27;;;;;;;;;44181:16;:25;;;;;;;44131:27;;43920:294;;;;;1159:25:1;;;1215:2;1200:18;;1193:34;;;;1132:18;43920:294:0;985:248:1;4064:53:0;;;;;;;;;;;;4112:5;4064:53;;37219:916;;;;;;;;;;-1:-1:-1;37219:916:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;3027:45::-;;;;;;;;;;;;3069:3;3027:45;;14116:158;;;;;;;;;;-1:-1:-1;14116:158:0;;;;;:::i;:::-;;:::i;7145:26::-;;;;;;;;;;-1:-1:-1;7145:26:0;;;;-1:-1:-1;;;;;7145:26:0;;;16623:164;;;;;;;;;;-1:-1:-1;16623:164:0;;;;;:::i;:::-;;:::i;14516:336::-;;;;;;;;;;-1:-1:-1;14516:336:0;;;;;:::i;:::-;;:::i;15077:913::-;;;;;;;;;;-1:-1:-1;15077:913:0;;;;;:::i;:::-;;:::i;5710:53::-;;;;;;;;;;-1:-1:-1;5710:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;31867:118;;;;;;:::i;:::-;;:::i;3329:46::-;;;;;;;;;;;;3371:4;3329:46;;16111:122;;;;;;;;;;-1:-1:-1;16111:122:0;;;;;:::i;:::-;;:::i;7605:27::-;;;;;;;;;;-1:-1:-1;7605:27:0;;;;-1:-1:-1;;;;;7605:27:0;;;8545:53;;;;;;;;;;-1:-1:-1;8545:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;38492:565;;;;;;;;;;-1:-1:-1;38492:565:0;;;;;:::i;:::-;;:::i;33096:642::-;;;;;;;;;;;;;:::i;39222:1334::-;;;;;;;;;;-1:-1:-1;39222:1334:0;;;;;:::i;:::-;;:::i;5063:53::-;;;;;;;;;;-1:-1:-1;5063:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;44389:1732;;;;;;;;;;-1:-1:-1;44389:1732:0;;;;;:::i;:::-;;:::i;8172:30::-;;;;;;;;;;-1:-1:-1;8172:30:0;;;;-1:-1:-1;;;;;8172:30:0;;;5593:49;;;;;;;;;;-1:-1:-1;5593:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16988:899::-;;;;;;;;;;-1:-1:-1;16988:899:0;;;;;:::i;:::-;;:::i;5966:45::-;;;;;;;;;;-1:-1:-1;5966:45:0;;;;;:::i;:::-;;:::i;8276:73::-;;;;;;;;;;;;8307:42;8276:73;;36071:651;;;;;;;;;;-1:-1:-1;36071:651:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;19310:918::-;;;;;;;;;;-1:-1:-1;19310:918:0;;;;;:::i;:::-;;:::i;1258:20::-;;;;;;;;;;-1:-1:-1;1258:20:0;;;;-1:-1:-1;;;;;1258:20:0;;;32365:656;;;;;;;;;;;;;:::i;16301:182::-;;;;;;;;;;-1:-1:-1;16301:182:0;;;;;:::i;:::-;;:::i;4664:51::-;;;;;;;;;;-1:-1:-1;4664:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;5257;;;;;;;;;;-1:-1:-1;5257:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;40943:1993;;;;;;;;;;-1:-1:-1;40943:1993:0;;;;;:::i;:::-;;:::i;:::-;;;;7298:25:1;;;7354:2;7339:18;;7332:34;;;;7382:18;;;7375:34;7440:2;7425:18;;7418:34;7285:3;7270:19;40943:1993:0;7067:391:1;8401:45:0;;;;;;;;;;-1:-1:-1;8401:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;17965:507;;;;;;;;;;;;;:::i;8638:55::-;;;;;;;;;;-1:-1:-1;8638:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;18554:183;;;;;;;;;;-1:-1:-1;18554:183:0;;;;;:::i;:::-;;:::i;33818:821::-;;;;;;;;;;;;;:::i;7537:27::-;;;;;;;;;;-1:-1:-1;7537:27:0;;;;-1:-1:-1;;;;;7537:27:0;;;6722:68;;;;;;;;;;-1:-1:-1;6722:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36807:304;;;;;;;;;;-1:-1:-1;36807:304:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;6424:55::-;;;;;;;;;;-1:-1:-1;6424:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;8329:25:1;;;8402:6;8390:19;;;8385:2;8370:18;;8363:47;8302:18;6424:55:0;8157:259:1;43126:642:0;;;;;;;;;;-1:-1:-1;43126:642:0;;;;;:::i;:::-;;:::i;7639:27::-;;;;;;;;;;-1:-1:-1;7639:27:0;;;;-1:-1:-1;;;;;7639:27:0;;;8795:53;;;;;;;;;;-1:-1:-1;8795:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;35616:294;;;;;;;;;;-1:-1:-1;35616:294:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;7758:30::-;;;;;;;;;;-1:-1:-1;7758:30:0;;;;-1:-1:-1;;;;;7758:30:0;;;40642:220;;;;;;;;;;-1:-1:-1;40642:220:0;;;;;:::i;:::-;-1:-1:-1;;;;;40799:25:0;40735:17;40799:25;;;:18;:25;;;;;;;;;40826:20;:27;;;;;;;40799:25;;40642:220;7883:27;;;;;;;;;;-1:-1:-1;7883:27:0;;;;-1:-1:-1;;;;;7883:27:0;;;1622:236;;;;;;;;;;-1:-1:-1;1622:236:0;;;;;:::i;:::-;;:::i;5846:53::-;;;;;;;;;;-1:-1:-1;5846:53:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;5846:53:0;;;6569:70;;;;;;;;;;-1:-1:-1;6569:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;7432:29;;;;;;;;;;-1:-1:-1;7432:29:0;;;;-1:-1:-1;;;;;7432:29:0;;;4443:50;;;;;;;;;;-1:-1:-1;4443:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;4443:50:0;;;-1:-1:-1;;;4443:50:0;;;;;;;;;;-1:-1:-1;;;;;8914:32:1;;;8896:51;;8990:14;;8983:22;8978:2;8963:18;;8956:50;8869:18;4443:50:0;8728:284:1;7503:27:0;;;;;;;;;;-1:-1:-1;7503:27:0;;;;-1:-1:-1;;;;;7503:27:0;;;46286:973;-1:-1:-1;;;;;46375:25:0;;46355:17;46375:25;;;:18;:25;;;;;;;;;46433:20;:27;;;;;;;46489:13;;;;:32;;;46520:1;46506:11;:15;46489:32;46481:77;;;;-1:-1:-1;;;46481:77:0;;9219:2:1;46481:77:0;;;9201:21:1;;;9238:18;;;9231:30;9297:34;9277:18;;;9270:62;9349:18;;46481:77:0;;;;;;;;;-1:-1:-1;;;;;46604:25:0;;46632:1;46604:25;;;:18;:25;;;;;;;;:29;;;46644:20;:27;;;;;:31;46755:13;;46751:82;;46785:36;46804:5;46811:9;46785:18;:36::i;:::-;47203:48;;;1159:25:1;;;1215:2;1200:18;;1193:34;;;-1:-1:-1;;;;;47203:48:0;;;;;1132:18:1;47203:48:0;;;;;;;;46344:915;;46286:973;:::o;34823:502::-;34918:10;34886;34899:30;;;:18;:30;;;;;;;34940:60;;;;-1:-1:-1;;;34940:60:0;;9580:2:1;34940:60:0;;;9562:21:1;9619:2;9599:18;;;9592:30;9658:33;9638:18;;;9631:61;9709:18;;34940:60:0;9378:355:1;34940:60:0;-1:-1:-1;;;;;35030:22:0;;35013:14;35030:22;;;:15;:22;;;;;;;;:26;;;;;;;;;35075:10;35067:56;;;;-1:-1:-1;;;35067:56:0;;9940:2:1;35067:56:0;;;9922:21:1;9979:2;9959:18;;;9952:30;10018:34;9998:18;;;9991:62;-1:-1:-1;;;10069:18:1;;;10062:31;10110:19;;35067:56:0;9738:397:1;35067:56:0;-1:-1:-1;;;;;35136:22:0;;35165:1;35136:22;;;:15;:22;;;;;;;;:26;;;;;;;;:30;;;35177:20;;;:13;:20;;;;;:24;;;;;;;;:34;;35205:6;;35165:1;35177:34;;35205:6;;35177:34;:::i;:::-;;;;-1:-1:-1;35224:31:0;;-1:-1:-1;35236:10:0;35248:6;35224:11;:31::i;:::-;35298:10;-1:-1:-1;;;;;35273:44:0;35294:2;35287:5;-1:-1:-1;;;;;35273:44:0;;35310:6;35273:44;;;;949:25:1;;937:2;922:18;;803:177;35273:44:0;;;;;;;;34875:450;;34823:502;:::o;37219:916::-;-1:-1:-1;;;;;37647:18:0;;;37324:21;37647:18;;;:11;:18;;;;;;;;37622:43;;;;;;;;;;;;;;;-1:-1:-1;;;37622:43:0;;;;;;;;;;;37730:30;;;:15;:30;;;;;37714:46;;37360:27;;;;37324:21;;;;;;;;37622:43;;37714:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;37797:23:0;;37773:21;37797:23;;;:16;:23;;;;;;;;37773:47;;;;;;;;;;;;;;;;;;;;;;;37885:15;;;:11;:15;;;;;37870:30;;37714:46;;-1:-1:-1;37773:47:0;;;;-1:-1:-1;37885:15:0;-1:-1:-1;37870:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37932:18;:22;37951:2;37932:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37932:22:0;37911:43;;37982:2;:15;;;37965:32;;38035:16;:31;38052:13;-1:-1:-1;;;;;38035:31:0;-1:-1:-1;;;;;38035:31:0;;;;;;;;;;;;;38010:56;;38101:15;:22;38117:5;-1:-1:-1;;;;;38101:22:0;-1:-1:-1;;;;;38101:22:0;;;;;;;;;;;;:26;38124:2;38101:26;;;;;;;;;;;;38077:50;;37611:524;;;37219:916;;;;;;;;;:::o;14116:158::-;1552:5;;-1:-1:-1;;;;;1552:5:0;1538:10;:19;1530:64;;;;-1:-1:-1;;;1530:64:0;;;;;;;:::i;:::-;14192:11:::1;:26:::0;;-1:-1:-1;;;;;;14192:26:0::1;-1:-1:-1::0;;;;;14192:26:0;::::1;::::0;;::::1;::::0;;;14234:32:::1;::::0;::::1;::::0;-1:-1:-1;;14234:32:0::1;14116:158:::0;:::o;16623:164::-;1552:5;;-1:-1:-1;;;;;1552:5:0;1538:10;:19;1530:64;;;;-1:-1:-1;;;1530:64:0;;;;;;;:::i;:::-;16701:12:::1;:28:::0;;-1:-1:-1;;;;;;16701:28:0::1;-1:-1:-1::0;;;;;16701:28:0;::::1;::::0;;::::1;::::0;;;16745:34:::1;::::0;::::1;::::0;-1:-1:-1;;16745:34:0::1;16623:164:::0;:::o;14516:336::-;13264:5;;-1:-1:-1;;;;;13264:5:0;13250:10;:19;;:48;;-1:-1:-1;13287:11:0;;-1:-1:-1;;;;;13287:11:0;13273:10;:25;13250:48;13228:129;;;;-1:-1:-1;;;13228:129:0;;11350:2:1;13228:129:0;;;11332:21:1;11389:2;11369:18;;;11362:30;11428:33;11408:18;;;11401:61;11479:18;;13228:129:0;11148:355:1;13228:129:0;-1:-1:-1;;;;;14618:19:0;::::1;14610:69;;;::::0;-1:-1:-1;;;14610:69:0;;11710:2:1;14610:69:0::1;::::0;::::1;11692:21:1::0;11749:2;11729:18;;;11722:30;11788:34;11768:18;;;11761:62;-1:-1:-1;;;11839:18:1;;;11832:35;11884:19;;14610:69:0::1;11508:401:1::0;14610:69:0::1;14713:82;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;14713:82:0;;::::1;::::0;;;14779:4:::1;14713:82;::::0;;::::1;::::0;;;14692:18;;::::1;-1:-1:-1::0;14692:18:0;;;;;;;;;;:103;;;;;;::::1;;-1:-1:-1::0;;;14692:103:0::1;-1:-1:-1::0;;;;;;14692:103:0;;;;::::1;::::0;;;;;;;::::1;::::0;;;14813:31;;14692:18;;14813:31:::1;::::0;::::1;14516:336:::0;;:::o;15077:913::-;13264:5;;-1:-1:-1;;;;;13264:5:0;13250:10;:19;;:48;;-1:-1:-1;13287:11:0;;-1:-1:-1;;;;;13287:11:0;13273:10;:25;13250:48;13228:129;;;;-1:-1:-1;;;13228:129:0;;11350:2:1;13228:129:0;;;11332:21:1;11389:2;11369:18;;;11362:30;11428:33;11408:18;;;11401:61;11479:18;;13228:129:0;11148:355:1;13228:129:0;-1:-1:-1;;;;;15379:29:0;::::1;15371:81;;;::::0;-1:-1:-1;;;15371:81:0;;12116:2:1;15371:81:0::1;::::0;::::1;12098:21:1::0;12155:2;12135:18;;;12128:30;12194:34;12174:18;;;12167:62;-1:-1:-1;;;12245:18:1;;;12238:37;12292:19;;15371:81:0::1;11914:403:1::0;15371:81:0::1;15465:14;:32:::0;;-1:-1:-1;;;;;;15465:32:0;;::::1;-1:-1:-1::0;;;;;15465:32:0;;::::1;::::0;;::::1;::::0;;;15508:13:::1;:31:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;15550:12:::1;:30:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;15591:12:::1;:30:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;15632:12:::1;:30:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;15673:12:::1;:30:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;15714:12:::1;:30:::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;15762:220:::1;::::0;;12553:51:1;;;12635:2;12620:18;;12613:60;;;;12689:18;;12682:60;;;;12773:2;12758:18;;12751:60;;;;15508:31:0;15762:220:::1;::::0;12540:3:1;12525:19;15762:220:0::1;;;;;;;15077:913:::0;;;;;;;:::o;31867:118::-;31933:44;31960:5;31967:9;31933:26;:44::i;:::-;31867:118;:::o;16111:122::-;1552:5;;-1:-1:-1;;;;;1552:5:0;1538:10;:19;1530:64;;;;-1:-1:-1;;;1530:64:0;;;;;;;:::i;:::-;16191:15:::1;:34:::0;;-1:-1:-1;;;;;;16191:34:0::1;-1:-1:-1::0;;;;;16191:34:0;;;::::1;::::0;;;::::1;::::0;;16111:122::o;38492:565::-;38597:12;;-1:-1:-1;;;;;38597:12:0;38583:10;:26;38575:71;;;;-1:-1:-1;;;38575:71:0;;13024:2:1;38575:71:0;;;13006:21:1;;;13043:18;;;13036:30;13102:34;13082:18;;;13075:62;13154:18;;38575:71:0;12822:356:1;38575:71:0;38665:12;;-1:-1:-1;;;;;38665:12:0;38657:75;;;;-1:-1:-1;;;38657:75:0;;13385:2:1;38657:75:0;;;13367:21:1;13424:2;13404:18;;;13397:30;13463:34;13443:18;;;13436:62;-1:-1:-1;;;13514:18:1;;;13507:34;13558:19;;38657:75:0;13183:400:1;38657:75:0;-1:-1:-1;;;;;38751:17:0;;;;;;:10;:17;;;;;;:22;38743:73;;;;-1:-1:-1;;;38743:73:0;;13790:2:1;38743:73:0;;;13772:21:1;13829:2;13809:18;;;13802:30;13868:34;13848:18;;;13841:62;-1:-1:-1;;;13919:18:1;;;13912:36;13965:19;;38743:73:0;13588:402:1;38743:73:0;-1:-1:-1;;;;;38835:19:0;;38827:61;;;;-1:-1:-1;;;38827:61:0;;14197:2:1;38827:61:0;;;14179:21:1;14236:2;14216:18;;;14209:30;14275:31;14255:18;;;14248:59;14324:18;;38827:61:0;13995:353:1;38827:61:0;38917:1;38907:7;:11;38899:55;;;;-1:-1:-1;;;38899:55:0;;14555:2:1;38899:55:0;;;14537:21:1;14594:2;14574:18;;;14567:30;14633:33;14613:18;;;14606:61;14684:18;;38899:55:0;14353:355:1;38899:55:0;-1:-1:-1;;;;;38975:17:0;;;;;;:10;:17;;;;;;:27;;;39018:31;38995:7;;38975:17;39018:31;;;38492:565;;:::o;33096:642::-;33187:10;33145:22;33170:28;;;:16;:28;;;;;;;;;33231:18;:30;;;;;;33170:28;;33294;;;:63;;33356:1;33294:63;;;33325:28;33342:11;33325:14;:28;:::i;:::-;33272:85;;33400:1;33386:11;:15;33378:60;;;;-1:-1:-1;;;33378:60:0;;15048:2:1;33378:60:0;;;15030:21:1;;;15067:18;;;15060:30;15126:34;15106:18;;;15099:62;15178:18;;33378:60:0;14846:356:1;33378:60:0;33496:10;33479:28;;;;:16;:28;;;;;;;;:42;;;33559:14;:26;;;;;:41;;33589:11;;33479:28;33559:41;;33589:11;;33559:41;:::i;:::-;;;;-1:-1:-1;33637:36:0;;-1:-1:-1;33649:10:0;33661:11;33637;:36::i;:::-;33691:39;;949:25:1;;;33706:10:0;;33691:39;;937:2:1;922:18;33691:39:0;803:177:1;39222:1334:0;-1:-1:-1;;;;;39389:17:0;;39315;39389;;;:10;:17;;;;;;39315;;39421:12;;;:45;;-1:-1:-1;39437:15:0;;-1:-1:-1;;;;;39437:15:0;:29;39421:45;39417:64;;;-1:-1:-1;39476:1:0;;;;-1:-1:-1;39222:1334:0;-1:-1:-1;;39222:1334:0:o;39417:64::-;40001:15;;39973:63;;-1:-1:-1;;;39973:63:0;;;;;949:25:1;;;39613:14:0;;;;;;;;-1:-1:-1;;;;;40001:15:0;;;;39973:54;;922:18:1;;39973:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39532:504;;;;;;;;;;;;;;;;8307:42;-1:-1:-1;;;;;40187:14:0;:6;-1:-1:-1;;;;;40187:14:0;;40183:366;;40238:11;-1:-1:-1;;;;;40230:20:0;40218:32;;40287:11;-1:-1:-1;;;;;40279:20:0;40265:34;;40183:366;;;-1:-1:-1;;;;;;;40321:14:0;;;40317:232;;40372:11;-1:-1:-1;;;;;40364:20:0;40352:32;;40421:11;-1:-1:-1;;;;;40413:20:0;40399:34;;40317:232;;;-1:-1:-1;40532:1:0;;;;-1:-1:-1;39222:1334:0;-1:-1:-1;;;;;;39222:1334:0:o;40317:232::-;39360:1196;;;;;39222:1334;;;:::o;44389:1732::-;-1:-1:-1;;;;;44465:17:0;;44447:15;44465:17;;;:10;:17;;;;;;44501:11;44493:56;;;;-1:-1:-1;;;44493:56:0;;17383:2:1;44493:56:0;;;17365:21:1;;;17402:18;;;17395:30;17461:34;17441:18;;;17434:62;17513:18;;44493:56:0;17181:356:1;44493:56:0;44568:15;;-1:-1:-1;;;;;44568:15:0;44560:81;;;;-1:-1:-1;;;44560:81:0;;17744:2:1;44560:81:0;;;17726:21:1;17783:2;17763:18;;;17756:30;17822:34;17802:18;;;17795:62;-1:-1:-1;;;17873:18:1;;;17866:37;17920:19;;44560:81:0;17542:403:1;44560:81:0;44809:15;;44781:63;;-1:-1:-1;;;44781:63:0;;;;;949:25:1;;;44717:14:0;;;;-1:-1:-1;;;;;44809:15:0;;;;44781:54;;922:18:1;;44781:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;44972:15:0;;45011:259;;;;;;;;;;;45126:4;45011:259;;;;-1:-1:-1;;;;;45011:259:0;;;;;;;;;;44944:337;;-1:-1:-1;;;44944:337:0;;44712:132;;-1:-1:-1;44712:132:0;;-1:-1:-1;44908:15:0;;-1:-1:-1;44908:15:0;;-1:-1:-1;;;;;;44972:15:0;;44944:52;;:337;;-1:-1:-1;45011:259:0;-1:-1:-1;44944:337:0;;;-1:-1:-1;44944:337:0;;-1:-1:-1;;;44944:337:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44907:374;;-1:-1:-1;44907:374:0;-1:-1:-1;45357:17:0;;-1:-1:-1;;;;;;;45429:14:0;;;45425:285;;-1:-1:-1;45472:7:0;;-1:-1:-1;45508:7:0;45425:285;;;-1:-1:-1;;;;;;;45537:14:0;;;45533:177;;-1:-1:-1;45580:7:0;;-1:-1:-1;45616:7:0;45533:177;;;45656:42;;-1:-1:-1;;;45656:42:0;;19045:2:1;45656:42:0;;;19027:21:1;;;19064:18;;;19057:30;19123:34;19103:18;;;19096:62;19175:18;;45656:42:0;18843:356:1;45533:177:0;45775:13;;45771:77;;45805:31;;-1:-1:-1;;;45805:31:0;;;;;949:25:1;;;8307:42:0;;45805:20;;922:18:1;;45805:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45771:77;-1:-1:-1;;;;;45896:25:0;;;;;;:18;:25;;;;;:38;;45925:9;;45896:25;:38;;45925:9;;45896:38;:::i;:::-;;;;-1:-1:-1;;;;;;;45945:27:0;;;;;;:20;:27;;;;;:42;;45976:11;;45945:27;:42;;45976:11;;45945:42;:::i;:::-;;;;-1:-1:-1;;;;;;;45998:25:0;;;;;;:18;:25;;;;;;;;;46026:15;45998:43;;46067:46;;1159:25:1;;;1200:18;;;1193:34;;;46067:46:0;;1132:18:1;46067:46:0;;;;;;;44436:1685;;;;;;;44389:1732;:::o;5593:49::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16988:899::-;17058:10;17070:18;17092:25;17110:6;17092:17;:25::i;:::-;17130:20;17153:22;;;:18;:22;;;;;;17057:60;;-1:-1:-1;17057:60:0;-1:-1:-1;;;;;;17153:22:0;17208:26;;;:56;;-1:-1:-1;;;;;;17238:26:0;;17254:10;17238:26;17208:56;17186:142;;;;-1:-1:-1;;;17186:142:0;;19406:2:1;17186:142:0;;;19388:21:1;19445:2;19425:18;;;19418:30;19484:34;19464:18;;;19457:62;-1:-1:-1;;;19535:18:1;;;19528:34;19579:19;;17186:142:0;19204:400:1;17186:142:0;17436:10;17399:15;17417:30;;;:18;:30;;;;;;17462:21;;;;;:38;;;17498:2;17487:7;:13;;17462:38;17458:192;;;17521:27;;;;:18;:27;;;;;;17552:10;-1:-1:-1;;;;;17521:27:0;;;:41;17517:122;;17621:1;17583:27;;;:18;:27;;;;;:40;;-1:-1:-1;;;;;;17583:40:0;;;17517:122;17678:10;17662:27;;;;:15;:27;;;;;:34;17692:4;17662:27;:34;:::i;:::-;-1:-1:-1;17726:10:0;17707:30;;;;:18;:30;;;;;;;;:35;;;17753:22;;;:18;:22;;;;;:35;;-1:-1:-1;;;;;;17753:35:0;;;;;;;17799:11;:15;;;:22;17817:4;17799:15;:22;:::i;:::-;;17870:2;17858:10;-1:-1:-1;;;;;17839:40:0;;17874:4;17839:40;;;;;;:::i;:::-;;;;;;;;17046:841;;;;16988:899;:::o;5966:45::-;;;;;;;;;;;;;;;;:::i;36071:651::-;-1:-1:-1;;;;;36356:26:0;;;36234:19;36356:26;;;:18;:26;;;;;;;;;36417:23;;;;;:16;:23;;;;;36393:47;;;;;;;;;;;;;;;;;;;;;;36460:15;;;:11;:15;;;;;36451:24;;36199:20;;36234:19;;;;36356:26;;36393:47;;36460:15;36451:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36498:2;:13;;;36492:2;:19;36488:131;;36543:2;:15;;;36528:30;;36488:131;;;36606:1;36591:16;;36488:131;-1:-1:-1;;;;;;36643:22:0;;;;;;;:15;:22;;;;;;;;:26;;;;;;;;;36690:20;;;:13;:20;;;;;:24;;;;;;;;;;;36071:651;;;;36643:26;-1:-1:-1;;;36071:651:0:o;19310:918::-;-1:-1:-1;;;;;13469:18:0;;;13444:22;13469:18;;;:11;:18;;;;;;;;;13444:43;;;;;;;;;;;;;;-1:-1:-1;;;13444:43:0;;;;;;;;;;;;;13469:18;;13498:59;;;;-1:-1:-1;;;13498:59:0;;21935:2:1;13498:59:0;;;21917:21:1;21974:2;21954:18;;;21947:30;22013:34;21993:18;;;21986:62;-1:-1:-1;;;22064:18:1;;;22057:34;22108:19;;13498:59:0;21733:400:1;13498:59:0;13604:11;;-1:-1:-1;;;;;13590:25:0;:10;:25;;:48;;-1:-1:-1;13633:5:0;;-1:-1:-1;;;;;13633:5:0;13619:10;:19;13590:48;:77;;;-1:-1:-1;13656:11:0;;-1:-1:-1;;;;;13656:11:0;13642:10;:25;13590:77;13568:166;;;;-1:-1:-1;;;13568:166:0;;22340:2:1;13568:166:0;;;22322:21:1;22379:2;22359:18;;;22352:30;22418:34;22398:18;;;22391:62;-1:-1:-1;;;22469:18:1;;;22462:37;22516:19;;13568:166:0;22138:403:1;13568:166:0;19486:17:::1;::::0;::::1;::::0;;:46:::1;;-1:-1:-1::0;19507:20:0;;:25;19486:46:::1;19482:331;;;19612:103;::::0;;;;::::1;::::0;;-1:-1:-1;19612:103:0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;19586:23:0;::::1;::::0;;;:16:::1;:23:::0;;;;;:129;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;19586:129:0::1;19612:103;19586:129:::0;;::::1;::::0;;;::::1;::::0;;;19735:45;;22765:21:1;;;22802:18;;;22795:29;;;22875:20;;22868:49;;;-1:-1:-1;19735:45:0::1;::::0;22856:2:1;22841:18;19735:45:0::1;;;;;;;19795:7;;19482:331;4112:5;19833:38;::::0;::::1;;;19825:86;;;::::0;-1:-1:-1;;;19825:86:0;;23130:2:1;19825:86:0::1;::::0;::::1;23112:21:1::0;23169:2;23149:18;;;23142:30;23208:34;23188:18;;;23181:62;-1:-1:-1;;;23259:18:1;;;23252:33;23302:19;;19825:86:0::1;22928:399:1::0;19825:86:0::1;19925:10;19937:18;19959:25;19977:6;19959:17;:25::i;:::-;20023:94;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;19997:23:0;::::1;-1:-1:-1::0;19997:23:0;;;:16:::1;:23:::0;;;;;:120;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;19997:120:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;20130:15;;;:11:::1;:15:::0;;;;20023:94;;-1:-1:-1;19924:60:0;-1:-1:-1;20130:22:0::1;19924:60:::0;20130:15;:22:::1;:::i;:::-;;20197:2;20190:5;-1:-1:-1::0;;;;;20170:50:0::1;;20201:4;20207:12;20170:50;;;;;;;:::i;:::-;;;;;;;;19471:757;;13745:1;13433:321:::0;19310:918;;;;:::o;32365:656::-;32450:10;32416:14;32433:28;;;:16;:28;;;;;;32480:10;32472:57;;;;-1:-1:-1;;;32472:57:0;;23534:2:1;32472:57:0;;;23516:21:1;23573:2;23553:18;;;23546:30;23612:34;23592:18;;;23585:62;-1:-1:-1;;;23663:18:1;;;23656:32;23705:19;;32472:57:0;23332:398:1;32472:57:0;32617:10;32579:16;32598:30;;;:18;:30;;;;;;;;;;32641:16;:28;;;;;:32;;;32684:34;;;;32762:14;:26;;;;;:36;;32598:30;;32792:6;;32762:36;;32792:6;;32762:36;:::i;:::-;;;;-1:-1:-1;;32862:10:0;32845:28;;;;:16;:28;;;;;:40;;32877:8;;32845:28;:40;;32877:8;;32845:40;:::i;:::-;;;;-1:-1:-1;32930:31:0;;-1:-1:-1;32942:10:0;32954:6;32930:11;:31::i;:::-;32979:34;;949:25:1;;;32994:10:0;;32979:34;;937:2:1;922:18;32979:34:0;;;;;;;32405:616;;32365:656::o;16301:182::-;1552:5;;-1:-1:-1;;;;;1552:5:0;1538:10;:19;1530:64;;;;-1:-1:-1;;;1530:64:0;;;;;;;:::i;:::-;16385:15:::1;:34:::0;;-1:-1:-1;;;;;;16385:34:0::1;-1:-1:-1::0;;;;;16385:34:0;::::1;::::0;;::::1;::::0;;;16435:40:::1;::::0;::::1;::::0;-1:-1:-1;;16435:40:0::1;16301:182:::0;:::o;40943:1993::-;-1:-1:-1;;;;;41250:18:0;;;41068:20;41250:18;;;:11;:18;;;;;;;;41225:43;;;;;;;;;;;;;;;-1:-1:-1;;;41225:43:0;;;;;;;;;;;;;;41068:20;;;;;;;;41283:22;;;41279:47;;41315:1;41318;41321;41324;41307:19;;;;;;;;;;;41279:47;-1:-1:-1;;;;;41440:17:0;;41422:15;41440:17;;;:10;:17;;;;;;;41422:15;41544:11;;;;;:44;;-1:-1:-1;41559:15:0;;-1:-1:-1;;;;;41559:15:0;:29;;41544:44;41540:939;;;42126:15;;42098:63;;-1:-1:-1;;;42098:63:0;;;;;949:25:1;;;41698:14:0;;;;;;;;-1:-1:-1;;;;;42126:15:0;;;;42098:54;;922:18:1;;42098:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41605:556;;;;;;;;;;;;;;;;8307:42;-1:-1:-1;;;;;42194:14:0;:6;-1:-1:-1;;;;;42194:14:0;;42190:278;;42247:11;-1:-1:-1;;;;;42239:20:0;42229:30;;42298:11;-1:-1:-1;;;;;42290:20:0;42278:32;;42190:278;;;-1:-1:-1;;;;;;;42336:14:0;;;42332:136;;42389:11;-1:-1:-1;;;;;42381:20:0;42371:30;;42440:11;-1:-1:-1;;;;;42432:20:0;42420:32;;42332:136;41590:889;;;;41540:939;3956:5;42573:24;3371:4;42573:7;:24;:::i;:::-;42572:41;;;;:::i;:::-;42557:56;-1:-1:-1;3956:5:0;42642:26;3371:4;42642:9;:26;:::i;:::-;42641:43;;;;:::i;:::-;-1:-1:-1;;;;;42781:25:0;;;;;;:18;:25;;;;;;42624:60;;-1:-1:-1;3956:5:0;;42781:42;;3371:4;;42781:42;:::i;:::-;42780:59;;;;:::i;:::-;-1:-1:-1;;;;;42868:27:0;;;;;;:20;:27;;;;;;42765:74;;-1:-1:-1;3956:5:0;;42868:44;;3371:4;;42868:44;:::i;:::-;42867:61;;;;:::i;:::-;42850:78;;41214:1722;;;;40943:1993;;;;;;;;:::o;17965:507::-;18048:10;18016;18029:30;;;:18;:30;;;;;;;18070:60;;;;-1:-1:-1;;;18070:60:0;;9580:2:1;18070:60:0;;;9562:21:1;9619:2;9599:18;;;9592:30;9658:33;9638:18;;;9631:61;9709:18;;18070:60:0;9378:355:1;18070:60:0;18180:10;18143:18;18164:27;;;:15;:27;;;;;18143:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18223:10:0;18245:1;18204:30;;;:18;:30;;;;;;;;:43;;;18258:32;;;;;;;;;;:27;;;:15;:27;;;;;18143:48;;-1:-1:-1;18258:32:0;;-1:-1:-1;18258:32:0;-1:-1:-1;18258:27:0;;-1:-1:-1;18258:32:0;:::i;:::-;-1:-1:-1;18305:22:0;;;;:18;:22;;;;;;18331:10;-1:-1:-1;;;;;18305:22:0;;;:36;18301:104;;18391:1;18358:22;;;:18;:22;;;;;:35;;-1:-1:-1;;;;;;18358:35:0;;;18301:104;18455:2;18443:10;-1:-1:-1;;;;;18422:42:0;;18459:4;18422:42;;;;;;:::i;:::-;;;;;;;;18005:467;;17965:507::o;18554:183::-;18627:7;18648:10;18664:25;18682:6;18664:17;:25::i;:::-;-1:-1:-1;18707:22:0;;;;:18;:22;;;;;;-1:-1:-1;;;;;18707:22:0;;18554:183;-1:-1:-1;;;18554:183:0:o;33818:821::-;33902:10;33864:16;33883:30;;;:18;:30;;;;;;33932:12;33924:54;;;;-1:-1:-1;;;33924:54:0;;24332:2:1;33924:54:0;;;24314:21:1;24371:2;24351:18;;;24344:30;24410:31;24390:18;;;24383:59;24459:18;;33924:54:0;24130:353:1;33924:54:0;34132:10;34115:28;;;;:16;:28;;;;;;:40;-1:-1:-1;34115:40:0;34107:82;;;;-1:-1:-1;;;34107:82:0;;24690:2:1;34107:82:0;;;24672:21:1;24729:2;24709:18;;;24702:30;24768:31;24748:18;;;24741:59;24817:18;;34107:82:0;24488:353:1;34107:82:0;34247:10;34230:28;;;;:16;:28;;;;;:40;;34262:8;;34230:28;:40;;34262:8;;34230:40;:::i;:::-;;;;-1:-1:-1;;34327:10:0;34341:1;34308:30;;;:18;:30;;;;;;;;:34;;;34386:14;:26;;;;;:38;;34416:8;;34341:1;34386:38;;34416:8;;34386:38;:::i;:::-;;;;-1:-1:-1;;34476:10:0;34459:28;;;;:16;:28;;;;;:40;;34491:8;;34459:28;:40;;34491:8;;34459:40;:::i;:::-;;;;-1:-1:-1;34544:33:0;;-1:-1:-1;34556:10:0;34568:8;34544:11;:33::i;:::-;34595:36;;949:25:1;;;34610:10:0;;34595:36;;937:2:1;922:18;34595:36:0;;;;;;;33853:786;33818:821::o;36807:304::-;-1:-1:-1;;;;;36990:18:0;;;36897:21;36990:18;;;:11;:18;;;;;;;;36965:43;;;;;;;;;;;;;;;-1:-1:-1;;;36965:43:0;;;;;;;;;;;37073:30;;;:15;:30;;;;;;37057:46;;36920:27;;36965:43;37073:30;37057:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36954:157;36807:304;;;:::o;43126:642::-;-1:-1:-1;;;;;43349:25:0;;43239:22;43349:25;;;:16;:25;;;;;;;;;43408:14;:23;;;;;;43464:18;:27;;;;;;43522:16;:25;;;;;;;43239:22;;43349:25;;43408:23;43464:27;43616:28;;;:63;;43678:1;43616:63;;;43647:28;43664:11;43647:14;:28;:::i;:::-;43599:80;;43720:9;43705:12;:24;:55;;43759:1;43705:55;;;43732:24;43747:9;43732:12;:24;:::i;:::-;43690:70;;43313:455;;;;43126:642;;;:::o;35616:294::-;-1:-1:-1;;;;;35792:23:0;;35731:19;35792:23;;;:16;:23;;;;;;;;35768:47;;;;;;;;;;;;;;;;;;;;;;;35835:26;;;:11;:26;;;;;35826:35;;35709:20;;35731:19;35768:47;35835:26;35826:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35887:2;:15;;;35872:30;;35757:153;35616:294;;;:::o;1622:236::-;1552:5;;-1:-1:-1;;;;;1552:5:0;1538:10;:19;1530:64;;;;-1:-1:-1;;;1530:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1705:22:0;::::1;1697:73;;;::::0;-1:-1:-1;;;1697:73:0;;25048:2:1;1697:73:0::1;::::0;::::1;25030:21:1::0;25087:2;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;-1:-1:-1;;;25177:18:1;;;25170:36;25223:19;;1697:73:0::1;24846:402:1::0;1697:73:0::1;1807:5;::::0;;1786:37:::1;::::0;-1:-1:-1;;;;;1786:37:0;;::::1;::::0;1807:5;::::1;::::0;1786:37:::1;::::0;::::1;1834:5;:16:::0;;-1:-1:-1;;;;;;1834:16:0::1;-1:-1:-1::0;;;;;1834:16:0;;;::::1;::::0;;;::::1;::::0;;1622:236::o;26760:4704::-;26856:1;26847:6;:10;26839:52;;;;-1:-1:-1;;;26839:52:0;;25455:2:1;26839:52:0;;;25437:21:1;25494:2;25474:18;;;25467:30;25533:31;25513:18;;;25506:59;25582:18;;26839:52:0;25253:353:1;26839:52:0;-1:-1:-1;;;;;26929:18:0;;;26904:22;26929:18;;;:11;:18;;;;;;;;26904:43;;;;;;;;;;;;;;-1:-1:-1;;;26904:43:0;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3956:5:0;27024:23;3371:4;27024:6;:23;:::i;:::-;27023:41;;;;:::i;:::-;27002:62;;3956:5;27097:23;3444:4;27097:6;:23;:::i;:::-;27096:41;;;;:::i;:::-;27075:18;;;:62;3956:5;27170:24;3518:4;27170:6;:24;:::i;:::-;27169:41;;;;:::i;:::-;27148:19;;;:62;;;27254:18;;;;27234:17;;:38;;27254:18;27234:38;:::i;:::-;:60;;;;:::i;:::-;27223:8;;;:71;27305:19;3956:5;27371:22;3591:3;27371:6;:22;:::i;:::-;27370:39;;;;:::i;:::-;27356:53;;27432:11;27420:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;27458:15:0;;27454:227;;27494:12;;-1:-1:-1;;;;;27494:12:0;:26;27490:180;;27553:12;;27541:38;;-1:-1:-1;;;;;27553:12:0;27567:11;27541;:38::i;:::-;27490:180;;;27643:11;27620:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;27490:180:0;3956:5;27727:22;3664:3;27727:6;:22;:::i;:::-;27726:39;;;;:::i;:::-;27712:53;;27788:11;27776:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;27814:15:0;;27810:227;;27850:12;;-1:-1:-1;;;;;27850:12:0;:26;27846:180;;27909:12;;27897:38;;-1:-1:-1;;;;;27909:12:0;27923:11;27897;:38::i;:::-;27846:180;;;27999:11;27976:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;27846:180:0;3956:5;28083:22;3737:3;28083:6;:22;:::i;:::-;28082:39;;;;:::i;:::-;28068:53;;28144:11;28132:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;28170:15:0;;28166:227;;28206:12;;-1:-1:-1;;;;;28206:12:0;:26;28202:180;;28265:12;;28253:38;;-1:-1:-1;;;;;28265:12:0;28279:11;28253;:38::i;:::-;28202:180;;;28355:11;28332:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;28202:180:0;3956:5;28439:22;3810:3;28439:6;:22;:::i;:::-;28438:39;;;;:::i;:::-;28424:53;;28500:11;28488:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;28526:15:0;;28522:227;;28562:12;;-1:-1:-1;;;;;28562:12:0;:26;28558:180;;28621:12;;28609:38;;-1:-1:-1;;;;;28621:12:0;28635:11;28609;:38::i;:::-;28558:180;;;28711:11;28688:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;28558:180:0;3956:5;28795:22;3883:3;28795:6;:22;:::i;:::-;28794:39;;;;:::i;:::-;28780:53;;28856:11;28844:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;28882:15:0;;28878:227;;28918:12;;-1:-1:-1;;;;;28918:12:0;:26;28914:180;;28977:12;;28965:38;;-1:-1:-1;;;;;28977:12:0;28991:11;28965;:38::i;:::-;28914:180;;;29067:11;29044:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;28914:180:0;29156:17;29185:4;:8;;;29176:6;:17;;;;:::i;:::-;29156:37;;29227:9;29204:4;:19;;:32;;;;;;;:::i;:::-;;;-1:-1:-1;29326:17:0;;:21;;;;:50;;-1:-1:-1;29351:11:0;;-1:-1:-1;;;;;29351:25:0;;;29326:50;29322:704;;;29432:43;29450:5;29457:4;:17;;;29432;:43::i;:::-;29411:17;;;29393:82;29394:15;;;29393:82;;;29496:19;29492:336;;29569:15;;;;;29553:11;;-1:-1:-1;;;;;29536:29:0;;;;;:16;:29;;;;;;:48;;29569:15;;29536:29;;:48;;29569:15;;29536:48;:::i;:::-;;;;-1:-1:-1;;29674:15:0;;;;;29658:11;;-1:-1:-1;;;;;29639:31:0;;;;;:18;:31;;;;;;:50;;29674:15;;29639:31;;:50;;29674:15;;29639:50;:::i;:::-;;;;-1:-1:-1;;29757:11:0;;29777:15;;;;;29794:17;;29742:70;;;1159:25:1;;;1200:18;;;1193:34;-1:-1:-1;;;;;29742:70:0;;;;;;;;1132:18:1;29742:70:0;;;;;;;29492:336;29322:704;;;29961:17;;29938:19;;;:40;;;;29961:17;;29938:40;:::i;:::-;;;-1:-1:-1;30013:1:0;29993:21;;29322:704;30124:18;;;;:22;30120:839;;30167:15;;-1:-1:-1;;;;;30167:15:0;:29;30163:785;;30339:15;;30368:18;;;;30410:39;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30410:39:0;-1:-1:-1;;;30410:39:0;;;30331:137;;30313:12;;-1:-1:-1;;;;;30339:15:0;;30368:18;30331:137;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30312:156;;;30492:7;30487:203;;30607:4;:18;;;30584:4;:19;;:41;;;;;;;:::i;:::-;;;-1:-1:-1;30669:1:0;30648:18;;;:22;30487:203;30198:507;30163:785;;;30715:13;;-1:-1:-1;;;;;30715:13:0;:27;30711:237;;30775:13;;30790:18;;;;30763:46;;-1:-1:-1;;;;;30775:13:0;;30763:11;:46::i;:::-;30711:237;;;30873:4;:18;;;30850:4;:19;;:41;;;;;;;:::i;:::-;;;-1:-1:-1;30931:1:0;30910:18;;;:22;30711:237;31035:19;;;;:23;31031:181;;31092:14;;31075;;-1:-1:-1;;;;;31092:14:0;:53;;31140:5;;-1:-1:-1;;;;;31140:5:0;31092:53;;;31123:14;;-1:-1:-1;;;;;31123:14:0;31092:53;31075:70;;31160:40;31172:6;31180:4;:19;;;31160:11;:40::i;:::-;31060:152;31031:181;31299:17;;31331:15;;;;;31361:17;;;;;31393:18;;;;;31426:19;;;;;31229:227;;26308:25:1;;;26349:18;;;26342:34;;;;26392:18;;;26385:34;;;;26435:18;;26428:34;26478:19;;26471:35;26537:3;26522:19;;26515:35;;;;-1:-1:-1;;;;;31229:227:0;;;;;26295:3:1;26280:19;31229:227:0;;;;;;;26828:4636;;;;26760:4704;;:::o;21285:224::-;21358:6;21368:1;21358:11;21354:24;;21285:224;;:::o;21354:24::-;21389:7;21410:2;-1:-1:-1;;;;;21402:16:0;21426:6;21402:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21388:49;;;21456:2;21448:53;;;;-1:-1:-1;;;21448:53:0;;26973:2:1;21448:53:0;;;26955:21:1;27012:2;26992:18;;;26985:30;27051:34;27031:18;;;27024:62;-1:-1:-1;;;27102:18:1;;;27095:36;27148:19;;21448:53:0;26771:402:1;21448:53:0;21343:166;21285:224;;:::o;22101:4578::-;22205:1;22196:6;:10;22188:52;;;;-1:-1:-1;;;22188:52:0;;25455:2:1;22188:52:0;;;25437:21:1;25494:2;25474:18;;;25467:30;25533:31;25513:18;;;25506:59;25582:18;;22188:52:0;25253:353:1;22188:52:0;-1:-1:-1;;;;;22278:18:0;;;22253:22;22278:18;;;:11;:18;;;;;;;;22253:43;;;;;;;;;;;;;;-1:-1:-1;;;22253:43:0;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3285:5:0;22373:23;2707:4;22373:6;:23;:::i;:::-;22372:41;;;;:::i;:::-;22351:62;;3285:5;22446:23;2778:4;22446:6;:23;:::i;:::-;22445:41;;;;:::i;:::-;22424:18;;;:62;3285:5;22519:24;2851:4;22519:6;:24;:::i;:::-;22518:41;;;;:::i;:::-;22497:19;;;:62;;;22603:18;;;;22583:17;;:38;;22603:18;22583:38;:::i;:::-;:60;;;;:::i;:::-;22572:8;;;:71;22654:19;3285:5;22720:22;2925:3;22720:6;:22;:::i;:::-;22719:39;;;;:::i;:::-;22705:53;;22781:11;22769:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;22807:15:0;;22803:227;;22843:12;;-1:-1:-1;;;;;22843:12:0;:26;22839:180;;22902:12;;22890:38;;-1:-1:-1;;;;;22902:12:0;22916:11;22890;:38::i;:::-;22839:180;;;22992:11;22969:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;22839:180:0;3285:5;23076:22;2997:3;23076:6;:22;:::i;:::-;23075:39;;;;:::i;:::-;23061:53;;23137:11;23125:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;23163:15:0;;23159:227;;23199:12;;-1:-1:-1;;;;;23199:12:0;:26;23195:180;;23258:12;;23246:38;;-1:-1:-1;;;;;23258:12:0;23272:11;23246;:38::i;:::-;23195:180;;;23348:11;23325:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;23195:180:0;3285:5;23432:22;3069:3;23432:6;:22;:::i;:::-;23431:39;;;;:::i;:::-;23417:53;;23493:11;23481:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;23519:15:0;;23515:227;;23555:12;;-1:-1:-1;;;;;23555:12:0;:26;23551:180;;23614:12;;23602:38;;-1:-1:-1;;;;;23614:12:0;23628:11;23602;:38::i;:::-;23551:180;;;23704:11;23681:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;23551:180:0;3285:5;23788:22;3141:3;23788:6;:22;:::i;:::-;23787:39;;;;:::i;:::-;23773:53;;23849:11;23837:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;23875:15:0;;23871:227;;23911:12;;-1:-1:-1;;;;;23911:12:0;:26;23907:180;;23970:12;;23958:38;;-1:-1:-1;;;;;23970:12:0;23984:11;23958;:38::i;:::-;23907:180;;;24060:11;24037:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;23907:180:0;3285:5;24144:22;3213:3;24144:6;:22;:::i;:::-;24143:39;;;;:::i;:::-;24129:53;;24205:11;24193:4;:8;;:23;;;;;;;:::i;:::-;;;-1:-1:-1;24231:15:0;;24227:227;;24267:12;;-1:-1:-1;;;;;24267:12:0;:26;24263:180;;24326:12;;24314:38;;-1:-1:-1;;;;;24326:12:0;24340:11;24314;:38::i;:::-;24263:180;;;24416:11;24393:4;:19;;:34;;;;;;;:::i;:::-;;;-1:-1:-1;24263:180:0;24505:17;24534:4;:8;;;24525:6;:17;;;;:::i;:::-;24505:37;;24576:9;24553:4;:19;;:32;;;;;;;:::i;:::-;;;-1:-1:-1;24675:17:0;;:21;;;;:50;;-1:-1:-1;24700:11:0;;-1:-1:-1;;;;;24700:25:0;;;24675:50;24671:570;;;24781:43;24799:5;24806:4;:17;;;24781;:43::i;:::-;24760:17;;;24742:82;24743:15;;;24742:82;;;24845:19;24841:202;;24918:15;;;;;24902:11;;-1:-1:-1;;;;;24885:29:0;;;;;:16;:29;;;;;;:48;;24918:15;;24885:29;;:48;;24918:15;;24885:48;:::i;12136:869::-;12338:8;;12235:10;;12247:18;;12306:6;;12365:7;12357:48;;;;-1:-1:-1;;;12357:48:0;;27380:2:1;12357:48:0;;;27362:21:1;27419:2;27399:18;;;27392:30;27458;27438:18;;;27431:58;27506:18;;12357:48:0;27178:352:1;12357:48:0;12450:4;;12418:13;;-1:-1:-1;;;12458:17:0;12450:1;;12418:13;;12450:4;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;12450:4:0;:25;12446:137;;12513:1;12507:3;:7;12499:48;;;;-1:-1:-1;;;12499:48:0;;27380:2:1;12499:48:0;;;27362:21:1;27419:2;27399:18;;;27392:30;27458;27438:18;;;27431:58;27506:18;;12499:48:0;27178:352:1;12499:48:0;-1:-1:-1;12570:1:0;12446:137;12595:14;12622:11;12628:5;12622:3;:11;:::i;:::-;12612:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12612:22:0;-1:-1:-1;12595:39:0;-1:-1:-1;12662:5:0;12645:266;12673:3;12669:1;:7;12645:266;;;12698:7;12714:1;12716;12714:4;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;12743:2:0;12738:7;;;;;:18;;;12754:2;12749:1;:7;;;;12738:18;12734:166;;;12799:6;:1;12803:2;12799:6;:::i;:::-;12792:14;;12777:1;12779:9;12783:5;12779:1;:9;:::i;:::-;12777:12;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;12777:29:0;;;;;;;;;12734:166;;;12880:1;12882;12880:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;12880:4:0;12865:1;12867:9;12871:5;12867:1;:9;:::i;:::-;12865:12;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;12865:19:0;;;;;;;;;12734:166;-1:-1:-1;12678:3:0;;12645:266;;;;12937:1;12923:16;;12994:1;12965:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;12955:42;;;;;;12950:47;;12272:733;;;;12136:869;;;:::o;20532:745::-;-1:-1:-1;;;;;20752:23:0;;20639:18;20752:23;;;:16;:23;;;;;;;;20728:47;;;;;;;;;;;;;;;;;;;;;;;;;;;20705:12;;20639:18;20829:17;;;:37;;-1:-1:-1;20850:16:0;;20829:37;:61;;;-1:-1:-1;20870:15:0;;;;:20;;;20829:61;20825:116;;;-1:-1:-1;20927:1:0;;-1:-1:-1;20907:22:0;;-1:-1:-1;20907:22:0;20825:116;20984:15;;;;4112:5;;20969:30;;20968:57;20969:30;:12;:30;:::i;:::-;20968:57;;;;:::i;:::-;20953:72;;21040:12;21056:1;21040:17;21036:72;;-1:-1:-1;21094:1:0;;-1:-1:-1;21074:22:0;;-1:-1:-1;21074:22:0;21036:72;21133:27;21148:12;21133;:27;:::i;:::-;-1:-1:-1;;;;;21171:22:0;;;;;;:15;:22;;;;;;;;:26;;;;;;;;:42;;21120:40;;-1:-1:-1;21201:12:0;;21171:26;;:22;:42;;21201:12;;21171:42;:::i;:::-;;;;-1:-1:-1;;21231:38:0;;949:25:1;;;21252:2:0;;-1:-1:-1;;;;;21231:38:0;;;;;937:2:1;922:18;21231:38:0;;;;;;;20681:596;;20532:745;;;;;;:::o;415:131:1:-;-1:-1:-1;;;;;490:31:1;;480:42;;470:70;;536:1;533;526:12;551:247;610:6;663:2;651:9;642:7;638:23;634:32;631:52;;;679:1;676;669:12;631:52;718:9;705:23;737:31;762:5;737:31;:::i;:::-;787:5;551:247;-1:-1:-1;;;551:247:1:o;1238:289::-;1280:3;1318:5;1312:12;1345:6;1340:3;1333:19;1401:6;1394:4;1387:5;1383:16;1376:4;1371:3;1367:14;1361:47;1453:1;1446:4;1437:6;1432:3;1428:16;1424:27;1417:38;1516:4;1509:2;1505:7;1500:2;1492:6;1488:15;1484:29;1479:3;1475:39;1471:50;1464:57;;;1238:289;;;;:::o;1532:806::-;-1:-1:-1;;;;;1867:32:1;;1849:51;;1936:3;1931:2;1916:18;;1909:31;;;-1:-1:-1;;1963:46:1;;1989:19;;1981:6;1963:46;:::i;:::-;2057:9;2049:6;2045:22;2040:2;2029:9;2025:18;2018:50;2085:33;2111:6;2103;2085:33;:::i;:::-;-1:-1:-1;;;;;2154:32:1;;;;2149:2;2134:18;;2127:60;-1:-1:-1;;2236:6:1;2224:19;;;;2218:3;2203:19;;2196:48;2174:3;2260:19;;2253:35;;;;2319:3;2304:19;;;2297:35;2077:41;1532:806;-1:-1:-1;;;1532:806:1:o;2343:388::-;2411:6;2419;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2527:9;2514:23;2546:31;2571:5;2546:31;:::i;:::-;2596:5;-1:-1:-1;2653:2:1;2638:18;;2625:32;2666:33;2625:32;2666:33;:::i;:::-;2718:7;2708:17;;;2343:388;;;;;:::o;2736:1097::-;2849:6;2857;2865;2873;2881;2889;2897;2950:3;2938:9;2929:7;2925:23;2921:33;2918:53;;;2967:1;2964;2957:12;2918:53;3006:9;2993:23;3025:31;3050:5;3025:31;:::i;:::-;3075:5;-1:-1:-1;3132:2:1;3117:18;;3104:32;3145:33;3104:32;3145:33;:::i;:::-;3197:7;-1:-1:-1;3256:2:1;3241:18;;3228:32;3269:33;3228:32;3269:33;:::i;:::-;3321:7;-1:-1:-1;3380:2:1;3365:18;;3352:32;3393:33;3352:32;3393:33;:::i;:::-;3445:7;-1:-1:-1;3504:3:1;3489:19;;3476:33;3518;3476;3518;:::i;:::-;3570:7;-1:-1:-1;3629:3:1;3614:19;;3601:33;3643;3601;3643;:::i;:::-;3695:7;-1:-1:-1;3754:3:1;3739:19;;3726:33;3768;3726;3768;:::i;:::-;3820:7;3810:17;;;2736:1097;;;;;;;;;;:::o;4020:315::-;4088:6;4096;4149:2;4137:9;4128:7;4124:23;4120:32;4117:52;;;4165:1;4162;4155:12;4117:52;4204:9;4191:23;4223:31;4248:5;4223:31;:::i;:::-;4273:5;4325:2;4310:18;;;;4297:32;;-1:-1:-1;;;4020:315:1:o;4340:220::-;4489:2;4478:9;4471:21;4452:4;4509:45;4550:2;4539:9;4535:18;4527:6;4509:45;:::i;4565:127::-;4626:10;4621:3;4617:20;4614:1;4607:31;4657:4;4654:1;4647:15;4681:4;4678:1;4671:15;4697:726;4740:5;4793:3;4786:4;4778:6;4774:17;4770:27;4760:55;;4811:1;4808;4801:12;4760:55;4851:6;4838:20;4881:18;4873:6;4870:30;4867:56;;;4903:18;;:::i;:::-;4952:2;4946:9;5044:2;5006:17;;-1:-1:-1;;5002:31:1;;;5035:2;4998:40;4994:54;4982:67;;5079:18;5064:34;;5100:22;;;5061:62;5058:88;;;5126:18;;:::i;:::-;5162:2;5155:22;5186;;;5227:19;;;5248:4;5223:30;5220:39;-1:-1:-1;5217:59:1;;;5272:1;5269;5262:12;5217:59;5336:6;5329:4;5321:6;5317:17;5310:4;5302:6;5298:17;5285:58;5391:1;5363:19;;;5384:4;5359:30;5352:41;;;;5367:6;4697:726;-1:-1:-1;;;4697:726:1:o;5428:322::-;5497:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5606:9;5593:23;5639:18;5631:6;5628:30;5625:50;;;5671:1;5668;5661:12;5625:50;5694;5736:7;5727:6;5716:9;5712:22;5694:50;:::i;:::-;5684:60;5428:322;-1:-1:-1;;;;5428:322:1:o;5755:226::-;5814:6;5867:2;5855:9;5846:7;5842:23;5838:32;5835:52;;;5883:1;5880;5873:12;5835:52;-1:-1:-1;5928:23:1;;5755:226;-1:-1:-1;5755:226:1:o;5986:446::-;6217:3;6206:9;6199:22;6180:4;6238:46;6279:3;6268:9;6264:19;6256:6;6238:46;:::i;:::-;6332:6;6320:19;;;;6315:2;6300:18;;6293:47;-1:-1:-1;6371:2:1;6356:18;;6349:34;;;;6414:2;6399:18;;;6392:34;6230:54;5986:446;-1:-1:-1;5986:446:1:o;6437:625::-;6523:6;6531;6539;6592:2;6580:9;6571:7;6567:23;6563:32;6560:52;;;6608:1;6605;6598:12;6560:52;6647:9;6634:23;6666:31;6691:5;6666:31;:::i;:::-;6716:5;-1:-1:-1;6772:2:1;6757:18;;6744:32;6799:18;6788:30;;6785:50;;;6831:1;6828;6821:12;6785:50;6854;6896:7;6887:6;6876:9;6872:22;6854:50;:::i;:::-;6844:60;;;6956:2;6945:9;6941:18;6928:32;7004:6;6995:7;6991:20;6982:7;6979:33;6969:61;;7026:1;7023;7016:12;6969:61;7049:7;7039:17;;;6437:625;;;;;:::o;7835:317::-;-1:-1:-1;;;;;8012:32:1;;7994:51;;8081:2;8076;8061:18;;8054:30;;;-1:-1:-1;;8101:45:1;;8127:18;;8119:6;8101:45;:::i;8421:302::-;8596:2;8585:9;8578:21;8559:4;8616:45;8657:2;8646:9;8642:18;8634:6;8616:45;:::i;:::-;8608:53;;8709:6;8701;8697:19;8692:2;8681:9;8677:18;8670:47;8421:302;;;;;:::o;10140:127::-;10201:10;10196:3;10192:20;10189:1;10182:31;10232:4;10229:1;10222:15;10256:4;10253:1;10246:15;10272:125;10337:9;;;10358:10;;;10355:36;;;10371:18;;:::i;:::-;10272:125;;;;:::o;10402:380::-;10481:1;10477:12;;;;10524;;;10545:61;;10599:4;10591:6;10587:17;10577:27;;10545:61;10652:2;10644:6;10641:14;10621:18;10618:38;10615:161;;10698:10;10693:3;10689:20;10686:1;10679:31;10733:4;10730:1;10723:15;10761:4;10758:1;10751:15;10615:161;;10402:380;;;:::o;10787:356::-;10989:2;10971:21;;;11008:18;;;11001:30;11067:34;11062:2;11047:18;;11040:62;11134:2;11119:18;;10787:356::o;14713:128::-;14780:9;;;14801:11;;;14798:37;;;14815:18;;:::i;15207:138::-;15286:13;;15308:31;15286:13;15308:31;:::i;:::-;15207:138;;;:::o;15350:165::-;15428:13;;15481:8;15470:20;;15460:31;;15450:59;;15505:1;15502;15495:12;15520:164;15597:13;;15650:1;15639:20;;;15629:31;;15619:59;;15674:1;15671;15664:12;15689:192;15768:13;;-1:-1:-1;;;;;15810:46:1;;15800:57;;15790:85;;15871:1;15868;15861:12;15886:1290;16049:6;16057;16065;16073;16081;16089;16097;16105;16113;16121;16129:7;16138;16192:3;16180:9;16171:7;16167:23;16163:33;16160:53;;;16209:1;16206;16199:12;16160:53;16241:9;16235:16;16291:26;16284:5;16280:38;16273:5;16270:49;16260:77;;16333:1;16330;16323:12;16260:77;16356:5;-1:-1:-1;16380:49:1;16425:2;16410:18;;16380:49;:::i;:::-;16370:59;;16448:49;16493:2;16482:9;16478:18;16448:49;:::i;:::-;16438:59;;16516:49;16561:2;16550:9;16546:18;16516:49;:::i;:::-;16506:59;;16584:49;16628:3;16617:9;16613:19;16584:49;:::i;:::-;16574:59;;16652:48;16695:3;16684:9;16680:19;16652:48;:::i;:::-;16642:58;;16719:48;16762:3;16751:9;16747:19;16719:48;:::i;:::-;16709:58;;16786:50;16831:3;16820:9;16816:19;16786:50;:::i;:::-;16902:3;16887:19;;16881:26;16999:3;16984:19;;16978:26;16776:60;;-1:-1:-1;16881:26:1;-1:-1:-1;16978:26:1;-1:-1:-1;17050:50:1;17095:3;17080:19;;17050:50;:::i;:::-;17039:61;;17120:50;17165:3;17154:9;17150:19;17120:50;:::i;:::-;17109:61;;15886:1290;;;;;;;;;;;;;;:::o;17950:540::-;18173:13;;18155:32;;18247:4;18235:17;;;18229:24;-1:-1:-1;;;;;18225:50:1;18203:20;;;18196:80;18336:4;18324:17;;;18318:24;-1:-1:-1;;;;;18314:65:1;;;18292:20;;;18285:95;;;;18440:4;18428:17;;;18422:24;18418:65;18396:20;;;18389:95;;;;18142:3;18127:19;;17950:540::o;18495:343::-;18574:6;18582;18635:2;18623:9;18614:7;18610:23;18606:32;18603:52;;;18651:1;18648;18641:12;18603:52;-1:-1:-1;;18696:16:1;;18802:2;18787:18;;;18781:25;18696:16;;18781:25;;-1:-1:-1;18495:343:1:o;19735:518::-;19837:2;19832:3;19829:11;19826:421;;;19873:5;19870:1;19863:16;19917:4;19914:1;19904:18;19987:2;19975:10;19971:19;19968:1;19964:27;19958:4;19954:38;20023:4;20011:10;20008:20;20005:47;;;-1:-1:-1;20046:4:1;20005:47;20101:2;20096:3;20092:12;20089:1;20085:20;20079:4;20075:31;20065:41;;20156:81;20174:2;20167:5;20164:13;20156:81;;;20233:1;20219:16;;20200:1;20189:13;20156:81;;20429:1299;20555:3;20549:10;20582:18;20574:6;20571:30;20568:56;;;20604:18;;:::i;:::-;20633:97;20723:6;20683:38;20715:4;20709:11;20683:38;:::i;:::-;20677:4;20633:97;:::i;:::-;20779:4;20810:2;20799:14;;20827:1;20822:649;;;;21515:1;21532:6;21529:89;;;-1:-1:-1;21584:19:1;;;21578:26;21529:89;-1:-1:-1;;20386:1:1;20382:11;;;20378:24;20374:29;20364:40;20410:1;20406:11;;;20361:57;21631:81;;20792:930;;20822:649;19682:1;19675:14;;;19719:4;19706:18;;-1:-1:-1;;20858:20:1;;;20976:222;20990:7;20987:1;20984:14;20976:222;;;21072:19;;;21066:26;21051:42;;21179:4;21164:20;;;;21132:1;21120:14;;;;21006:12;20976:222;;;20980:3;21226:6;21217:7;21214:19;21211:201;;;21287:19;;;21281:26;-1:-1:-1;;21370:1:1;21366:14;;;21382:3;21362:24;21358:37;21354:42;21339:58;21324:74;;21211:201;-1:-1:-1;;;;21458:1:1;21442:14;;;21438:22;21425:36;;-1:-1:-1;20429:1299:1:o;23735:168::-;23808:9;;;23839;;23856:15;;;23850:22;;23836:37;23826:71;;23877:18;;:::i;23908:217::-;23948:1;23974;23964:132;;24018:10;24013:3;24009:20;24006:1;23999:31;24053:4;24050:1;24043:15;24081:4;24078:1;24071:15;23964:132;-1:-1:-1;24110:9:1;;23908:217::o;25611:211::-;25652:3;25690:5;25684:12;25734:6;25727:4;25720:5;25716:16;25711:3;25705:36;25796:1;25760:16;;25785:13;;;-1:-1:-1;25760:16:1;;25611:211;-1:-1:-1;25611:211:1:o;25827:189::-;25956:3;25981:29;26006:3;25998:6;25981:29;:::i;27535:127::-;27596:10;27591:3;27587:20;27584:1;27577:31;27627:4;27624:1;27617:15;27651:4;27648:1;27641:15;27667:148;27755:4;27734:12;;;27748;;;27730:31;;27773:13;;27770:39;;;27789:18;;:::i;27820:330::-;-1:-1:-1;;;28075:3:1;28068:23;28050:3;28107:37;28141:1;28136:3;28132:11;28124:6;28107:37;:::i

Swarm Source

ipfs://ab549d56225fdd57c073c00152121c6866fd080d9fc8efd934543f86f9cb3097

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  ]
[ 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.