MATIC Price: $0.99 (-2.31%)
Gas: 207 GWei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
Execute Nft Orde...217133492021-11-23 16:45:10856 days ago1637685910IN
Gains Network:GFarm Trading V4
0 MATIC0.03441120
Close Trade Mark...212321432021-11-11 3:40:53869 days ago1636602053IN
Gains Network:GFarm Trading V4
0 MATIC0.0013039336.3
Close Trade Mark...212320452021-11-11 3:36:17869 days ago1636601777IN
Gains Network:GFarm Trading V4
0 MATIC0.0566089533
Close Trade Mark...212064042021-11-10 11:17:36870 days ago1636543056IN
Gains Network:GFarm Trading V4
0 MATIC0.0460893330
Close Trade Mark...208388892021-11-01 1:18:41879 days ago1635729521IN
Gains Network:GFarm Trading V4
0 MATIC0.0686220440
Close Trade Mark...207437402021-10-29 14:54:18882 days ago1635519258IN
Gains Network:GFarm Trading V4
0 MATIC0.0686220440
Close Trade Mark...207271552021-10-29 4:14:20882 days ago1635480860IN
Gains Network:GFarm Trading V4
0 MATIC0.0686194840
Close Trade Mark...206432012021-10-26 20:14:33884 days ago1635279273IN
Gains Network:GFarm Trading V4
0 MATIC0.0686220440
Market Order Cal...206431772021-10-26 20:13:41884 days ago1635279221IN
Gains Network:GFarm Trading V4
0 MATIC0.0018100440
Execute Nft Orde...206276862021-10-26 10:03:24885 days ago1635242604IN
Gains Network:GFarm Trading V4
0 MATIC0.068914440
Update Sl206276792021-10-26 10:02:56885 days ago1635242576IN
Gains Network:GFarm Trading V4
0 MATIC0.0030308440
Execute Nft Orde...206275592021-10-26 9:57:44885 days ago1635242264IN
Gains Network:GFarm Trading V4
0 MATIC0.0689118440
Update Tp206273672021-10-26 9:51:08885 days ago1635241868IN
Gains Network:GFarm Trading V4
0 MATIC0.0014671640
Update Sl206273372021-10-26 9:50:08885 days ago1635241808IN
Gains Network:GFarm Trading V4
0 MATIC0.0030308440
Update Tp206265302021-10-26 9:15:58885 days ago1635239758IN
Gains Network:GFarm Trading V4
0 MATIC0.0014666840
Update Tp206257122021-10-26 8:43:34885 days ago1635237814IN
Gains Network:GFarm Trading V4
0 MATIC0.0021511640
Update Tp206250922021-10-26 8:18:13885 days ago1635236293IN
Gains Network:GFarm Trading V4
0 MATIC0.0014671640
Update Tp206243842021-10-26 7:50:13885 days ago1635234613IN
Gains Network:GFarm Trading V4
0 MATIC0.0010587240
Update Tp206243842021-10-26 7:50:13885 days ago1635234613IN
Gains Network:GFarm Trading V4
0 MATIC0.0013527640
Close Trade Mark...206243422021-10-26 7:48:45885 days ago1635234525IN
Gains Network:GFarm Trading V4
0 MATIC0.0014363640
Close Trade Mark...206225772021-10-26 6:35:15885 days ago1635230115IN
Gains Network:GFarm Trading V4
0 MATIC0.0014363640
Update Tp206224322021-10-26 6:30:17885 days ago1635229817IN
Gains Network:GFarm Trading V4
0 MATIC0.0008647640
Close Trade Mark...206166502021-10-26 2:27:22885 days ago1635215242IN
Gains Network:GFarm Trading V4
0 MATIC0.0014363640
Close Trade Mark...206161802021-10-26 2:10:48885 days ago1635214248IN
Gains Network:GFarm Trading V4
0 MATIC0.0014363640
Market Order Cal...206156792021-10-26 1:49:40885 days ago1635212980IN
Gains Network:GFarm Trading V4
0 MATIC0.0046637640
View all transactions

Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GFarmTradingV4

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-24
*/

// File: @uniswap\v2-core\contracts\interfaces\IUniswapV2Pair.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: @openzeppelin\contracts\math\SafeMath.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin\contracts\math\SignedSafeMath.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error.
 */
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }
}

// File: contracts\GFarmTradingV4.sol

pragma solidity ^0.6.0;

interface GFarmPoolInterfaceV4{
    function increaseAccTokensPerLp(uint _amount) external;
}

interface LinkToken{
    function transferFrom(address _from, address _to, uint256 _value) external returns(bool);
}

interface TokenInterfaceV4{
    function burn(address from, uint256 amount) external;
    function mint(address to, uint256 amount) external;
}

interface NftInterfaceV4{
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

interface PriceAggregatorInterfaceV4{
    // order types (aggregator): 
    // 0: open market, 1: close market, 2: open limit, 3: close limit
    function getPrice(uint _pairIndex, uint _orderType) external returns(uint);
    function canOpenTrade(uint _pairIndex, uint _positionSizeToken, uint _leverage) view external returns(bool);
    function increaseOpenInterest(uint _pairIndex, uint _positionSizeToken, uint _leverage) external;
    function decreaseOpenInterest(uint _pairIndex, uint _positionSizeToken, uint _leverage) external;
    function isPaused() external view returns(bool);
    function maxTradesPerBlock() external view returns(uint);
    function maxGainP() external view returns(uint);
    function minPosUsd() external view returns(uint);
    function maxPosTokenP() external view returns(uint);
    function maxPosTokenIncreaseP() external view returns(uint);
    function nftSuccessTimelock() external view returns(uint);
    function govOpenFeeP() external view returns(uint);
    function devOpenFeeP() external view returns(uint);
    function lpCloseFeeP() external view returns(uint);
    function nftLiqFeeP() external view returns(uint);
    function lpLiqFeeP() external view returns(uint);
    function nftLimitOrderFeeP() external view returns(uint);
    function minLimitOrderSlippageP() external view returns(uint);
    function referralP() external view returns(uint);
    function spreadReductionsP(uint i) external view returns(uint);
    function nftLinkFee() external view returns(uint);
    function getSpreadP(uint p) external view returns(uint);
}

contract GFarmTradingV4{

    using SafeMath for uint;
    using SignedSafeMath for int;

    // Contracts
    GFarmPoolInterfaceV4 public pool;
    PriceAggregatorInterfaceV4 public priceAggregator;
    TokenInterfaceV4 public token;
    NftInterfaceV4[5] public nft;
    IUniswapV2Pair public lp; // GFARM2/DAI
    LinkToken constant linkToken = LinkToken(0xb0897686c545045aFc77CF20eC7A532E3120E0F1);

    // Constants
    uint constant PRECISION = 1e10;
    uint constant LIQUIDATION_P = 90; // -90%
    uint constant MAX_SL_P = 80; // -80%
    uint constant MAX_TRADES_PER_PAIR = 3;
    uint constant MAX_PENDING_ORDERS = 5;
    uint constant LIMIT_TIMELOCK = 30;

    // Trading variables
    uint public tokensBurned; // 1e18
    uint public tokensMinted; // 1e18
    uint public nftRewards; // 1e18
    uint public devFees; // 1e18
    uint public govFees; // 1e18

    // Gov & dev funds
    address public govFund;
    address public immutable devFund;

    // Structs
    struct Trader{
        uint leverageUnlocked;
        address referral;
        uint referralRewardsTotal;
    }
    struct Trade{
        address trader;
        uint pairIndex;
        uint userTradesIndex;
        uint positionSizeToken; // 1e18
        uint positionSizeUsd; // 1e18
        uint openPrice; // PRECISION
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp; // PRECISION
        uint sl; // PRECISION
        uint tpLastUpdated; // blocks
        uint slLastUpdated; // blocks
    }
    struct OpenLimitOrder{
        address trader;
        uint pairIndex;
        uint positionSizeToken;
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp;
        uint sl;
        uint minPrice; // PRECISION
        uint maxPrice; // PRECISION
        uint block;
    }
    struct PendingMarketOrder{
        Trade trade;
        uint block;
        uint wantedPrice;
        uint slippageP;
    }
    struct PendingNftOrder{
        address nftHolder;
        uint nftId;
        address trader;
        uint pairIndex;
        uint userTradesIndex;
        uint orderType; // 1 = take profit, 2 = stop loss, 3 = liquidation, 4 = limit open
    }

    // Traders mappings
    mapping(address => Trader) public traders;
    mapping(address => mapping(uint => Trade[MAX_TRADES_PER_PAIR])) public userTrades;
    mapping(address => mapping(uint => uint)) public userTradesCount;
    mapping(address => mapping(uint => uint)) public userOpenLimitOrderId;
    mapping(address => mapping(uint => uint)) public pairTradersId;
    mapping(address => uint[]) public pendingOrderIds;
    mapping(address => mapping(uint => uint)) public pendingMarketOpenCount;
    mapping(address => mapping(uint => uint)) public pendingMarketCloseCount;

    // Pending orders mappings
    mapping(uint => PendingMarketOrder) reqID_pendingMarketOrder;
    mapping(uint => PendingNftOrder) public reqID_pendingNftOrder;

    // List of open trades & limit orders
    OpenLimitOrder[] public openLimitOrders;
    mapping(uint => address[]) public pairTraders; // List open trades

    // Restrictions & Timelocks
    mapping(uint => uint) public tradesPerBlock;
    mapping(uint => uint) public nftLastSuccess;

    // Events
    event TradeOpenedMarket(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        bool buy,
        uint leverage,
        uint price,
        uint positionSizeToken,
        uint positionSizeUsd
    );
    event TradeCanceledMarket(
        address indexed trader,
        uint pairIndex,
        uint wantedPrice,
        uint slippageP,
        uint openPrice
    );
    event TradeClosedMarket(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        uint price,
        bool buy,
        uint positionSizeToken,
        uint leverage,
        int pnlToken,
        uint tokenPriceUsd
    );
    event TradeLimitExecuted(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        address indexed nftHolder,
        uint orderType, // 1: tp, 2: sl, 3: liq, 4: open
        uint price,
        bool buy,
        uint leverage,
        uint positionSizeToken,
        int pnlToken,
        uint rewardToken,
        uint tokenPriceUsd
    );
    event TpSlUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint userTradesIndex,
        bool tp,
        uint value
    );
    event TradeLimitOpened(
        address indexed trader,
        uint indexed pairIndex
    );
    event TradeLimitCanceled(
        address indexed trader,
        uint indexed pairIndex
    );
    event ChainlinkCallbackFailed();
    event AddressUpdated(string name, address value);

    constructor(address _gov, address _dev, NftInterfaceV4[5] memory _nft) public{
        require(_gov != address(0));
        require(_dev != address(0));
        require(address(_nft[0]) != address(0));
        require(address(_nft[1]) != address(0));
        require(address(_nft[2]) != address(0));
        require(address(_nft[3]) != address(0));
        require(address(_nft[4]) != address(0));
        govFund = _gov;
        devFund = _dev;
        nft = _nft;
    }

    // GOV => UPDATE VARIABLES & MANAGE PAIRS

    // 0. Modifiers
    modifier onlyGov(){
        require(msg.sender == govFund, "GOV");
        _;
    }

    // Set addresses
    function setGovFund(address _gov) external onlyGov{
        require(_gov != address(0));
        govFund = _gov;
        emit AddressUpdated("govFund", _gov);
    }
    function setToken(address _token) external onlyGov{
        require(token == TokenInterfaceV4(0) && _token != address(0));
        token = TokenInterfaceV4(_token);
        emit AddressUpdated("token", _token);
    }
    function setLp(address _lp) external onlyGov{
        require(lp == IUniswapV2Pair(0) && _lp != address(0));
        lp = IUniswapV2Pair(_lp);
        emit AddressUpdated("lp", _lp);
    }
    function setPool(address _pool) external onlyGov{
        require(pool == GFarmPoolInterfaceV4(0) && _pool != address(0));
        pool = GFarmPoolInterfaceV4(_pool);
        emit AddressUpdated("pool", _pool);
    }    
    function setPriceAggregator(address _aggregator) external onlyGov{
        require(_aggregator != address(0));
        priceAggregator = PriceAggregatorInterfaceV4(_aggregator);
        emit AddressUpdated("priceAggregator", _aggregator);
    }

    // USEFUL TRADING FUNCTIONS

    // Trades % PnL based on price movement (PRECISION)
    function currentPercentProfit(
        uint openPrice,
        uint currentPrice,
        bool buy,
        uint leverage) private view returns(int p){

        p = buy ? (int(currentPrice).sub(int(openPrice))).mul(100*int(PRECISION)).mul(int(leverage)).div(int(openPrice))
            : (int(currentPrice).sub(int(openPrice))).mul(-100*int(PRECISION)).mul(int(leverage)).div(int(openPrice));

        p = p < int(PRECISION).mul(-100) ? int(PRECISION).mul(-100) : p;
        p = p > int(priceAggregator.maxGainP()).mul(int(PRECISION)) ? int(priceAggregator.maxGainP()).mul(int(PRECISION)) : p;
    }

    // Position size token
    function positionSizeToken(
        uint initialTokenPos,
        uint posUsd) private view returns(uint currentPosToken){
        currentPosToken = posUsd.mul(PRECISION).div(tokenPriceUsd());

        // Position size increase % limited
        uint maxNewPos = initialTokenPos.add(initialTokenPos.mul(priceAggregator.maxPosTokenIncreaseP()).div(100));
        currentPosToken = currentPosToken > maxNewPos ? maxNewPos : currentPosToken;
    }

    // Find empty spot to store trade in userTrades[trader][pairIndex][...]
    function firstEmptyUserTradesIndex(address trader, uint pairIndex) private view returns(uint index){
        for(uint i = 0; i < MAX_TRADES_PER_PAIR; i++){
            if(userTrades[trader][pairIndex][i].leverage == 0){
                index = i;
                break;
            }
        }
    }

    // Get position size - gov and dev fees + store the fees
    function handleOpenFees(uint _positionSizeToken) private returns(uint posToken_minusFees, uint posUsd_minusFees){
        uint govFee = _positionSizeToken.mul(priceAggregator.govOpenFeeP()).div(100*PRECISION);
        uint devFee = _positionSizeToken.mul(priceAggregator.devOpenFeeP()).div(100*PRECISION);
        posToken_minusFees = _positionSizeToken.sub(govFee).sub(devFee);
        posUsd_minusFees = posToken_minusFees.mul(tokenPriceUsd()).div(PRECISION);
        govFees = govFees.add(govFee);
        devFees = devFees.add(devFee);
    }

    // After a trade is opened
    function registerTrade(Trade memory trade) private{
        if(trade.buy){
            trade.tp = trade.tp > 0 ? trade.openPrice.add(trade.openPrice.mul(trade.tp).div(trade.leverage).div(PRECISION*100)) : 0;
            trade.sl = trade.sl > 0 ? trade.openPrice.sub(trade.openPrice.mul(trade.sl).div(trade.leverage).div(PRECISION*100)) : 0;
        }else{
            trade.tp = trade.tp > 0 ? trade.openPrice.sub(trade.openPrice.mul(trade.tp).div(trade.leverage).div(PRECISION*100)) : 0;
            trade.sl = trade.sl > 0 ? trade.openPrice.add(trade.openPrice.mul(trade.sl).div(trade.leverage).div(PRECISION*100)) : 0;
        }

        userTrades[trade.trader][trade.pairIndex][trade.userTradesIndex] = trade;
        userTradesCount[trade.trader][trade.pairIndex]++;

        if(userTradesCount[trade.trader][trade.pairIndex] == 1){
            pairTradersId[trade.trader][trade.pairIndex] = pairTraders[trade.pairIndex].length;
            pairTraders[trade.pairIndex].push(trade.trader);
        }

        priceAggregator.increaseOpenInterest(trade.pairIndex, trade.positionSizeToken, trade.leverage);
        traders[trade.trader].leverageUnlocked = traders[trade.trader].leverageUnlocked == 0 ? 100 : 150;
        tradesPerBlock[block.number]++;
    }

    // Unregister trade from mappings & arrays
    function unregisterTrade(
        address trader,
        uint pairIndex,
        uint userTradesIndex) private{
        Trade storage t = userTrades[trader][pairIndex][userTradesIndex];
        uint _pairTradersId = pairTradersId[trader][pairIndex];

        // Reduce open interest
        priceAggregator.decreaseOpenInterest(pairIndex, t.positionSizeToken, t.leverage);

        // Delete from pairTraders array
        if(userTradesCount[trader][pairIndex] == 1){
            address[] storage p = pairTraders[pairIndex];
            p[_pairTradersId] = p[p.length-1];
            pairTradersId[p[_pairTradersId]][pairIndex] = _pairTradersId;
            delete pairTradersId[trader][pairIndex];
            p.pop();
        }

        // Delete from userTrades array (leaves hole => same userTradesIndex)
        delete userTrades[trader][pairIndex][userTradesIndex];
        userTradesCount[trader][pairIndex]--;

        tradesPerBlock[block.number]++;
    }

    // Unregister pending market order
    function unregisterPendingMarketOrder(bool _open, address _trader, uint _pairIndex, uint _order) private{
        uint[] storage orderIds = pendingOrderIds[_trader];
        for(uint i = 0; i < orderIds.length; i++){
            if(orderIds[i] == _order){
                if(_open){ 
                    pendingMarketOpenCount[_trader][_pairIndex]--;
                }else{
                    pendingMarketCloseCount[_trader][_pairIndex]--;
                }

                orderIds[i] = orderIds[orderIds.length-1];
                orderIds.pop();

                break;
            }
        }

        delete reqID_pendingMarketOrder[_order];
    }

    // Unregister limit order
    function unregisterLimitOrder(address _trader, uint _pairIndex) private{
        // Copy last order to deleted order => update id of this limit order
        uint id = userOpenLimitOrderId[_trader][_pairIndex];
        openLimitOrders[id] = openLimitOrders[openLimitOrders.length-1];
        userOpenLimitOrderId[openLimitOrders[id].trader][openLimitOrders[id].pairIndex] = id;

        // Remove
        delete userOpenLimitOrderId[_trader][_pairIndex];
        openLimitOrders.pop();
    }

    // Send tokens to trader and his referral
    // + reward liquidity providers
    function handleTokensBack(
        int _percentProfit,
        address _trader,
        uint _tokensBack,
        uint _amountNftToken,
        uint _lpFee
    ) private{
        pool.increaseAccTokensPerLp(_lpFee);

        if(_tokensBack >= _amountNftToken.add(_lpFee)
        && _percentProfit > int(LIQUIDATION_P*PRECISION).mul(-1)){
            _tokensBack = _tokensBack.sub(_lpFee).sub(_amountNftToken);

            if(traders[_trader].referral == address(0)){
                uint referralBurn = _tokensBack.mul(priceAggregator.referralP()).div(PRECISION*100);

                token.mint(_trader, _tokensBack.sub(referralBurn));
                tokensMinted += _tokensBack - referralBurn;
            }else{
                uint referralTokens = _tokensBack.mul(priceAggregator.referralP()).div(PRECISION*200);
                uint userTokens = _tokensBack.sub(referralTokens);

                token.mint(_trader, userTokens);
                token.mint(traders[_trader].referral, referralTokens);

                Trader storage referralUser = traders[traders[_trader].referral];
                referralUser.referralRewardsTotal += referralTokens;

                tokensMinted += _tokensBack;
            }
        }
    }

    // Get reserves LP (1e18)
    function reservesLp() private view returns(uint, uint){
        (uint112 reserves0, uint112 reserves1, ) = lp.getReserves();
        if(lp.token0() == address(token)){
            return (reserves0, reserves1);
        }else{
            return (reserves1, reserves0);
        }
    }

    // Get Token price in USD (PRECISION)
    function tokenPriceUsd() public view returns(uint){
        (uint reserveToken, uint reserveUsd) = reservesLp();
        return reserveUsd.mul(PRECISION).div(reserveToken);
    }

    // EXTERNAL TRADING FUNCTIONS

    // 0. Modifiers
    modifier notContract(){
        require(tx.origin == msg.sender);
        _;
    }
    modifier onlyPriceAggregator(){
        require(msg.sender == address(priceAggregator));
        _;
    }

    function hasOpenLimitOrder(address _trader, uint _pairIndex) public view returns(bool){
        if(openLimitOrders.length == 0){ return false; }

        uint pendingOrderId = userOpenLimitOrderId[_trader][_pairIndex];
        return openLimitOrders[pendingOrderId].trader == _trader && 
               openLimitOrders[pendingOrderId].pairIndex == _pairIndex;
    }

    // Open a new trade at current pair price
    function openTrade(
        uint _pairIndex,
        bool _buy,
        uint _positionSizeToken, // 1e18
        uint _leverage,
        uint _spreadReductionId, // 1,2,3,4,5 (nft type => 0 = none)
        uint _price,     // PRECISION
        uint _slippageP, // PRECISION
        uint _tpP,       // PRECISION
        uint _slP,       // PRECISION
        bool _limit,
        address _referral
        ) external notContract{

        uint pairTotalOrders = userTradesCount[msg.sender][_pairIndex] + pendingMarketOpenCount[msg.sender][_pairIndex];
        pairTotalOrders = hasOpenLimitOrder(msg.sender, _pairIndex) ? pairTotalOrders + 1 : pairTotalOrders;

        require(tradesPerBlock[block.number] < priceAggregator.maxTradesPerBlock(), "MAX_TRADES_PER_BLOCK");
        require(!priceAggregator.isPaused(), "PAUSED");
        require(priceAggregator.canOpenTrade(_pairIndex, _positionSizeToken, _leverage), "MAX_OPEN_INTEREST");
        require(pairTotalOrders < MAX_TRADES_PER_PAIR, "MAX_TRADES_PER_PAIR");
        require(pendingOrderIds[msg.sender].length < MAX_PENDING_ORDERS, "MAX_PENDING_ORDERS");
        (uint reserveToken, ) = reservesLp();
        require(_positionSizeToken >= priceAggregator.minPosUsd().mul(1e18*PRECISION).div(tokenPriceUsd())
            && _positionSizeToken <= reserveToken.mul(priceAggregator.maxPosTokenP()).div(100*PRECISION),
            "WRONG_POS");
        require(_leverage >= 5 && _leverage <= 150, "WRONG_LEVERAGE");
        require(_leverage <= 50 || _leverage <= traders[msg.sender].leverageUnlocked, "LEVERAGE_NOT_UNLOCKED");
        require(_spreadReductionId == 0 || nft[_spreadReductionId-1].balanceOf(msg.sender) >= 1,
            "NO_CORRESPONDING_NFT_SPREAD_REDUCTION");
        require(_slP < MAX_SL_P*PRECISION, "WRONG_SL");

        if(!_limit){
            uint order = priceAggregator.getPrice(_pairIndex, 0);
            pendingOrderIds[msg.sender].push(order);

            reqID_pendingMarketOrder[order].block = block.number;
            reqID_pendingMarketOrder[order].wantedPrice = _price;
            reqID_pendingMarketOrder[order].slippageP = _slippageP;
            reqID_pendingMarketOrder[order].trade.trader = msg.sender;
            reqID_pendingMarketOrder[order].trade.pairIndex = _pairIndex;
            reqID_pendingMarketOrder[order].trade.buy = _buy;
            reqID_pendingMarketOrder[order].trade.leverage = _leverage;
            reqID_pendingMarketOrder[order].trade.sl = _slP; // percentage pnl
            reqID_pendingMarketOrder[order].trade.tp = _tpP; // percentage pnl
            reqID_pendingMarketOrder[order].trade.spreadReductionP = 
            _spreadReductionId > 0 ? priceAggregator.spreadReductionsP(_spreadReductionId-1) : 0;  
            reqID_pendingMarketOrder[order].trade.positionSizeToken = _positionSizeToken;

            pendingMarketOpenCount[msg.sender][_pairIndex]++;
        }else{
            require(!hasOpenLimitOrder(msg.sender, _pairIndex), "LIMIT_ALREADY_OPEN");
            require(_slippageP >= priceAggregator.minLimitOrderSlippageP(), "SLIPPAGE_TOO_SMALL");

            openLimitOrders.push(OpenLimitOrder(
                msg.sender,
                _pairIndex,
                _positionSizeToken,
                _spreadReductionId > 0 ? priceAggregator.spreadReductionsP(_spreadReductionId-1) : 0,
                _buy,
                _leverage,
                _tpP, // percentage pnl
                _slP, // percentage pnl
                _buy ? _price.sub(_price.mul(_slippageP).div(PRECISION*100)) : _price,
                _buy ? _price : _price.add(_price.mul(_slippageP).div(PRECISION*100)),
                block.number
            ));

            userOpenLimitOrderId[msg.sender][_pairIndex] = openLimitOrders.length-1;

            emit TradeLimitOpened(msg.sender, _pairIndex);
        }

        token.burn(msg.sender, _positionSizeToken);
        tokensBurned += _positionSizeToken;

        if(_referral != address(0) && traders[msg.sender].referral == address(0)
        && _referral != msg.sender){
            traders[msg.sender].referral = _referral;
        }
    }

    function openTradeMarketCallback(
        uint _order,
        uint _price,
        uint _spreadP) external onlyPriceAggregator{
        
        PendingMarketOrder storage o = reqID_pendingMarketOrder[_order];
        if(o.block == 0){ return; }

        uint finalSpreadP = _spreadP.sub(_spreadP.mul(o.trade.spreadReductionP).div(100));

        uint openPrice = o.trade.buy ? _price.add(_price.mul(finalSpreadP).div(100*PRECISION))
                                          : _price.sub(_price.mul(finalSpreadP).div(100*PRECISION));

        uint maxSlippage = o.wantedPrice.mul(o.slippageP).div(100*PRECISION);

        (uint positionSizeToken_minusFees, uint positionSizeUsd_minusFees) = handleOpenFees(o.trade.positionSizeToken);

        if(o.trade.buy && openPrice > o.wantedPrice.add(maxSlippage)
        || !o.trade.buy && openPrice < o.wantedPrice.sub(maxSlippage)){

            token.mint(o.trade.trader, positionSizeToken_minusFees);
            tokensMinted += positionSizeToken_minusFees;

            emit TradeCanceledMarket(
                o.trade.trader,
                o.trade.pairIndex,
                o.wantedPrice,
                o.slippageP,
                openPrice
            );

        }else{
            uint userTradesIndex = firstEmptyUserTradesIndex(o.trade.trader, o.trade.pairIndex);

            registerTrade(Trade(
                o.trade.trader,
                o.trade.pairIndex,
                userTradesIndex,
                positionSizeToken_minusFees,
                positionSizeUsd_minusFees,
                openPrice,
                o.trade.spreadReductionP,
                o.trade.buy,
                o.trade.leverage,
                o.trade.tp,
                o.trade.sl,
                0,
                0
            ));

            emit TradeOpenedMarket(
                o.trade.trader,
                o.trade.pairIndex,
                userTradesIndex,
                o.trade.buy,
                o.trade.leverage,
                openPrice,
                positionSizeToken_minusFees,
                positionSizeUsd_minusFees
            );
        }

        unregisterPendingMarketOrder(true, o.trade.trader, o.trade.pairIndex, _order);
    }

    // Cancel open limit order
    function cancelOpenLimitOrder(uint _pairIndex) external{
        require(hasOpenLimitOrder(msg.sender, _pairIndex), "NO_LIMIT");

        uint id = userOpenLimitOrderId[msg.sender][_pairIndex];
        require(block.number.sub(openLimitOrders[id].block) >= LIMIT_TIMELOCK, "LIMIT_TIMELOCK");

        token.mint(msg.sender, openLimitOrders[id].positionSizeToken);
        tokensMinted += openLimitOrders[id].positionSizeToken;

        unregisterLimitOrder(msg.sender, _pairIndex);

        emit TradeLimitCanceled(msg.sender, _pairIndex);
    }

    // Update stop loss for an open trade
    // Set to 0 to remove
    // If long and sl is above current price => can be closed instantly
    // If short and sl is below current price => can be closed instantly
    // Can be set in profit = stop profit
    // must be above -STOP_LOSS_P profit => if liq at -90% => above -80%
    // otherwise can set at -89% and earn 11% of position size while at -90% liquidation earns 0 to trader
    function updateSl(uint _pairIndex, uint _userTradesIndex, uint _newSl) external notContract{
        Trade storage t = userTrades[msg.sender][_pairIndex][_userTradesIndex];
        require(t.leverage > 0, "NO_TRADE");
        require(_newSl == 0 || t.buy && _newSl > t.openPrice.sub(t.openPrice.mul(MAX_SL_P).div(100*t.leverage)) ||
                !t.buy && _newSl < t.openPrice.add(t.openPrice.mul(MAX_SL_P).div(100*t.leverage)), "SL_TOO_BIG");
        require(block.number.sub(t.slLastUpdated) >= LIMIT_TIMELOCK, "LIMIT_TIMELOCK");
        t.sl = _newSl;
        t.slLastUpdated = block.number;
        emit TpSlUpdated(msg.sender, _pairIndex, _userTradesIndex, false, _newSl);
    }

    // Update take profit for an open trade
    // Set to 0 to remove
    // Can be set in loss (for example exit long on a bounce even if in loss)
    // If long and tp is below current price => can be closed instantly
    // If short and tp is above current price => can be closed instantly
    function updateTp(uint _pairIndex, uint _userTradesIndex, uint _newTp) external notContract{
        Trade storage t = userTrades[msg.sender][_pairIndex][_userTradesIndex];
        require(t.leverage > 0, "NO_TRADE");
        require(block.number.sub(t.tpLastUpdated) >= LIMIT_TIMELOCK, "LIMIT_TIMELOCK");
        t.tp = _newTp;
        t.tpLastUpdated = block.number;
        emit TpSlUpdated(msg.sender, _pairIndex, _userTradesIndex, true, _newTp);
    }

    // Close open trade at current price
    function closeTradeMarket(uint _pairIndex, uint _userTradesIndex) external notContract{
        require(tradesPerBlock[block.number] < priceAggregator.maxTradesPerBlock(), "MAX_TRADES_PER_BLOCK");
        require(pendingMarketCloseCount[msg.sender][_pairIndex] < userTradesCount[msg.sender][_pairIndex],
        "TOO_MANY_CLOSE_REQUESTS");
        require(pendingOrderIds[msg.sender].length < MAX_PENDING_ORDERS, "MAX_PENDING_ORDERS");
        require(userTrades[msg.sender][_pairIndex][_userTradesIndex].leverage > 0, "NO_TRADE");

        uint order = priceAggregator.getPrice(_pairIndex, 1);
        pendingOrderIds[msg.sender].push(order);

        PendingMarketOrder storage o = reqID_pendingMarketOrder[order];
        o.block = block.number;
        o.trade.trader = msg.sender;
        o.trade.pairIndex = _pairIndex;
        o.trade.userTradesIndex = _userTradesIndex;

        pendingMarketCloseCount[msg.sender][_pairIndex]++;
    }

    function closeTradeMarketCallback(
        uint _order,
        uint _price) external onlyPriceAggregator{
        
        PendingMarketOrder storage o = reqID_pendingMarketOrder[_order];
        Trade storage pendingTrade = userTrades[o.trade.trader][o.trade.pairIndex][o.trade.userTradesIndex];

        if(o.block == 0){ return; }

        if(pendingTrade.leverage > 0){
            uint posToken = positionSizeToken(
                pendingTrade.positionSizeToken,
                pendingTrade.positionSizeUsd
            );

            int percentProfit = currentPercentProfit(
                pendingTrade.openPrice,
                _price,
                pendingTrade.buy,
                pendingTrade.leverage
            );

            int pnl = int(posToken).mul(percentProfit).div(int(100*PRECISION));

            handleTokensBack(
                percentProfit,
                pendingTrade.trader,
                pnl >= 0 ? posToken.add(uint(pnl)) : posToken.sub(uint(pnl.mul(-1))),
                0,
                posToken.mul(priceAggregator.lpCloseFeeP()).div(100*PRECISION)
            );

            emit TradeClosedMarket(
                pendingTrade.trader,
                pendingTrade.pairIndex,
                pendingTrade.userTradesIndex,
                _price,
                pendingTrade.buy,
                posToken,
                pendingTrade.leverage,
                pnl,
                tokenPriceUsd()
            );

            unregisterTrade(
                pendingTrade.trader,
                pendingTrade.pairIndex,
                pendingTrade.userTradesIndex
            );
        }
        
        unregisterPendingMarketOrder(false, o.trade.trader, o.trade.pairIndex, _order);
    }

    // Try to execute a TP, SL, Liquidation, or limit long/short (only done by NFT holders)
    // order types: 1 = take profit, 2 = stop loss, 3 = liquidation, 4 = open trade
    // if open trade => _userTradesIndex can be anything (not used)
    function executeNftOrder(uint _orderType, address _a, uint _pairIndex, uint _userTradesIndex, uint _nftId, uint _nftType) external notContract{
        require(_orderType >= 1 && _orderType <= 4, "WRONG_ORDER_TYPE");
        require(_nftType > 0 && _nftType < 6, "WRONG_NFT_TYPE");
        require(msg.sender == govFund || nft[_nftType-1].ownerOf(_nftId) == msg.sender, "NO_NFT");
        require(block.number >= nftLastSuccess[_nftId].add(priceAggregator.nftSuccessTimelock()), "SUCCESS_TIMELOCK");

        linkToken.transferFrom(msg.sender, address(priceAggregator), priceAggregator.nftLinkFee());
        uint order;

        if(_orderType == 4){
            require(hasOpenLimitOrder(_a, _pairIndex), "NO_LIMIT");
            order = priceAggregator.getPrice(_pairIndex, 2);
        }else{
            require(userTrades[_a][_pairIndex][_userTradesIndex].leverage > 0, "NO_TRADE");
            require(_orderType != 1 || userTrades[_a][_pairIndex][_userTradesIndex].tp > 0, "NO_TP");
            require(_orderType != 2 || userTrades[_a][_pairIndex][_userTradesIndex].sl > 0, "NO_SL");
            order = priceAggregator.getPrice(_pairIndex, 3);
        }

        PendingNftOrder storage n = reqID_pendingNftOrder[order];
        n.nftHolder = msg.sender;
        n.nftId =  _nftId; 
        n.trader =  _a; 
        n.pairIndex =  _pairIndex;
        n.userTradesIndex = _userTradesIndex;
        n.orderType = _orderType;
    }

    function executeNftOpenOrderCallback(
        uint _order,
        uint _price,
        uint _spreadP
    ) external onlyPriceAggregator{
        PendingNftOrder storage nftOrder = reqID_pendingNftOrder[_order];
        if(nftOrder.trader == address(0)){ return; }

        if(hasOpenLimitOrder(nftOrder.trader, nftOrder.pairIndex) && !priceAggregator.isPaused()
        && block.number >= nftLastSuccess[nftOrder.nftId].add(priceAggregator.nftSuccessTimelock())){
            OpenLimitOrder storage o = openLimitOrders[userOpenLimitOrderId[nftOrder.trader][nftOrder.pairIndex]];

            if(priceAggregator.canOpenTrade(nftOrder.pairIndex, o.positionSizeToken, o.leverage)){
                uint finalSpreadP = _spreadP.sub(_spreadP.mul(o.spreadReductionP).div(100));
                uint openPrice = o.buy  ? _price.add(_price.mul(finalSpreadP).div(100*PRECISION))
                                        : _price.sub(_price.mul(finalSpreadP).div(100*PRECISION));

                if(openPrice >= o.minPrice && openPrice <= o.maxPrice){
                    uint amountNftToken = o.positionSizeToken.mul(priceAggregator.nftLimitOrderFeeP()).div(100*PRECISION);
                    (uint positionSizeToken_minusFees, uint positionSizeUsd_minusFees) = handleOpenFees(o.positionSizeToken.sub(amountNftToken));
                    uint userTradesIndex = firstEmptyUserTradesIndex(o.trader, o.pairIndex);

                    registerTrade(Trade(
                        o.trader,
                        o.pairIndex,
                        userTradesIndex,
                        positionSizeToken_minusFees,
                        positionSizeUsd_minusFees,
                        openPrice,
                        o.spreadReductionP,
                        o.buy,
                        o.leverage,
                        o.tp,
                        o.sl,
                        0,
                        0
                    ));

                    token.mint(nftOrder.nftHolder, amountNftToken);
                    nftLastSuccess[nftOrder.nftId] = block.number;
                    nftRewards += amountNftToken;

                    emit TradeLimitExecuted(
                        o.trader,
                        o.pairIndex,
                        userTradesIndex,
                        nftOrder.nftHolder,
                        4,
                        openPrice,
                        o.buy,
                        o.leverage,
                        positionSizeToken_minusFees,
                        0,
                        amountNftToken,
                        tokenPriceUsd()
                    );

                    unregisterLimitOrder(o.trader, o.pairIndex);
                }
            }
        }
        delete reqID_pendingNftOrder[_order];
    }

    function executeNftCloseOrderCallback(
        uint _order,
        uint _price) external onlyPriceAggregator{
        
        uint amountNftToken;
        if(reqID_pendingNftOrder[_order].trader == address(0)){ return; }

        Trade storage t = userTrades[reqID_pendingNftOrder[_order].trader][reqID_pendingNftOrder[_order].pairIndex][reqID_pendingNftOrder[_order].userTradesIndex];

        if(t.leverage > 0 && block.number >= nftLastSuccess[reqID_pendingNftOrder[_order].nftId].add(priceAggregator.nftSuccessTimelock())){ 
            int percentProfit = currentPercentProfit(
                t.openPrice,
                _price,
                t.buy,
                t.leverage
            );

            uint posToken = positionSizeToken(t.positionSizeToken, t.positionSizeUsd);

            // TP or SL
            if((reqID_pendingNftOrder[_order].orderType == 1 && t.tp > 0 && t.buy && _price >= t.tp)
            || (reqID_pendingNftOrder[_order].orderType == 1 && t.tp > 0 && !t.buy && _price <= t.tp)
            || (reqID_pendingNftOrder[_order].orderType == 2 && t.sl > 0 && t.buy && _price <= t.sl)
            || (reqID_pendingNftOrder[_order].orderType == 2 && t.sl > 0 && !t.buy && _price >= t.sl)){
               amountNftToken = posToken.mul(priceAggregator.nftLimitOrderFeeP()).div(100*PRECISION);
            }
            
            // Liquidation
            if(reqID_pendingNftOrder[_order].orderType == 3 && percentProfit <= int(LIQUIDATION_P*PRECISION).mul(-1)){
                amountNftToken = posToken.mul(priceAggregator.nftLiqFeeP()).div(100);
            }

            if(amountNftToken > 0){
                int pnl = int(posToken).mul(percentProfit).div(int(100*PRECISION));

                handleTokensBack(
                    percentProfit,
                    t.trader,
                    pnl >= 0 ? posToken.add(uint(pnl)) : posToken.sub(uint(pnl.mul(-1))),
                    amountNftToken,
                    reqID_pendingNftOrder[_order].orderType == 3 ? posToken.mul(priceAggregator.lpLiqFeeP()).div(100)
                    : posToken.mul(priceAggregator.lpCloseFeeP()).div(100*PRECISION)
                );

                emit TradeLimitExecuted(
                    t.trader,
                    t.pairIndex,
                    t.userTradesIndex,
                    reqID_pendingNftOrder[_order].nftHolder,
                    reqID_pendingNftOrder[_order].orderType,
                    _price,
                    t.buy,
                    t.leverage,
                    posToken,
                    pnl,
                    amountNftToken,
                    tokenPriceUsd()
                );

                unregisterTrade(
                    t.trader,
                    t.pairIndex,
                    t.userTradesIndex
                );

                token.mint(reqID_pendingNftOrder[_order].nftHolder, amountNftToken);
                nftLastSuccess[reqID_pendingNftOrder[_order].nftId] = block.number;
                nftRewards += amountNftToken;
            }
        }

        delete reqID_pendingNftOrder[_order];
    }

    // Security functions if market order callback not executed by chainlink nodes after 50 blocks
    function marketOrderCallbackFailed(uint _order) external{
        PendingMarketOrder storage o = reqID_pendingMarketOrder[_order];
        require(o.block > 0 && block.number >= o.block.add(50), "WAIT_50_BLOCKS");
        require(o.trade.trader == msg.sender, "NOT_YOUR_ORDER");

        Trade storage t = userTrades[msg.sender][o.trade.pairIndex][o.trade.userTradesIndex];
        bool openOrder = o.trade.leverage > 0;
        bool tradeOpen = t.leverage > 0;
        uint posToken = openOrder ? o.trade.positionSizeToken : t.positionSizeToken;

        // Close market order
        if(openOrder || tradeOpen){
            if(!openOrder){
                unregisterTrade(
                    msg.sender,
                    o.trade.pairIndex,
                    o.trade.userTradesIndex
                );
            }
            token.mint(msg.sender, posToken);
            tokensMinted += posToken;
        }

        unregisterPendingMarketOrder(openOrder, msg.sender, o.trade.pairIndex, _order);

        emit ChainlinkCallbackFailed();
    }

    // Claim fees
    function claimFees() external onlyGov{
        uint dFees = devFees;
        uint gFees = govFees;
        devFees = 0;
        govFees = 0;
        token.mint(devFund, dFees);
        token.mint(govFund, gFees);
        tokensMinted += dFees + gFees;
    }

    // UI VIEW FUNCTIONS (READ-ONLY)
    function pairTradersArray(uint _pairIndex) external view returns(address[] memory){
        return pairTraders[_pairIndex];
    }
    function openLimitOrdersCount() external view returns(uint){
        return openLimitOrders.length;
    }
    function pendingOrderIdsCount() external view returns(uint){
        return pendingOrderIds[msg.sender].length;
    }
    function reqID_pendingMarketOrder_get(uint order) external view returns(uint,uint,uint,address,uint,uint,uint,uint,bool,uint,uint,uint){
        PendingMarketOrder storage o = reqID_pendingMarketOrder[order];
        return (
            o.block,
            o.wantedPrice,
            o.slippageP,
            o.trade.trader,
            o.trade.pairIndex,
            o.trade.userTradesIndex,
            o.trade.positionSizeToken,
            o.trade.spreadReductionP,
            o.trade.buy,
            o.trade.leverage,
            o.trade.tp,
            o.trade.sl
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_gov","type":"address"},{"internalType":"address","name":"_dev","type":"address"},{"internalType":"contract NftInterfaceV4[5]","name":"_nft","type":"address[5]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"AddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"ChainlinkCallbackFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"tp","type":"bool"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TpSlUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wantedPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"openPrice","type":"uint256"}],"name":"TradeCanceledMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"leverage","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnlToken","type":"int256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceUsd","type":"uint256"}],"name":"TradeClosedMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"TradeLimitCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"leverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnlToken","type":"int256"},{"indexed":false,"internalType":"uint256","name":"rewardToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceUsd","type":"uint256"}],"name":"TradeLimitExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"TradeLimitOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"leverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeUsd","type":"uint256"}],"name":"TradeOpenedMarket","type":"event"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"cancelOpenLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"}],"name":"closeTradeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"closeTradeMarketCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"executeNftCloseOrderCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_spreadP","type":"uint256"}],"name":"executeNftOpenOrderCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderType","type":"uint256"},{"internalType":"address","name":"_a","type":"address"},{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_nftType","type":"uint256"}],"name":"executeNftOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"govFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"govFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trader","type":"address"},{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"hasOpenLimitOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lp","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"marketOrderCallbackFailed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nft","outputs":[{"internalType":"contract NftInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftLastSuccess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"openLimitOrders","outputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"internalType":"uint256","name":"spreadReductionP","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"uint256","name":"block","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openLimitOrdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"bool","name":"_buy","type":"bool"},{"internalType":"uint256","name":"_positionSizeToken","type":"uint256"},{"internalType":"uint256","name":"_leverage","type":"uint256"},{"internalType":"uint256","name":"_spreadReductionId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_slippageP","type":"uint256"},{"internalType":"uint256","name":"_tpP","type":"uint256"},{"internalType":"uint256","name":"_slP","type":"uint256"},{"internalType":"bool","name":"_limit","type":"bool"},{"internalType":"address","name":"_referral","type":"address"}],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_spreadP","type":"uint256"}],"name":"openTradeMarketCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairTraders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"pairTradersArray","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairTradersId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingMarketCloseCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingMarketOpenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingOrderIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOrderIdsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"contract GFarmPoolInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAggregator","outputs":[{"internalType":"contract PriceAggregatorInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"order","type":"uint256"}],"name":"reqID_pendingMarketOrder_get","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reqID_pendingNftOrder","outputs":[{"internalType":"address","name":"nftHolder","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"orderType","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGovFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"setLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"setPriceAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract TokenInterfaceV4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"traders","outputs":[{"internalType":"uint256","name":"leverageUnlocked","type":"uint256"},{"internalType":"address","name":"referral","type":"address"},{"internalType":"uint256","name":"referralRewardsTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradesPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"_newSl","type":"uint256"}],"name":"updateSl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"_newTp","type":"uint256"}],"name":"updateTp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userOpenLimitOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userTrades","outputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"userTradesIndex","type":"uint256"},{"internalType":"uint256","name":"positionSizeToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeUsd","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"uint256","name":"spreadReductionP","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"},{"internalType":"uint256","name":"tpLastUpdated","type":"uint256"},{"internalType":"uint256","name":"slLastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userTradesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162005f7f38038062005f7f833981810160405260e08110156200003757600080fd5b508051602082015190916040016001600160a01b0383166200005857600080fd5b6001600160a01b0382166200006c57600080fd5b80516001600160a01b03166200008157600080fd5b60208101516001600160a01b03166200009957600080fd5b60408101516001600160a01b0316620000b157600080fd5b60608101516001600160a01b0316620000c957600080fd5b60808101516001600160a01b0316620000e157600080fd5b600e80546001600160a01b0319166001600160a01b038516179055606082901b6001600160601b0319166080526200011d600382600562000127565b50505050620001a5565b826005810192821562000172579160200282015b828111156200017257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200013b565b506200018092915062000184565b5090565b5b80821115620001805780546001600160a01b031916815560010162000185565b60805160601c615db7620001c860003980610d25528061328b5250615db76000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806390929bbb11610167578063d174a84d116100ce578063edd67fbe11610087578063edd67fbe1461099f578063f4c2baa9146109c8578063f57e6d2f146109ee578063f9309b2014610a1a578063fa7fffba14610a3d578063fc0c546a14610a81576102a0565b8063d174a84d1461091e578063d294f0931461093b578063d8defd1514610943578063e3cbe3a71461096c578063e7873b581461098f578063ecba583b14610997576102a0565b80639d0214cb116101205780639d0214cb14610840578063a2a3c0cb1461085d578063aa3b7d7714610880578063b7682d541461089d578063bcc9f1d3146108c9578063be73fb99146108f5576102a0565b806390929bbb146106e057806392a88fa2146107035780639620ca4f1461074f578063972182291461078f57806399794d35146107ac5780639c8912f114610814576102a0565b80634415b3691161020b5780635fbfe8cc116101c45780635fbfe8cc146105aa5780636de9f32b146106175780637be9dd731461061f5780637c74f1af14610689578063865f12e8146106af5780638e66f5fb146106b7576102a0565b80634415b369146105055780634437152a146105315780635070e837146105575780635249be251461057d57806352e5398f146105855780635ad9f993146105a2576102a0565b80633078fff51161025d5780633078fff514610460578063313c06a01461046857806332149592146104705780633ba91ea6146104ed57806340b3e5c4146104f55780634390d2a8146104fd576102a0565b80630224e9a7146102a55780630a997a7f146102bf5780630ca958c6146102eb578063144fa6d71461037157806316f0115b14610399578063306868a5146103bd575b600080fd5b6102ad610a89565b60408051918252519081900360200190f35b6102ad600480360360408110156102d557600080fd5b506001600160a01b038135169060200135610a8f565b6103086004803603602081101561030157600080fd5b5035610aac565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e0870152151561010086015261012085015261014084015261016083015251908190036101800190f35b6103976004803603602081101561038757600080fd5b50356001600160a01b0316610b18565b005b6103a1610be5565b604080516001600160a01b039092168252519081900360200190f35b6103ef600480360360608110156103d357600080fd5b506001600160a01b038135169060208101359060400135610bf4565b604080516001600160a01b03909e168e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c0890192909252151560e088015261010087015261012086015261014085015261016084015261018083015251908190036101a00190f35b6103a1610c83565b6103a1610c92565b61048d6004803603602081101561048657600080fd5b5035610ca1565b604080516001600160a01b03909c168c5260208c019a909a528a8a019890985260608a0196909652931515608089015260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b6102ad610d17565b6102ad610d1d565b6103a1610d23565b6102ad6004803603604081101561051b57600080fd5b506001600160a01b038135169060200135610d47565b6103976004803603602081101561054757600080fd5b50356001600160a01b0316610d64565b6103976004803603602081101561056d57600080fd5b50356001600160a01b0316610e30565b6102ad610ef0565b6102ad6004803603602081101561059b57600080fd5b5035610f22565b6102ad610f34565b6105c7600480360360208110156105c057600080fd5b5035610f3a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106035781810151838201526020016105eb565b505050509050019250505060405180910390f35b6102ad610fa6565b610397600480360361016081101561063657600080fd5b50803590602081013515159060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012081013515159061014001356001600160a01b0316610fac565b6103976004803603602081101561069f57600080fd5b50356001600160a01b0316611e5e565b6103a1611f16565b610397600480360360608110156106cd57600080fd5b5080359060208101359060400135611f25565b610397600480360360408110156106f657600080fd5b508035906020013561251d565b6107296004803603602081101561071957600080fd5b50356001600160a01b0316612796565b604080519384526001600160a01b03909216602084015282820152519081900360600190f35b61077b6004803603604081101561076557600080fd5b506001600160a01b0381351690602001356127c0565b604080519115158252519081900360200190f35b610397600480360360208110156107a557600080fd5b5035612855565b6107c9600480360360208110156107c257600080fd5b5035612a5b565b60405180876001600160a01b03168152602001868152602001856001600160a01b03168152602001848152602001838152602001828152602001965050505050505060405180910390f35b6102ad6004803603604081101561082a57600080fd5b506001600160a01b038135169060200135612a9c565b6103a16004803603602081101561085657600080fd5b5035612ab9565b6103976004803603604081101561087357600080fd5b5080359060200135612ad6565b6102ad6004803603602081101561089657600080fd5b5035612de5565b6102ad600480360360408110156108b357600080fd5b506001600160a01b038135169060200135612df7565b6102ad600480360360408110156108df57600080fd5b506001600160a01b038135169060200135612e14565b6103976004803603606081101561090b57600080fd5b5080359060208101359060400135612e42565b6103976004803603602081101561093457600080fd5b5035613044565b610397613219565b6103976004803603606081101561095957600080fd5b508035906020810135906040013561337d565b6103a16004803603604081101561098257600080fd5b50803590602001356134ac565b6102ad6134e1565b6102ad6134e7565b610397600480360360608110156109b557600080fd5b50803590602081013590604001356134fa565b610397600480360360208110156109de57600080fd5b50356001600160a01b031661386d565b6102ad60048036036040811015610a0457600080fd5b506001600160a01b038135169060200135613937565b61039760048036036040811015610a3057600080fd5b5080359060200135613954565b610397600480360360c0811015610a5357600080fd5b508035906001600160a01b036020820135169060408101359060608101359060808101359060a0013561400c565b6103a16146a3565b600c5481565b601160209081526000928352604080842090915290825290205481565b6000908152601760205260409020600d810154600e820154600f83015483546001850154600286015460038701546006880154600789015460088a015460098b0154600a909b0154999b989a97996001600160a01b0390971698959794969395929460ff909216939092565b600e546001600160a01b03163314610b5d576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6002546001600160a01b0316158015610b7e57506001600160a01b03811615155b610b8757600080fd5b600280546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600582820152643a37b5b2b760d91b606083015251600080516020615d178339815191529181900360800190a150565b6000546001600160a01b031681565b60106020528260005260406000206020528160005260406000208160038110610c1957fe5b600d020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01546001600160a01b03909b169e50989c50969a50949893979296919560ff909116949390928d565b6001546001600160a01b031681565b6008546001600160a01b031681565b60198181548110610cae57fe5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01546001600160a01b039099169a5096989597949660ff9094169592949193909290918b565b600d5481565b60195490565b7f000000000000000000000000000000000000000000000000000000000000000081565b601360209081526000928352604080842090915290825290205481565b600e546001600160a01b03163314610da9576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6000546001600160a01b0316158015610dca57506001600160a01b03811615155b610dd357600080fd5b600080546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600482820152631c1bdbdb60e21b606083015251600080516020615d178339815191529181900360800190a150565b600e546001600160a01b03163314610e75576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6001600160a01b038116610e8857600080fd5b600180546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600f828201526e383934b1b2a0b3b3b932b3b0ba37b960891b606083015251600080516020615d178339815191529181900360800190a150565b6000806000610efd6146b2565b9092509050610f1b82610f15836402540be4006147eb565b9061484b565b9250505090565b601b6020526000908152604090205481565b600b5481565b6000818152601a6020908152604091829020805483518184028101840190945280845260609392830182828015610f9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f7c575b50505050509050919050565b600a5481565b323314610fb857600080fd5b600060156000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d81526020019081526020016000205460116000336001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002054019050611035338d6127c0565b61103f5780611044565b806001015b9050600160009054906101000a90046001600160a01b03166001600160a01b031663796d82d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109457600080fd5b505afa1580156110a8573d6000803e3d6000fd5b505050506040513d60208110156110be57600080fd5b5051436000908152601b602052604090205410611119576040805162461bcd60e51b81526020600482015260146024820152734d41585f5452414445535f5045525f424c4f434b60601b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561116757600080fd5b505afa15801561117b573d6000803e3d6000fd5b505050506040513d602081101561119157600080fd5b5051156111ce576040805162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015290519081900360640190fd5b60015460408051630fa5fd3360e21b8152600481018f9052602481018d9052604481018c905290516001600160a01b0390921691633e97f4cc91606480820192602092909190829003018186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d602081101561125257600080fd5b5051611299576040805162461bcd60e51b815260206004820152601160248201527013505617d3d4115397d2539511549154d5607a1b604482015290519081900360640190fd5b600381106112e4576040805162461bcd60e51b815260206004820152601360248201527226a0ac2faa2920a222a9afa822a92fa820a4a960691b604482015290519081900360640190fd5b3360009081526014602052604090205460051161133d576040805162461bcd60e51b81526020600482015260126024820152714d41585f50454e44494e475f4f524445525360701b604482015290519081900360640190fd5b60006113476146b2565b5090506113e8611355610ef0565b610f156402540be400670de0b6b3a764000002600160009054906101000a90046001600160a01b03166001600160a01b0316633707402d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d60208110156113e057600080fd5b5051906147eb565b8b1015801561148657506114826402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b0316633e0947506040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d602081101561147957600080fd5b505184906147eb565b8b11155b6114c3576040805162461bcd60e51b815260206004820152600960248201526857524f4e475f504f5360b81b604482015290519081900360640190fd5b60058a101580156114d5575060968a11155b611517576040805162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4c4556455241474560901b604482015290519081900360640190fd5b60328a1115806115365750336000908152600f60205260409020548a11155b61157f576040805162461bcd60e51b815260206004820152601560248201527413115591549051d157d393d517d5539313d0d2d151605a1b604482015290519081900360640190fd5b88158061161257506001600360018b036005811061159957fe5b0154604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b505110155b61164d5760405162461bcd60e51b8152600401808060200182810382526025815260200180615cb06025913960400191505060405180910390fd5b64ba43b740008510611691576040805162461bcd60e51b815260206004820152600860248201526715d493d391d7d4d360c21b604482015290519081900360640190fd5b836119cf576000600160009054906101000a90046001600160a01b03166001600160a01b0316635cf4ee918f60006040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d602081101561172657600080fd5b8101908080519060200190929190505050905060146000336001600160a01b03166001600160a01b031681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150554360176000838152602001908152602001600020600d01819055508860176000838152602001908152602001600020600e01819055508760176000838152602001908152602001600020600f0181905550336017600083815260200190815260200160002060000160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508d60176000838152602001908152602001600020600001600101819055508c6017600083815260200190815260200160002060000160070160006101000a81548160ff0219169083151502179055508a60176000838152602001908152602001600020600001600801819055508560176000838152602001908152602001600020600001600a018190555086601760008381526020019081526020016000206000016009018190555060008a116118cc576000611948565b600154604080516301ed708560e51b81526000198d01600482015290516001600160a01b0390921691633dae10a091602480820192602092909190829003018186803b15801561191b57600080fd5b505afa15801561192f573d6000803e3d6000fd5b505050506040513d602081101561194557600080fd5b50515b60176000838152602001908152602001600020600001600601819055508b601760008381526020019081526020016000206000016003018190555060156000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f81526020019081526020016000206000815480929190600101919050555050611d65565b6119d9338e6127c0565b15611a20576040805162461bcd60e51b81526020600482015260126024820152712624a6a4aa2fa0a62922a0a22cafa7a822a760711b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316638066b6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6e57600080fd5b505afa158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051871015611ae3576040805162461bcd60e51b815260206004820152601260248201527114d31254141051d157d513d3d7d4d350531360721b604482015290519081900360640190fd5b6019604051806101600160405280336001600160a01b031681526020018f81526020018d815260200160008c11611b1b576000611b97565b600154604080516301ed708560e51b81526000198f01600482015290516001600160a01b0390921691633dae10a091602480820192602092909190829003018186803b158015611b6a57600080fd5b505afa158015611b7e573d6000803e3d6000fd5b505050506040513d6020811015611b9457600080fd5b50515b81526020018e151581526020018c81526020018881526020018781526020018e611bc1578a611bde565b611bde611bd764e8d4a51000610f158e8e6147eb565b8c906148b2565b81526020018e611c0a57611c05611bfe64e8d4a51000610f158e8e6147eb565b8c9061490f565b611c0c565b8a5b81526020014381525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155505060016019805490500360126000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f8152602001908152602001600020819055508c336001600160a01b03167feaaaf7281dc4957604e1a8e78a272fd4e4816b7e6b596da1272759f0d20ff90f60405160405180910390a35b60025460408051632770a7eb60e21b8152336004820152602481018e905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b5050600980548e01905550506001600160a01b03831615801590611e095750336000908152600f60205260409020600101546001600160a01b0316155b8015611e1e57506001600160a01b0383163314155b15611e4f57336000908152600f6020526040902060010180546001600160a01b0319166001600160a01b0385161790555b50505050505050505050505050565b600e546001600160a01b03163314611ea3576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6001600160a01b038116611eb657600080fd5b600e80546001600160a01b0383166001600160a01b031990911681179091556040805160208101929092528082526007828201526619dbdd919d5b9960ca1b606083015251600080516020615d178339815191529181900360800190a150565b600e546001600160a01b031681565b6001546001600160a01b03163314611f3c57600080fd5b600083815260186020526040902060028101546001600160a01b0316611f625750612518565b60028101546003820154611f7f916001600160a01b0316906127c0565b80156120025750600160009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd457600080fd5b505afa158015611fe8573d6000803e3d6000fd5b505050506040513d6020811015611ffe57600080fd5b5051155b8015612099575060015460408051631f1a496960e31b81529051612095926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b15801561204f57600080fd5b505afa158015612063573d6000803e3d6000fd5b505050506040513d602081101561207957600080fd5b505160018301546000908152601c60205260409020549061490f565b4310155b156124d45760028101546001600160a01b03166000908152601260209081526040808320600385015484529091528120546019805490919081106120d957fe5b600091825260209182902060015460038601546002600b90940290920192830154600584015460408051630fa5fd3360e21b8152600481019590955260248501929092526044840152519294506001600160a01b031692633e97f4cc92606480840193829003018186803b15801561215057600080fd5b505afa158015612164573d6000803e3d6000fd5b505050506040513d602081101561217a57600080fd5b5051156124d25760006121a96121a26064610f158560030154886147eb90919063ffffffff16565b85906148b2565b600483015490915060009060ff166121dd576121d86121d164e8d4a51000610f1589866147eb565b87906148b2565b6121fa565b6121fa6121f364e8d4a51000610f1589866147eb565b879061490f565b905082600801548110158015612214575082600901548111155b156124cf576001546040805163151cd11960e21b815290516000926122a49264e8d4a5100092610f15926001600160a01b0316916354734464916004808301926020929190829003018186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b50516002880154906147eb565b90506000806122c86122c38488600201546148b290919063ffffffff16565b614969565b875460018901549294509092506000916122eb916001600160a01b031690614af2565b604080516101a08101825289546001600160a01b0316815260018a01546020820152908101829052606081018590526080810184905260a08101879052600389015460c0820152600489015460ff16151560e08201526005890154610100820152600689015461012082015260078901546101408201526000610160820181905261018082015290915061237e90614b54565b6002548854604080516340c10f1960e01b81526001600160a01b03928316600482015260248101889052905191909216916340c10f1991604480830192600092919082900301818387803b1580156123d557600080fd5b505af11580156123e9573d6000803e3d6000fd5b5050506001808a01546000908152601c60205260408120439055600b8054880190558a54918a01548a546004808d015460058e01546001600160a01b039687169750939592909216937f4997fc0bb946a4e6e79304b9c968707039bef86d736eec4722b4037643ec7c599388938d9260ff90911691908c908e61246a610ef0565b60408051998a5260208a0198909852888801969096529315156060880152608087019290925260a086015260c085015260e084015261010083015251908190036101200190a4865460018801546124ca916001600160a01b031690614f31565b505050505b50505b505b50600083815260186020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101829055600501555b505050565b6001546001600160a01b0316331461253457600080fd5b600082815260176020908152604080832080546001600160a01b031684526010835281842060018201548552909252822060028201549192916003811061257757fe5b600d0201905081600d015460001415612591575050612792565b60088101541561276f5760006125af8260030154836004015461513d565b905060006125d88360050154868560070160009054906101000a900460ff1686600801546151cc565b905060006125f564e8d4a510006125ef8585615338565b906153e1565b84549091506126bc9083906001600160a01b03166000841215612626576126216121d185600019615338565b612630565b612630868561490f565b6001546040805163c5a1688360e01b815290516000926126b79264e8d4a5100092610f15926001600160a01b03169163c5a16883916004808301926020929190829003018186803b15801561268457600080fd5b505afa158015612698573d6000803e3d6000fd5b505050506040513d60208110156126ae57600080fd5b50518b906147eb565b615499565b600184015484546002860154600787015460088801546001600160a01b03909316927f6ce8945d44159181cfc3762a669007398b2fd9dec15e3f3f2756e5db43f1134092918b9160ff90911690899088612714610ef0565b604080519788526020880196909652931515868601526060860192909252608085015260a084015260c0830152519081900360e00190a383546001850154600286015461276b926001600160a01b031691906157d7565b5050505b8154600183015461278f916000916001600160a01b039091169087615ab5565b50505b5050565b600f6020526000908152604090208054600182015460029092015490916001600160a01b03169083565b6019546000906127d25750600061284f565b6001600160a01b0383166000818152601260209081526040808320868452909152902054601980549192918390811061280757fe5b60009182526020909120600b90910201546001600160a01b031614801561284b5750826019828154811061283757fe5b90600052602060002090600b020160010154145b9150505b92915050565b6000818152601760205260409020600d810154158015906128855750600d81015461288190603261490f565b4310155b6128c7576040805162461bcd60e51b815260206004820152600e60248201526d574149545f35305f424c4f434b5360901b604482015290519081900360640190fd5b80546001600160a01b03163314612916576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2faca7aaa92fa7a92222a960911b604482015290519081900360640190fd5b33600090815260106020908152604080832060018501548452909152812060028301546003811061294357fe5b600d0201905060008083600001600801541190506000808360080154119050600082612973578360030154612979565b60038501545b905082806129845750815b15612a1757826129a357600185015460028601546129a39133916157d7565b600254604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b5050600a80548401905550505b612a2a8333876000016001015489615ab5565b6040517ffac3b699d715ff5c4a679632ef0165c940345c58cdc891f65c643528a57143bb90600090a1505050505050565b6018602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b601560209081526000928352604080842090915290825290205481565b60038160058110612ac657fe5b01546001600160a01b0316905081565b323314612ae257600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663796d82d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3057600080fd5b505afa158015612b44573d6000803e3d6000fd5b505050506040513d6020811015612b5a57600080fd5b5051436000908152601b602052604090205410612bb5576040805162461bcd60e51b81526020600482015260146024820152734d41585f5452414445535f5045525f424c4f434b60601b604482015290519081900360640190fd5b3360008181526011602090815260408083208684528252808320549383526016825280832086845290915290205410612c2f576040805162461bcd60e51b8152602060048201526017602482015276544f4f5f4d414e595f434c4f53455f524551554553545360481b604482015290519081900360640190fd5b33600090815260146020526040902054600511612c88576040805162461bcd60e51b81526020600482015260126024820152714d41585f50454e44494e475f4f524445525360701b604482015290519081900360640190fd5b33600090815260106020908152604080832085845290915281208260038110612cad57fe5b600d02016008015411612cf2576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b6001805460408051635cf4ee9160e01b8152600481018690526024810193909352516000926001600160a01b0390921691635cf4ee9191604480830192602092919082900301818787803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050506040513d6020811015612d7357600080fd5b5051336000818152601460209081526040808320805460018181018355918552838520018690559483526017825280832043600d82015580546001600160a01b031916851781558086018990556002019690965591815260168252848120958152949052919092208054909101905550565b601c6020526000908152604090205481565b601660209081526000928352604080842090915290825290205481565b60146020528160005260406000208181548110612e2d57fe5b90600052602060002001600091509150505481565b323314612e4e57600080fd5b33600090815260106020908152604080832086845290915281208360038110612e7357fe5b600d020190506000816008015411612ebd576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b811580612f085750600781015460ff168015612f085750612f05612efa8260080154606402610f15605085600501546147eb90919063ffffffff16565b6005830154906148b2565b82115b80612f525750600781015460ff16158015612f525750612f4f612f448260080154606402610f15605085600501546147eb90919063ffffffff16565b60058301549061490f565b82105b612f90576040805162461bcd60e51b815260206004820152600a602482015269534c5f544f4f5f42494760b01b604482015290519081900360640190fd5b601e612fa982600c0154436148b290919063ffffffff16565b1015612fed576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b600a810182905543600c82015560408051848152600060208201528082018490529051859133917f908a0c7e7b17ef90bcf82c3eb6d116aefc9c1527fe9653587001beb4874493369181900360600190a350505050565b61304e33826127c0565b61308a576040805162461bcd60e51b81526020600482015260086024820152671393d7d31253525560c21b604482015290519081900360640190fd5b33600090815260126020908152604080832084845290915290205460198054601e916130db91849081106130ba57fe5b90600052602060002090600b0201600a0154436148b290919063ffffffff16565b101561311f576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b600254601980546001600160a01b03909216916340c10f199133918590811061314457fe5b90600052602060002090600b0201600201546040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561319c57600080fd5b505af11580156131b0573d6000803e3d6000fd5b50505050601981815481106131c157fe5b600091825260209091206002600b909202010154600a805490910190556131e83383614f31565b604051829033907f79f3edbebc9a6de9a328c00e60f2354f26bac1c27fe608fda2df3a49d9c1988090600090a35050565b600e546001600160a01b0316331461325e576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b600c8054600d805460009384905590839055600254604080516340c10f1960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820186905291519495939491909216926340c10f19926044808201939182900301818387803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b5050600254600e54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561335557600080fd5b505af1158015613369573d6000803e3d6000fd5b5050600a8054939094019092019092555050565b32331461338957600080fd5b336000908152601060209081526040808320868452909152812083600381106133ae57fe5b600d0201905060008160080154116133f8576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b601e61341182600b0154436148b290919063ffffffff16565b1015613455576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b6009810182905543600b82015560408051848152600160208201528082018490529051859133917f908a0c7e7b17ef90bcf82c3eb6d116aefc9c1527fe9653587001beb4874493369181900360600190a350505050565b601a60205281600052604060002081815481106134c557fe5b6000918252602090912001546001600160a01b03169150829050565b60095481565b3360009081526014602052604090205490565b6001546001600160a01b0316331461351157600080fd5b6000838152601760205260409020600d81015461352e5750612518565b60006135596135526064610f158560000160060154876147eb90919063ffffffff16565b84906148b2565b600783015490915060009060ff1661358d5761358861358164e8d4a51000610f1588866147eb565b86906148b2565b6135aa565b6135aa6135a364e8d4a51000610f1588866147eb565b869061490f565b905060006135d56402540be400606402610f1586600f015487600e01546147eb90919063ffffffff16565b90506000806135ea8660000160030154614969565b6007880154919350915060ff1680156136105750600e86015461360d908461490f565b84115b806136385750600786015460ff161580156136385750600e86015461363590846148b2565b84105b1561371b576002548654604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f1991604480830192600092919082900301818387803b15801561369457600080fd5b505af11580156136a8573d6000803e3d6000fd5b5050600a805485019055505085546001870154600e880154600f8901546040805193845260208401929092528282015260608201879052516001600160a01b03909216917fe070f0177a9a4ef1d0e045638177e84b9e643b2dea722cdd65bd6217b7d16e8e9181900360800190a2613846565b8554600187015460009161373a916001600160a01b0390911690614af2565b604080516101a08101825289546001600160a01b0316815260018a01546020820152908101829052606081018590526080810184905260a08101879052600689015460c0820152600789015460ff16151560e082015260088901546101008201526009890154610120820152600a890154610140820152600061016082018190526101808201529091506137cd90614b54565b60018701548754600789015460088a01546040805186815260ff9093161515602084015282810191909152606082018990526080820187905260a08201869052516001600160a01b03909216917f9e94bdd5d609e3ae9924e86c2457237dc7e9a23c6b3f361523c83935f41445e39181900360c00190a3505b8554600187810154613862926001600160a01b0316908c615ab5565b505050505050505050565b600e546001600160a01b031633146138b2576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6008546001600160a01b03161580156138d357506001600160a01b03811615155b6138dc57600080fd5b600880546001600160a01b0383166001600160a01b031990911681179091556040805160208101929092528082526002828201526106c760f41b606083015251600080516020615d178339815191529181900360800190a150565b601260209081526000928352604080842090915290825290205481565b6001546001600160a01b0316331461396b57600080fd5b6000828152601860205260408120600201546001600160a01b03166139905750612792565b600083815260186020818152604080842060028101546001600160a01b03168552601083528185206003808301548752908452918520888652939092526004909101549081106139dc57fe5b600d0201905060008160080154118015613a8c575060015460408051631f1a496960e31b81529051613a88926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b158015613a3757600080fd5b505afa158015613a4b573d6000803e3d6000fd5b505050506040513d6020811015613a6157600080fd5b50516000868152601860209081526040808320600101548352601c9091529020549061490f565b4310155b156124d457600581015460078201546008830154600092613ab4929091879160ff16906151cc565b90506000613aca8360030154846004015461513d565b6000878152601860205260409020600501549091506001148015613af2575060008360090154115b8015613b025750600783015460ff165b8015613b12575082600901548510155b80613b5e57506000868152601860205260409020600501546001148015613b3d575060008360090154115b8015613b4e5750600783015460ff16155b8015613b5e575082600901548511155b80613ba957506000868152601860205260409020600501546002148015613b895750600083600a0154115b8015613b995750600783015460ff165b8015613ba9575082600a01548511155b80613bf557506000868152601860205260409020600501546002148015613bd45750600083600a0154115b8015613be55750600783015460ff16155b8015613bf5575082600a01548510155b15613c5a57613c576402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663547344646040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b93505b6000868152601860205260409020600501546003148015613c8b5750613c8764d18c2e2800600019615338565b8213155b15613ce957613ce66064610f15600160009054906101000a90046001600160a01b03166001600160a01b0316633562a9b16040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b93505b8315613fc3576000613d0464e8d4a510006125ef8486615338565b8454909150613e459084906001600160a01b03166000841215613d3557613d3061358185600019615338565b613d3f565b613d3f858561490f565b60008b8152601860205260409020600501548990600314613def57613dea6402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663c5a168836040518163ffffffff1660e01b815260040160206040518083038186803b158015613db757600080fd5b505afa158015613dcb573d6000803e3d6000fd5b505050506040513d6020811015613de157600080fd5b50518a906147eb565b6126b7565b6126b76064610f15600160009054906101000a90046001600160a01b03166001600160a01b03166332056b976040518163ffffffff1660e01b815260040160206040518083038186803b158015613db757600080fd5b60008781526018602052604090208054600186015486546002880154600590940154600789015460088a01546001600160a01b03958616969495909316937f4997fc0bb946a4e6e79304b9c968707039bef86d736eec4722b4037643ec7c59939092918d9160ff909116908a8a8f613ebb610ef0565b60408051998a5260208a0198909852888801969096529315156060880152608087019290925260a086015260c085015260e084015261010083015251908190036101200190a4835460018501546002860154613f21926001600160a01b031691906157d7565b6002546000888152601860205260408082205481516340c10f1960e01b81526001600160a01b039182166004820152602481018a905291519316926340c10f199260448084019391929182900301818387803b158015613f8057600080fd5b505af1158015613f94573d6000803e3d6000fd5b5050506000888152601860209081526040808320600101548352601c90915290204390555050600b8054850190555b5050506000928352505060186020526040812080546001600160a01b03199081168255600182018390556002820180549091169055600381018290556004810182905560050155565b32331461401857600080fd5b6001861015801561402a575060048611155b61406e576040805162461bcd60e51b815260206004820152601060248201526f57524f4e475f4f524445525f5459504560801b604482015290519081900360640190fd5b60008111801561407e5750600681105b6140c0576040805162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4e46545f5459504560901b604482015290519081900360640190fd5b600e546001600160a01b031633148061416857503360036000198301600581106140e657fe5b0154604080516331a9108f60e11b81526004810186905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b15801561413157600080fd5b505afa158015614145573d6000803e3d6000fd5b505050506040513d602081101561415b57600080fd5b50516001600160a01b0316145b6141a2576040805162461bcd60e51b81526020600482015260066024820152651393d7d3919560d21b604482015290519081900360640190fd5b60015460408051631f1a496960e31b81529051614229926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b1580156141e857600080fd5b505afa1580156141fc573d6000803e3d6000fd5b505050506040513d602081101561421257600080fd5b50516000848152601c60205260409020549061490f565b431015614270576040805162461bcd60e51b815260206004820152601060248201526f535543434553535f54494d454c4f434b60801b604482015290519081900360640190fd5b60015460408051637a5a2d2f60e01b8152905173b0897686c545045afc77cf20ec7a532e3120e0f1926323b872dd9233926001600160a01b03909216918291637a5a2d2f916004808301926020929190829003018186803b1580156142d457600080fd5b505afa1580156142e8573d6000803e3d6000fd5b505050506040513d60208110156142fe57600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526044820152905160648083019260209291908290030181600087803b15801561435657600080fd5b505af115801561436a573d6000803e3d6000fd5b505050506040513d602081101561438057600080fd5b5060009050600487141561445c5761439886866127c0565b6143d4576040805162461bcd60e51b81526020600482015260086024820152671393d7d31253525560c21b604482015290519081900360640190fd5b60015460408051635cf4ee9160e01b8152600481018890526002602482015290516001600160a01b0390921691635cf4ee91916044808201926020929091908290030181600087803b15801561442957600080fd5b505af115801561443d573d6000803e3d6000fd5b505050506040513d602081101561445357600080fd5b5051905061464b565b6001600160a01b03861660009081526010602090815260408083208884529091528120856003811061448a57fe5b600d020160080154116144cf576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b86600114158061451257506001600160a01b03861660009081526010602090815260408083208884529091528120856003811061450857fe5b600d020160090154115b61454b576040805162461bcd60e51b815260206004820152600560248201526404e4f5f54560dc1b604482015290519081900360640190fd5b86600214158061458e57506001600160a01b03861660009081526010602090815260408083208884529091528120856003811061458457fe5b600d0201600a0154115b6145c7576040805162461bcd60e51b81526020600482015260056024820152641393d7d4d360da1b604482015290519081900360640190fd5b60015460408051635cf4ee9160e01b8152600481018890526003602482015290516001600160a01b0390921691635cf4ee91916044808201926020929091908290030181600087803b15801561461c57600080fd5b505af1158015614630573d6000803e3d6000fd5b505050506040513d602081101561464657600080fd5b505190505b60009081526018602052604090208054336001600160a01b031991821617825560018201939093556002810180549093166001600160a01b039690961695909517909155506003830191909155600482015560050155565b6002546001600160a01b031681565b600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470657600080fd5b505afa15801561471a573d6000803e3d6000fd5b505050506040513d606081101561473057600080fd5b50805160209182015160025460085460408051630dfe168160e01b815290519497509295506001600160a01b0391821694911692630dfe1681926004808201939291829003018186803b15801561478657600080fd5b505afa15801561479a573d6000803e3d6000fd5b505050506040513d60208110156147b057600080fd5b50516001600160a01b031614156147d6576001600160701b0391821693501690506147e7565b6001600160701b0390811693501690505b9091565b6000826147fa5750600061284f565b8282028284828161480757fe5b04146148445760405162461bcd60e51b8152600401808060200182810382526021815260200180615cf66021913960400191505060405180910390fd5b9392505050565b60008082116148a1576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816148aa57fe5b049392505050565b600082821115614909576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015614844576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006149fe6402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663efb533376040518163ffffffff1660e01b815260040160206040518083038186803b1580156149cb57600080fd5b505afa1580156149df573d6000803e3d6000fd5b505050506040513d60208110156149f557600080fd5b505187906147eb565b90506000614a926402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b0316637dfcb8c76040518163ffffffff1660e01b815260040160206040518083038186803b158015614a5f57600080fd5b505afa158015614a73573d6000803e3d6000fd5b505050506040513d6020811015614a8957600080fd5b505188906147eb565b9050614aa881614aa287856148b2565b906148b2565b9350614ac56402540be400610f15614abe610ef0565b87906147eb565b600d54909350614ad5908361490f565b600d55600c54614ae5908261490f565b600c819055505050915091565b6000805b6003811015614b4d576001600160a01b038416600090815260106020908152604080832086845290915290208160038110614b2d57fe5b600d02016008015460001415614b4557809150614b4d565b600101614af6565b5092915050565b8060e0015115614c1257600081610120015111614b72576000614bb1565b614bb1614ba66402540be400606402610f15846101000151610f158661012001518760a001516147eb90919063ffffffff16565b60a08301519061490f565b610120820152610140810151614bc8576000614c07565b614c07614bfc6402540be400606402610f15846101000151610f158661014001518760a001516147eb90919063ffffffff16565b60a0830151906148b2565b610140820152614cac565b600081610120015111614c26576000614c5a565b614c5a614bfc6402540be400606402610f15846101000151610f158661012001518760a001516147eb90919063ffffffff16565b610120820152610140810151614c71576000614ca5565b614ca5614ba66402540be400606402610f15846101000151610f158661014001518760a001516147eb90919063ffffffff16565b6101408201525b80516001600160a01b03166000908152601060209081526040808320828501518452909152908190209082015182919060038110614ce657fe5b8251600d919091029190910180546001600160a01b0319166001600160a01b039283161781556020808401516001808401919091556040808601516002850155606086015160038501556080860151600485015560a0860151600585015560c0860151600685015560e086015160078501805460ff191691151591909117905561010086015160088501556101208601516009850155610140860151600a850155610160860151600b85015561018090950151600c9093019290925584518316600090815260118083528582208784018051845290845286832080548601905587519095168252825284812093518152929052919020541415614e4f57602081810180516000908152601a80845260408083205486516001600160a01b039081168552601387528285208651865287528285209190915593518352908452812084518154600181018355918352939091200180546001600160a01b031916929091169190911790555b6001546020820151606083015161010084015160408051631aa22acd60e11b8152600481019490945260248401929092526044830152516001600160a01b0390921691633544559a9160648082019260009290919082900301818387803b158015614eb957600080fd5b505af1158015614ecd573d6000803e3d6000fd5b505082516001600160a01b03166000908152600f6020526040902054159150614ef99050576096614efc565b60645b90516001600160a01b03166000908152600f6020908152604080832060ff909416909355438252601b90522080546001019055565b6001600160a01b0382166000908152601260209081526040808320848452909152902054601980546000198101908110614f6757fe5b90600052602060002090600b020160198281548110614f8257fe5b6000918252602082208354600b9092020180546001600160a01b0319166001600160a01b03909216919091178155600180840154908201556002808401549082015560038084015490820155600480840154908201805460ff909216151560ff199092169190911790556005808401549082015560068084015490820155600780840154908201556008808401549082015560098084015490820155600a9283015492019190915560198054839260129290918490811061503f57fe5b60009182526020808320600b909202909101546001600160a01b031683528201929092526040018120601980549192918590811061507957fe5b600091825260208083206001600b90930201919091015483528281019390935260409182018120939093556001600160a01b03861683526012825280832085845290915281205560198054806150cb57fe5b600082815260208120600b6000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101805460ff191690556005810182905560068101829055600781018290556008810182905560098101829055600a01559055505050565b600061515961514a610ef0565b610f15846402540be4006147eb565b905060006151bd6151b66064610f15600160009054906101000a90046001600160a01b03166001600160a01b0316635faef0066040518163ffffffff1660e01b815260040160206040518083038186803b158015614a5f57600080fd5b859061490f565b9050808211614844578161284b565b6000826151f8576151f3856125ef846151ed64e8d4a50fff19818a86615c4a565b90615338565b615211565b615211856125ef846151ed64e8d4a51000818a86615c4a565b90506152246402540be400606319615338565b81126152305780615241565b6152416402540be400606319615338565b90506152cc6402540be400600160009054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561529a57600080fd5b505afa1580156152ae573d6000803e3d6000fd5b505050506040513d60208110156152c457600080fd5b505190615338565b81136152d8578061532f565b61532f6402540be400600160009054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561529a57600080fd5b95945050505050565b6000826153475750600061284f565b8260001914801561535b5750600160ff1b82145b156153975760405162461bcd60e51b8152600401808060200182810382526027815260200180615d376027913960400191505060405180910390fd5b828202828482816153a457fe5b05146148445760405162461bcd60e51b8152600401808060200182810382526027815260200180615d376027913960400191505060405180910390fd5b600081615435576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b816000191480156154495750600160ff1b83145b156154855760405162461bcd60e51b8152600401808060200182810382526021815260200180615cd56021913960400191505060405180910390fd5b600082848161549057fe5b05949350505050565b6000805460408051633104b73f60e21b81526004810185905290516001600160a01b039092169263c412dcfc9260248084019382900301818387803b1580156154e157600080fd5b505af11580156154f5573d6000803e3d6000fd5b5050505061550c818361490f90919063ffffffff16565b831015801561552a575061552764d18c2e2800600019615338565b85135b156157d05761553d82614aa285846148b2565b6001600160a01b038581166000908152600f602052604090206001015491945016615646576001546040805163846fe25560e01b815290516000926155b69264e8d4a5100092610f15926001600160a01b03169163846fe255916004808301926020929190829003018186803b1580156149cb57600080fd5b6002549091506001600160a01b03166340c10f19866155d587856148b2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561561b57600080fd5b505af115801561562f573d6000803e3d6000fd5b5050600a8054938703909301909255506157d09050565b6001546040805163846fe25560e01b8152905160009261569b926501d1a94a200092610f15926001600160a01b03169163846fe255916004808301926020929190829003018186803b1580156149cb57600080fd5b905060006156a985836148b2565b600254604080516340c10f1960e01b81526001600160a01b038a811660048301526024820185905291519394509116916340c10f199160448082019260009290919082900301818387803b15801561570057600080fd5b505af1158015615714573d6000803e3d6000fd5b50506002546001600160a01b038981166000908152600f60205260408082206001015481516340c10f1960e01b815290841660048201526024810189905290519290931694506340c10f19935060448084019391929182900301818387803b15801561577f57600080fd5b505af1158015615793573d6000803e3d6000fd5b5050506001600160a01b038088166000908152600f60205260408082206001015490921681522060020180549093019092555050600a8054840190555b5050505050565b6001600160a01b03831660009081526010602090815260408083208584529091528120826003811061580557fe5b6001600160a01b03868116600090815260136020908152604080832089845290915280822054600154600d959095029590950160038101546008820154835162b4e89160e21b8152600481018c905260248101929092526044820152915190965093909216926302d3a24492606480820193929182900301818387803b15801561588e57600080fd5b505af11580156158a2573d6000803e3d6000fd5b505050506001600160a01b0385166000908152601160209081526040808320878452909152902054600114156159d5576000848152601a602052604090208054819060001981019081106158f257fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061591c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816013600083858154811061595b57fe5b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182208a83528152828220949094559189168252601383528082208883529092529081205580548190806159b157fe5b600082815260209020810160001990810180546001600160a01b0319169055019055505b6001600160a01b038516600090815260106020908152604080832087845290915290208360038110615a0357fe5b600d020180546001600160a01b031916815560006001808301829055600283018290556003830182905560048301829055600583018290556006830182905560078301805460ff191690556008830182905560098301829055600a8301829055600b8301829055600c9092018190556001600160a01b039690961686526011602090815260408088209688529581528587208054600019019055438752601b9052939094208054909301909255505050565b6001600160a01b0383166000908152601460205260408120905b8154811015615bbc5782828281548110615ae557fe5b90600052602060002001541415615bb4578515615b2c576001600160a01b038516600090815260156020908152604080832087845290915290208054600019019055615b58565b6001600160a01b0385166000908152601660209081526040808320878452909152902080546000190190555b815482906000198101908110615b6a57fe5b9060005260206000200154828281548110615b8157fe5b906000526020600020018190555081805480615b9957fe5b60019003818190600052602060002001600090559055615bbc565b600101615acf565b5050600090815260176020526040812080546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006810182905560078101805460ff191690556008810182905560098101829055600a8101829055600b8101829055600c8101829055600d8101829055600e8101829055600f0155505050565b6000818303818312801590615c5f5750838113155b80615c745750600083128015615c7457508381135b6148445760405162461bcd60e51b8152600401808060200182810382526024815260200180615d5e6024913960400191505060405180910390fdfe4e4f5f434f52524553504f4e44494e475f4e46545f5350524541445f524544554354494f4e5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77943e9d45a11aaae5d87503e3bc248665d9807856e5cf2bdb4a988bee444227815369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220eaa69de5a7d1367e8078de9fd21c3d22bd29e1d8590bab2970827c5ec47ae6ac64736f6c634300060c0033000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d000000000000000000000000f9a4c522e327935bd1f5a338c121e14e4cc1f89800000000000000000000000077cd42b925e1a82f41d852d6be727cfc88fddbbc0000000000000000000000003378ad81d09de23725ee9b9270635c97ed60192100000000000000000000000002e2c5825c1a3b69c0417706dbe1327c2af3e6c20000000000000000000000002d266a94469d05c9e06d52a4d0d9c23b157767c2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806390929bbb11610167578063d174a84d116100ce578063edd67fbe11610087578063edd67fbe1461099f578063f4c2baa9146109c8578063f57e6d2f146109ee578063f9309b2014610a1a578063fa7fffba14610a3d578063fc0c546a14610a81576102a0565b8063d174a84d1461091e578063d294f0931461093b578063d8defd1514610943578063e3cbe3a71461096c578063e7873b581461098f578063ecba583b14610997576102a0565b80639d0214cb116101205780639d0214cb14610840578063a2a3c0cb1461085d578063aa3b7d7714610880578063b7682d541461089d578063bcc9f1d3146108c9578063be73fb99146108f5576102a0565b806390929bbb146106e057806392a88fa2146107035780639620ca4f1461074f578063972182291461078f57806399794d35146107ac5780639c8912f114610814576102a0565b80634415b3691161020b5780635fbfe8cc116101c45780635fbfe8cc146105aa5780636de9f32b146106175780637be9dd731461061f5780637c74f1af14610689578063865f12e8146106af5780638e66f5fb146106b7576102a0565b80634415b369146105055780634437152a146105315780635070e837146105575780635249be251461057d57806352e5398f146105855780635ad9f993146105a2576102a0565b80633078fff51161025d5780633078fff514610460578063313c06a01461046857806332149592146104705780633ba91ea6146104ed57806340b3e5c4146104f55780634390d2a8146104fd576102a0565b80630224e9a7146102a55780630a997a7f146102bf5780630ca958c6146102eb578063144fa6d71461037157806316f0115b14610399578063306868a5146103bd575b600080fd5b6102ad610a89565b60408051918252519081900360200190f35b6102ad600480360360408110156102d557600080fd5b506001600160a01b038135169060200135610a8f565b6103086004803603602081101561030157600080fd5b5035610aac565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e0870152151561010086015261012085015261014084015261016083015251908190036101800190f35b6103976004803603602081101561038757600080fd5b50356001600160a01b0316610b18565b005b6103a1610be5565b604080516001600160a01b039092168252519081900360200190f35b6103ef600480360360608110156103d357600080fd5b506001600160a01b038135169060208101359060400135610bf4565b604080516001600160a01b03909e168e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c0890192909252151560e088015261010087015261012086015261014085015261016084015261018083015251908190036101a00190f35b6103a1610c83565b6103a1610c92565b61048d6004803603602081101561048657600080fd5b5035610ca1565b604080516001600160a01b03909c168c5260208c019a909a528a8a019890985260608a0196909652931515608089015260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b6102ad610d17565b6102ad610d1d565b6103a1610d23565b6102ad6004803603604081101561051b57600080fd5b506001600160a01b038135169060200135610d47565b6103976004803603602081101561054757600080fd5b50356001600160a01b0316610d64565b6103976004803603602081101561056d57600080fd5b50356001600160a01b0316610e30565b6102ad610ef0565b6102ad6004803603602081101561059b57600080fd5b5035610f22565b6102ad610f34565b6105c7600480360360208110156105c057600080fd5b5035610f3a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106035781810151838201526020016105eb565b505050509050019250505060405180910390f35b6102ad610fa6565b610397600480360361016081101561063657600080fd5b50803590602081013515159060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012081013515159061014001356001600160a01b0316610fac565b6103976004803603602081101561069f57600080fd5b50356001600160a01b0316611e5e565b6103a1611f16565b610397600480360360608110156106cd57600080fd5b5080359060208101359060400135611f25565b610397600480360360408110156106f657600080fd5b508035906020013561251d565b6107296004803603602081101561071957600080fd5b50356001600160a01b0316612796565b604080519384526001600160a01b03909216602084015282820152519081900360600190f35b61077b6004803603604081101561076557600080fd5b506001600160a01b0381351690602001356127c0565b604080519115158252519081900360200190f35b610397600480360360208110156107a557600080fd5b5035612855565b6107c9600480360360208110156107c257600080fd5b5035612a5b565b60405180876001600160a01b03168152602001868152602001856001600160a01b03168152602001848152602001838152602001828152602001965050505050505060405180910390f35b6102ad6004803603604081101561082a57600080fd5b506001600160a01b038135169060200135612a9c565b6103a16004803603602081101561085657600080fd5b5035612ab9565b6103976004803603604081101561087357600080fd5b5080359060200135612ad6565b6102ad6004803603602081101561089657600080fd5b5035612de5565b6102ad600480360360408110156108b357600080fd5b506001600160a01b038135169060200135612df7565b6102ad600480360360408110156108df57600080fd5b506001600160a01b038135169060200135612e14565b6103976004803603606081101561090b57600080fd5b5080359060208101359060400135612e42565b6103976004803603602081101561093457600080fd5b5035613044565b610397613219565b6103976004803603606081101561095957600080fd5b508035906020810135906040013561337d565b6103a16004803603604081101561098257600080fd5b50803590602001356134ac565b6102ad6134e1565b6102ad6134e7565b610397600480360360608110156109b557600080fd5b50803590602081013590604001356134fa565b610397600480360360208110156109de57600080fd5b50356001600160a01b031661386d565b6102ad60048036036040811015610a0457600080fd5b506001600160a01b038135169060200135613937565b61039760048036036040811015610a3057600080fd5b5080359060200135613954565b610397600480360360c0811015610a5357600080fd5b508035906001600160a01b036020820135169060408101359060608101359060808101359060a0013561400c565b6103a16146a3565b600c5481565b601160209081526000928352604080842090915290825290205481565b6000908152601760205260409020600d810154600e820154600f83015483546001850154600286015460038701546006880154600789015460088a015460098b0154600a909b0154999b989a97996001600160a01b0390971698959794969395929460ff909216939092565b600e546001600160a01b03163314610b5d576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6002546001600160a01b0316158015610b7e57506001600160a01b03811615155b610b8757600080fd5b600280546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600582820152643a37b5b2b760d91b606083015251600080516020615d178339815191529181900360800190a150565b6000546001600160a01b031681565b60106020528260005260406000206020528160005260406000208160038110610c1957fe5b600d020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01546001600160a01b03909b169e50989c50969a50949893979296919560ff909116949390928d565b6001546001600160a01b031681565b6008546001600160a01b031681565b60198181548110610cae57fe5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01546001600160a01b039099169a5096989597949660ff9094169592949193909290918b565b600d5481565b60195490565b7f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d81565b601360209081526000928352604080842090915290825290205481565b600e546001600160a01b03163314610da9576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6000546001600160a01b0316158015610dca57506001600160a01b03811615155b610dd357600080fd5b600080546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600482820152631c1bdbdb60e21b606083015251600080516020615d178339815191529181900360800190a150565b600e546001600160a01b03163314610e75576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6001600160a01b038116610e8857600080fd5b600180546001600160a01b0383166001600160a01b03199091168117909155604080516020810192909252808252600f828201526e383934b1b2a0b3b3b932b3b0ba37b960891b606083015251600080516020615d178339815191529181900360800190a150565b6000806000610efd6146b2565b9092509050610f1b82610f15836402540be4006147eb565b9061484b565b9250505090565b601b6020526000908152604090205481565b600b5481565b6000818152601a6020908152604091829020805483518184028101840190945280845260609392830182828015610f9a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f7c575b50505050509050919050565b600a5481565b323314610fb857600080fd5b600060156000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d81526020019081526020016000205460116000336001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002054019050611035338d6127c0565b61103f5780611044565b806001015b9050600160009054906101000a90046001600160a01b03166001600160a01b031663796d82d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561109457600080fd5b505afa1580156110a8573d6000803e3d6000fd5b505050506040513d60208110156110be57600080fd5b5051436000908152601b602052604090205410611119576040805162461bcd60e51b81526020600482015260146024820152734d41585f5452414445535f5045525f424c4f434b60601b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561116757600080fd5b505afa15801561117b573d6000803e3d6000fd5b505050506040513d602081101561119157600080fd5b5051156111ce576040805162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015290519081900360640190fd5b60015460408051630fa5fd3360e21b8152600481018f9052602481018d9052604481018c905290516001600160a01b0390921691633e97f4cc91606480820192602092909190829003018186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d602081101561125257600080fd5b5051611299576040805162461bcd60e51b815260206004820152601160248201527013505617d3d4115397d2539511549154d5607a1b604482015290519081900360640190fd5b600381106112e4576040805162461bcd60e51b815260206004820152601360248201527226a0ac2faa2920a222a9afa822a92fa820a4a960691b604482015290519081900360640190fd5b3360009081526014602052604090205460051161133d576040805162461bcd60e51b81526020600482015260126024820152714d41585f50454e44494e475f4f524445525360701b604482015290519081900360640190fd5b60006113476146b2565b5090506113e8611355610ef0565b610f156402540be400670de0b6b3a764000002600160009054906101000a90046001600160a01b03166001600160a01b0316633707402d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d60208110156113e057600080fd5b5051906147eb565b8b1015801561148657506114826402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b0316633e0947506040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d602081101561147957600080fd5b505184906147eb565b8b11155b6114c3576040805162461bcd60e51b815260206004820152600960248201526857524f4e475f504f5360b81b604482015290519081900360640190fd5b60058a101580156114d5575060968a11155b611517576040805162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4c4556455241474560901b604482015290519081900360640190fd5b60328a1115806115365750336000908152600f60205260409020548a11155b61157f576040805162461bcd60e51b815260206004820152601560248201527413115591549051d157d393d517d5539313d0d2d151605a1b604482015290519081900360640190fd5b88158061161257506001600360018b036005811061159957fe5b0154604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b505110155b61164d5760405162461bcd60e51b8152600401808060200182810382526025815260200180615cb06025913960400191505060405180910390fd5b64ba43b740008510611691576040805162461bcd60e51b815260206004820152600860248201526715d493d391d7d4d360c21b604482015290519081900360640190fd5b836119cf576000600160009054906101000a90046001600160a01b03166001600160a01b0316635cf4ee918f60006040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d602081101561172657600080fd5b8101908080519060200190929190505050905060146000336001600160a01b03166001600160a01b031681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150554360176000838152602001908152602001600020600d01819055508860176000838152602001908152602001600020600e01819055508760176000838152602001908152602001600020600f0181905550336017600083815260200190815260200160002060000160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508d60176000838152602001908152602001600020600001600101819055508c6017600083815260200190815260200160002060000160070160006101000a81548160ff0219169083151502179055508a60176000838152602001908152602001600020600001600801819055508560176000838152602001908152602001600020600001600a018190555086601760008381526020019081526020016000206000016009018190555060008a116118cc576000611948565b600154604080516301ed708560e51b81526000198d01600482015290516001600160a01b0390921691633dae10a091602480820192602092909190829003018186803b15801561191b57600080fd5b505afa15801561192f573d6000803e3d6000fd5b505050506040513d602081101561194557600080fd5b50515b60176000838152602001908152602001600020600001600601819055508b601760008381526020019081526020016000206000016003018190555060156000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f81526020019081526020016000206000815480929190600101919050555050611d65565b6119d9338e6127c0565b15611a20576040805162461bcd60e51b81526020600482015260126024820152712624a6a4aa2fa0a62922a0a22cafa7a822a760711b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316638066b6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6e57600080fd5b505afa158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051871015611ae3576040805162461bcd60e51b815260206004820152601260248201527114d31254141051d157d513d3d7d4d350531360721b604482015290519081900360640190fd5b6019604051806101600160405280336001600160a01b031681526020018f81526020018d815260200160008c11611b1b576000611b97565b600154604080516301ed708560e51b81526000198f01600482015290516001600160a01b0390921691633dae10a091602480820192602092909190829003018186803b158015611b6a57600080fd5b505afa158015611b7e573d6000803e3d6000fd5b505050506040513d6020811015611b9457600080fd5b50515b81526020018e151581526020018c81526020018881526020018781526020018e611bc1578a611bde565b611bde611bd764e8d4a51000610f158e8e6147eb565b8c906148b2565b81526020018e611c0a57611c05611bfe64e8d4a51000610f158e8e6147eb565b8c9061490f565b611c0c565b8a5b81526020014381525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155505060016019805490500360126000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f8152602001908152602001600020819055508c336001600160a01b03167feaaaf7281dc4957604e1a8e78a272fd4e4816b7e6b596da1272759f0d20ff90f60405160405180910390a35b60025460408051632770a7eb60e21b8152336004820152602481018e905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b5050600980548e01905550506001600160a01b03831615801590611e095750336000908152600f60205260409020600101546001600160a01b0316155b8015611e1e57506001600160a01b0383163314155b15611e4f57336000908152600f6020526040902060010180546001600160a01b0319166001600160a01b0385161790555b50505050505050505050505050565b600e546001600160a01b03163314611ea3576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6001600160a01b038116611eb657600080fd5b600e80546001600160a01b0383166001600160a01b031990911681179091556040805160208101929092528082526007828201526619dbdd919d5b9960ca1b606083015251600080516020615d178339815191529181900360800190a150565b600e546001600160a01b031681565b6001546001600160a01b03163314611f3c57600080fd5b600083815260186020526040902060028101546001600160a01b0316611f625750612518565b60028101546003820154611f7f916001600160a01b0316906127c0565b80156120025750600160009054906101000a90046001600160a01b03166001600160a01b031663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd457600080fd5b505afa158015611fe8573d6000803e3d6000fd5b505050506040513d6020811015611ffe57600080fd5b5051155b8015612099575060015460408051631f1a496960e31b81529051612095926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b15801561204f57600080fd5b505afa158015612063573d6000803e3d6000fd5b505050506040513d602081101561207957600080fd5b505160018301546000908152601c60205260409020549061490f565b4310155b156124d45760028101546001600160a01b03166000908152601260209081526040808320600385015484529091528120546019805490919081106120d957fe5b600091825260209182902060015460038601546002600b90940290920192830154600584015460408051630fa5fd3360e21b8152600481019590955260248501929092526044840152519294506001600160a01b031692633e97f4cc92606480840193829003018186803b15801561215057600080fd5b505afa158015612164573d6000803e3d6000fd5b505050506040513d602081101561217a57600080fd5b5051156124d25760006121a96121a26064610f158560030154886147eb90919063ffffffff16565b85906148b2565b600483015490915060009060ff166121dd576121d86121d164e8d4a51000610f1589866147eb565b87906148b2565b6121fa565b6121fa6121f364e8d4a51000610f1589866147eb565b879061490f565b905082600801548110158015612214575082600901548111155b156124cf576001546040805163151cd11960e21b815290516000926122a49264e8d4a5100092610f15926001600160a01b0316916354734464916004808301926020929190829003018186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b50516002880154906147eb565b90506000806122c86122c38488600201546148b290919063ffffffff16565b614969565b875460018901549294509092506000916122eb916001600160a01b031690614af2565b604080516101a08101825289546001600160a01b0316815260018a01546020820152908101829052606081018590526080810184905260a08101879052600389015460c0820152600489015460ff16151560e08201526005890154610100820152600689015461012082015260078901546101408201526000610160820181905261018082015290915061237e90614b54565b6002548854604080516340c10f1960e01b81526001600160a01b03928316600482015260248101889052905191909216916340c10f1991604480830192600092919082900301818387803b1580156123d557600080fd5b505af11580156123e9573d6000803e3d6000fd5b5050506001808a01546000908152601c60205260408120439055600b8054880190558a54918a01548a546004808d015460058e01546001600160a01b039687169750939592909216937f4997fc0bb946a4e6e79304b9c968707039bef86d736eec4722b4037643ec7c599388938d9260ff90911691908c908e61246a610ef0565b60408051998a5260208a0198909852888801969096529315156060880152608087019290925260a086015260c085015260e084015261010083015251908190036101200190a4865460018801546124ca916001600160a01b031690614f31565b505050505b50505b505b50600083815260186020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101829055600501555b505050565b6001546001600160a01b0316331461253457600080fd5b600082815260176020908152604080832080546001600160a01b031684526010835281842060018201548552909252822060028201549192916003811061257757fe5b600d0201905081600d015460001415612591575050612792565b60088101541561276f5760006125af8260030154836004015461513d565b905060006125d88360050154868560070160009054906101000a900460ff1686600801546151cc565b905060006125f564e8d4a510006125ef8585615338565b906153e1565b84549091506126bc9083906001600160a01b03166000841215612626576126216121d185600019615338565b612630565b612630868561490f565b6001546040805163c5a1688360e01b815290516000926126b79264e8d4a5100092610f15926001600160a01b03169163c5a16883916004808301926020929190829003018186803b15801561268457600080fd5b505afa158015612698573d6000803e3d6000fd5b505050506040513d60208110156126ae57600080fd5b50518b906147eb565b615499565b600184015484546002860154600787015460088801546001600160a01b03909316927f6ce8945d44159181cfc3762a669007398b2fd9dec15e3f3f2756e5db43f1134092918b9160ff90911690899088612714610ef0565b604080519788526020880196909652931515868601526060860192909252608085015260a084015260c0830152519081900360e00190a383546001850154600286015461276b926001600160a01b031691906157d7565b5050505b8154600183015461278f916000916001600160a01b039091169087615ab5565b50505b5050565b600f6020526000908152604090208054600182015460029092015490916001600160a01b03169083565b6019546000906127d25750600061284f565b6001600160a01b0383166000818152601260209081526040808320868452909152902054601980549192918390811061280757fe5b60009182526020909120600b90910201546001600160a01b031614801561284b5750826019828154811061283757fe5b90600052602060002090600b020160010154145b9150505b92915050565b6000818152601760205260409020600d810154158015906128855750600d81015461288190603261490f565b4310155b6128c7576040805162461bcd60e51b815260206004820152600e60248201526d574149545f35305f424c4f434b5360901b604482015290519081900360640190fd5b80546001600160a01b03163314612916576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2faca7aaa92fa7a92222a960911b604482015290519081900360640190fd5b33600090815260106020908152604080832060018501548452909152812060028301546003811061294357fe5b600d0201905060008083600001600801541190506000808360080154119050600082612973578360030154612979565b60038501545b905082806129845750815b15612a1757826129a357600185015460028601546129a39133916157d7565b600254604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b5050600a80548401905550505b612a2a8333876000016001015489615ab5565b6040517ffac3b699d715ff5c4a679632ef0165c940345c58cdc891f65c643528a57143bb90600090a1505050505050565b6018602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b601560209081526000928352604080842090915290825290205481565b60038160058110612ac657fe5b01546001600160a01b0316905081565b323314612ae257600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663796d82d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3057600080fd5b505afa158015612b44573d6000803e3d6000fd5b505050506040513d6020811015612b5a57600080fd5b5051436000908152601b602052604090205410612bb5576040805162461bcd60e51b81526020600482015260146024820152734d41585f5452414445535f5045525f424c4f434b60601b604482015290519081900360640190fd5b3360008181526011602090815260408083208684528252808320549383526016825280832086845290915290205410612c2f576040805162461bcd60e51b8152602060048201526017602482015276544f4f5f4d414e595f434c4f53455f524551554553545360481b604482015290519081900360640190fd5b33600090815260146020526040902054600511612c88576040805162461bcd60e51b81526020600482015260126024820152714d41585f50454e44494e475f4f524445525360701b604482015290519081900360640190fd5b33600090815260106020908152604080832085845290915281208260038110612cad57fe5b600d02016008015411612cf2576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b6001805460408051635cf4ee9160e01b8152600481018690526024810193909352516000926001600160a01b0390921691635cf4ee9191604480830192602092919082900301818787803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050506040513d6020811015612d7357600080fd5b5051336000818152601460209081526040808320805460018181018355918552838520018690559483526017825280832043600d82015580546001600160a01b031916851781558086018990556002019690965591815260168252848120958152949052919092208054909101905550565b601c6020526000908152604090205481565b601660209081526000928352604080842090915290825290205481565b60146020528160005260406000208181548110612e2d57fe5b90600052602060002001600091509150505481565b323314612e4e57600080fd5b33600090815260106020908152604080832086845290915281208360038110612e7357fe5b600d020190506000816008015411612ebd576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b811580612f085750600781015460ff168015612f085750612f05612efa8260080154606402610f15605085600501546147eb90919063ffffffff16565b6005830154906148b2565b82115b80612f525750600781015460ff16158015612f525750612f4f612f448260080154606402610f15605085600501546147eb90919063ffffffff16565b60058301549061490f565b82105b612f90576040805162461bcd60e51b815260206004820152600a602482015269534c5f544f4f5f42494760b01b604482015290519081900360640190fd5b601e612fa982600c0154436148b290919063ffffffff16565b1015612fed576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b600a810182905543600c82015560408051848152600060208201528082018490529051859133917f908a0c7e7b17ef90bcf82c3eb6d116aefc9c1527fe9653587001beb4874493369181900360600190a350505050565b61304e33826127c0565b61308a576040805162461bcd60e51b81526020600482015260086024820152671393d7d31253525560c21b604482015290519081900360640190fd5b33600090815260126020908152604080832084845290915290205460198054601e916130db91849081106130ba57fe5b90600052602060002090600b0201600a0154436148b290919063ffffffff16565b101561311f576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b600254601980546001600160a01b03909216916340c10f199133918590811061314457fe5b90600052602060002090600b0201600201546040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561319c57600080fd5b505af11580156131b0573d6000803e3d6000fd5b50505050601981815481106131c157fe5b600091825260209091206002600b909202010154600a805490910190556131e83383614f31565b604051829033907f79f3edbebc9a6de9a328c00e60f2354f26bac1c27fe608fda2df3a49d9c1988090600090a35050565b600e546001600160a01b0316331461325e576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b600c8054600d805460009384905590839055600254604080516340c10f1960e01b81526001600160a01b037f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d811660048301526024820186905291519495939491909216926340c10f19926044808201939182900301818387803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b5050600254600e54604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561335557600080fd5b505af1158015613369573d6000803e3d6000fd5b5050600a8054939094019092019092555050565b32331461338957600080fd5b336000908152601060209081526040808320868452909152812083600381106133ae57fe5b600d0201905060008160080154116133f8576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b601e61341182600b0154436148b290919063ffffffff16565b1015613455576040805162461bcd60e51b815260206004820152600e60248201526d4c494d49545f54494d454c4f434b60901b604482015290519081900360640190fd5b6009810182905543600b82015560408051848152600160208201528082018490529051859133917f908a0c7e7b17ef90bcf82c3eb6d116aefc9c1527fe9653587001beb4874493369181900360600190a350505050565b601a60205281600052604060002081815481106134c557fe5b6000918252602090912001546001600160a01b03169150829050565b60095481565b3360009081526014602052604090205490565b6001546001600160a01b0316331461351157600080fd5b6000838152601760205260409020600d81015461352e5750612518565b60006135596135526064610f158560000160060154876147eb90919063ffffffff16565b84906148b2565b600783015490915060009060ff1661358d5761358861358164e8d4a51000610f1588866147eb565b86906148b2565b6135aa565b6135aa6135a364e8d4a51000610f1588866147eb565b869061490f565b905060006135d56402540be400606402610f1586600f015487600e01546147eb90919063ffffffff16565b90506000806135ea8660000160030154614969565b6007880154919350915060ff1680156136105750600e86015461360d908461490f565b84115b806136385750600786015460ff161580156136385750600e86015461363590846148b2565b84105b1561371b576002548654604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909216916340c10f1991604480830192600092919082900301818387803b15801561369457600080fd5b505af11580156136a8573d6000803e3d6000fd5b5050600a805485019055505085546001870154600e880154600f8901546040805193845260208401929092528282015260608201879052516001600160a01b03909216917fe070f0177a9a4ef1d0e045638177e84b9e643b2dea722cdd65bd6217b7d16e8e9181900360800190a2613846565b8554600187015460009161373a916001600160a01b0390911690614af2565b604080516101a08101825289546001600160a01b0316815260018a01546020820152908101829052606081018590526080810184905260a08101879052600689015460c0820152600789015460ff16151560e082015260088901546101008201526009890154610120820152600a890154610140820152600061016082018190526101808201529091506137cd90614b54565b60018701548754600789015460088a01546040805186815260ff9093161515602084015282810191909152606082018990526080820187905260a08201869052516001600160a01b03909216917f9e94bdd5d609e3ae9924e86c2457237dc7e9a23c6b3f361523c83935f41445e39181900360c00190a3505b8554600187810154613862926001600160a01b0316908c615ab5565b505050505050505050565b600e546001600160a01b031633146138b2576040805162461bcd60e51b815260206004820152600360248201526223a7ab60e91b604482015290519081900360640190fd5b6008546001600160a01b03161580156138d357506001600160a01b03811615155b6138dc57600080fd5b600880546001600160a01b0383166001600160a01b031990911681179091556040805160208101929092528082526002828201526106c760f41b606083015251600080516020615d178339815191529181900360800190a150565b601260209081526000928352604080842090915290825290205481565b6001546001600160a01b0316331461396b57600080fd5b6000828152601860205260408120600201546001600160a01b03166139905750612792565b600083815260186020818152604080842060028101546001600160a01b03168552601083528185206003808301548752908452918520888652939092526004909101549081106139dc57fe5b600d0201905060008160080154118015613a8c575060015460408051631f1a496960e31b81529051613a88926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b158015613a3757600080fd5b505afa158015613a4b573d6000803e3d6000fd5b505050506040513d6020811015613a6157600080fd5b50516000868152601860209081526040808320600101548352601c9091529020549061490f565b4310155b156124d457600581015460078201546008830154600092613ab4929091879160ff16906151cc565b90506000613aca8360030154846004015461513d565b6000878152601860205260409020600501549091506001148015613af2575060008360090154115b8015613b025750600783015460ff165b8015613b12575082600901548510155b80613b5e57506000868152601860205260409020600501546001148015613b3d575060008360090154115b8015613b4e5750600783015460ff16155b8015613b5e575082600901548511155b80613ba957506000868152601860205260409020600501546002148015613b895750600083600a0154115b8015613b995750600783015460ff165b8015613ba9575082600a01548511155b80613bf557506000868152601860205260409020600501546002148015613bd45750600083600a0154115b8015613be55750600783015460ff16155b8015613bf5575082600a01548510155b15613c5a57613c576402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663547344646040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b93505b6000868152601860205260409020600501546003148015613c8b5750613c8764d18c2e2800600019615338565b8213155b15613ce957613ce66064610f15600160009054906101000a90046001600160a01b03166001600160a01b0316633562a9b16040518163ffffffff1660e01b815260040160206040518083038186803b15801561144f57600080fd5b93505b8315613fc3576000613d0464e8d4a510006125ef8486615338565b8454909150613e459084906001600160a01b03166000841215613d3557613d3061358185600019615338565b613d3f565b613d3f858561490f565b60008b8152601860205260409020600501548990600314613def57613dea6402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663c5a168836040518163ffffffff1660e01b815260040160206040518083038186803b158015613db757600080fd5b505afa158015613dcb573d6000803e3d6000fd5b505050506040513d6020811015613de157600080fd5b50518a906147eb565b6126b7565b6126b76064610f15600160009054906101000a90046001600160a01b03166001600160a01b03166332056b976040518163ffffffff1660e01b815260040160206040518083038186803b158015613db757600080fd5b60008781526018602052604090208054600186015486546002880154600590940154600789015460088a01546001600160a01b03958616969495909316937f4997fc0bb946a4e6e79304b9c968707039bef86d736eec4722b4037643ec7c59939092918d9160ff909116908a8a8f613ebb610ef0565b60408051998a5260208a0198909852888801969096529315156060880152608087019290925260a086015260c085015260e084015261010083015251908190036101200190a4835460018501546002860154613f21926001600160a01b031691906157d7565b6002546000888152601860205260408082205481516340c10f1960e01b81526001600160a01b039182166004820152602481018a905291519316926340c10f199260448084019391929182900301818387803b158015613f8057600080fd5b505af1158015613f94573d6000803e3d6000fd5b5050506000888152601860209081526040808320600101548352601c90915290204390555050600b8054850190555b5050506000928352505060186020526040812080546001600160a01b03199081168255600182018390556002820180549091169055600381018290556004810182905560050155565b32331461401857600080fd5b6001861015801561402a575060048611155b61406e576040805162461bcd60e51b815260206004820152601060248201526f57524f4e475f4f524445525f5459504560801b604482015290519081900360640190fd5b60008111801561407e5750600681105b6140c0576040805162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4e46545f5459504560901b604482015290519081900360640190fd5b600e546001600160a01b031633148061416857503360036000198301600581106140e657fe5b0154604080516331a9108f60e11b81526004810186905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b15801561413157600080fd5b505afa158015614145573d6000803e3d6000fd5b505050506040513d602081101561415b57600080fd5b50516001600160a01b0316145b6141a2576040805162461bcd60e51b81526020600482015260066024820152651393d7d3919560d21b604482015290519081900360640190fd5b60015460408051631f1a496960e31b81529051614229926001600160a01b03169163f8d24b48916004808301926020929190829003018186803b1580156141e857600080fd5b505afa1580156141fc573d6000803e3d6000fd5b505050506040513d602081101561421257600080fd5b50516000848152601c60205260409020549061490f565b431015614270576040805162461bcd60e51b815260206004820152601060248201526f535543434553535f54494d454c4f434b60801b604482015290519081900360640190fd5b60015460408051637a5a2d2f60e01b8152905173b0897686c545045afc77cf20ec7a532e3120e0f1926323b872dd9233926001600160a01b03909216918291637a5a2d2f916004808301926020929190829003018186803b1580156142d457600080fd5b505afa1580156142e8573d6000803e3d6000fd5b505050506040513d60208110156142fe57600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526044820152905160648083019260209291908290030181600087803b15801561435657600080fd5b505af115801561436a573d6000803e3d6000fd5b505050506040513d602081101561438057600080fd5b5060009050600487141561445c5761439886866127c0565b6143d4576040805162461bcd60e51b81526020600482015260086024820152671393d7d31253525560c21b604482015290519081900360640190fd5b60015460408051635cf4ee9160e01b8152600481018890526002602482015290516001600160a01b0390921691635cf4ee91916044808201926020929091908290030181600087803b15801561442957600080fd5b505af115801561443d573d6000803e3d6000fd5b505050506040513d602081101561445357600080fd5b5051905061464b565b6001600160a01b03861660009081526010602090815260408083208884529091528120856003811061448a57fe5b600d020160080154116144cf576040805162461bcd60e51b81526020600482015260086024820152674e4f5f545241444560c01b604482015290519081900360640190fd5b86600114158061451257506001600160a01b03861660009081526010602090815260408083208884529091528120856003811061450857fe5b600d020160090154115b61454b576040805162461bcd60e51b815260206004820152600560248201526404e4f5f54560dc1b604482015290519081900360640190fd5b86600214158061458e57506001600160a01b03861660009081526010602090815260408083208884529091528120856003811061458457fe5b600d0201600a0154115b6145c7576040805162461bcd60e51b81526020600482015260056024820152641393d7d4d360da1b604482015290519081900360640190fd5b60015460408051635cf4ee9160e01b8152600481018890526003602482015290516001600160a01b0390921691635cf4ee91916044808201926020929091908290030181600087803b15801561461c57600080fd5b505af1158015614630573d6000803e3d6000fd5b505050506040513d602081101561464657600080fd5b505190505b60009081526018602052604090208054336001600160a01b031991821617825560018201939093556002810180549093166001600160a01b039690961695909517909155506003830191909155600482015560050155565b6002546001600160a01b031681565b600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470657600080fd5b505afa15801561471a573d6000803e3d6000fd5b505050506040513d606081101561473057600080fd5b50805160209182015160025460085460408051630dfe168160e01b815290519497509295506001600160a01b0391821694911692630dfe1681926004808201939291829003018186803b15801561478657600080fd5b505afa15801561479a573d6000803e3d6000fd5b505050506040513d60208110156147b057600080fd5b50516001600160a01b031614156147d6576001600160701b0391821693501690506147e7565b6001600160701b0390811693501690505b9091565b6000826147fa5750600061284f565b8282028284828161480757fe5b04146148445760405162461bcd60e51b8152600401808060200182810382526021815260200180615cf66021913960400191505060405180910390fd5b9392505050565b60008082116148a1576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816148aa57fe5b049392505050565b600082821115614909576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015614844576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006149fe6402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b031663efb533376040518163ffffffff1660e01b815260040160206040518083038186803b1580156149cb57600080fd5b505afa1580156149df573d6000803e3d6000fd5b505050506040513d60208110156149f557600080fd5b505187906147eb565b90506000614a926402540be400606402610f15600160009054906101000a90046001600160a01b03166001600160a01b0316637dfcb8c76040518163ffffffff1660e01b815260040160206040518083038186803b158015614a5f57600080fd5b505afa158015614a73573d6000803e3d6000fd5b505050506040513d6020811015614a8957600080fd5b505188906147eb565b9050614aa881614aa287856148b2565b906148b2565b9350614ac56402540be400610f15614abe610ef0565b87906147eb565b600d54909350614ad5908361490f565b600d55600c54614ae5908261490f565b600c819055505050915091565b6000805b6003811015614b4d576001600160a01b038416600090815260106020908152604080832086845290915290208160038110614b2d57fe5b600d02016008015460001415614b4557809150614b4d565b600101614af6565b5092915050565b8060e0015115614c1257600081610120015111614b72576000614bb1565b614bb1614ba66402540be400606402610f15846101000151610f158661012001518760a001516147eb90919063ffffffff16565b60a08301519061490f565b610120820152610140810151614bc8576000614c07565b614c07614bfc6402540be400606402610f15846101000151610f158661014001518760a001516147eb90919063ffffffff16565b60a0830151906148b2565b610140820152614cac565b600081610120015111614c26576000614c5a565b614c5a614bfc6402540be400606402610f15846101000151610f158661012001518760a001516147eb90919063ffffffff16565b610120820152610140810151614c71576000614ca5565b614ca5614ba66402540be400606402610f15846101000151610f158661014001518760a001516147eb90919063ffffffff16565b6101408201525b80516001600160a01b03166000908152601060209081526040808320828501518452909152908190209082015182919060038110614ce657fe5b8251600d919091029190910180546001600160a01b0319166001600160a01b039283161781556020808401516001808401919091556040808601516002850155606086015160038501556080860151600485015560a0860151600585015560c0860151600685015560e086015160078501805460ff191691151591909117905561010086015160088501556101208601516009850155610140860151600a850155610160860151600b85015561018090950151600c9093019290925584518316600090815260118083528582208784018051845290845286832080548601905587519095168252825284812093518152929052919020541415614e4f57602081810180516000908152601a80845260408083205486516001600160a01b039081168552601387528285208651865287528285209190915593518352908452812084518154600181018355918352939091200180546001600160a01b031916929091169190911790555b6001546020820151606083015161010084015160408051631aa22acd60e11b8152600481019490945260248401929092526044830152516001600160a01b0390921691633544559a9160648082019260009290919082900301818387803b158015614eb957600080fd5b505af1158015614ecd573d6000803e3d6000fd5b505082516001600160a01b03166000908152600f6020526040902054159150614ef99050576096614efc565b60645b90516001600160a01b03166000908152600f6020908152604080832060ff909416909355438252601b90522080546001019055565b6001600160a01b0382166000908152601260209081526040808320848452909152902054601980546000198101908110614f6757fe5b90600052602060002090600b020160198281548110614f8257fe5b6000918252602082208354600b9092020180546001600160a01b0319166001600160a01b03909216919091178155600180840154908201556002808401549082015560038084015490820155600480840154908201805460ff909216151560ff199092169190911790556005808401549082015560068084015490820155600780840154908201556008808401549082015560098084015490820155600a9283015492019190915560198054839260129290918490811061503f57fe5b60009182526020808320600b909202909101546001600160a01b031683528201929092526040018120601980549192918590811061507957fe5b600091825260208083206001600b90930201919091015483528281019390935260409182018120939093556001600160a01b03861683526012825280832085845290915281205560198054806150cb57fe5b600082815260208120600b6000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101805460ff191690556005810182905560068101829055600781018290556008810182905560098101829055600a01559055505050565b600061515961514a610ef0565b610f15846402540be4006147eb565b905060006151bd6151b66064610f15600160009054906101000a90046001600160a01b03166001600160a01b0316635faef0066040518163ffffffff1660e01b815260040160206040518083038186803b158015614a5f57600080fd5b859061490f565b9050808211614844578161284b565b6000826151f8576151f3856125ef846151ed64e8d4a50fff19818a86615c4a565b90615338565b615211565b615211856125ef846151ed64e8d4a51000818a86615c4a565b90506152246402540be400606319615338565b81126152305780615241565b6152416402540be400606319615338565b90506152cc6402540be400600160009054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561529a57600080fd5b505afa1580156152ae573d6000803e3d6000fd5b505050506040513d60208110156152c457600080fd5b505190615338565b81136152d8578061532f565b61532f6402540be400600160009054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561529a57600080fd5b95945050505050565b6000826153475750600061284f565b8260001914801561535b5750600160ff1b82145b156153975760405162461bcd60e51b8152600401808060200182810382526027815260200180615d376027913960400191505060405180910390fd5b828202828482816153a457fe5b05146148445760405162461bcd60e51b8152600401808060200182810382526027815260200180615d376027913960400191505060405180910390fd5b600081615435576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b816000191480156154495750600160ff1b83145b156154855760405162461bcd60e51b8152600401808060200182810382526021815260200180615cd56021913960400191505060405180910390fd5b600082848161549057fe5b05949350505050565b6000805460408051633104b73f60e21b81526004810185905290516001600160a01b039092169263c412dcfc9260248084019382900301818387803b1580156154e157600080fd5b505af11580156154f5573d6000803e3d6000fd5b5050505061550c818361490f90919063ffffffff16565b831015801561552a575061552764d18c2e2800600019615338565b85135b156157d05761553d82614aa285846148b2565b6001600160a01b038581166000908152600f602052604090206001015491945016615646576001546040805163846fe25560e01b815290516000926155b69264e8d4a5100092610f15926001600160a01b03169163846fe255916004808301926020929190829003018186803b1580156149cb57600080fd5b6002549091506001600160a01b03166340c10f19866155d587856148b2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561561b57600080fd5b505af115801561562f573d6000803e3d6000fd5b5050600a8054938703909301909255506157d09050565b6001546040805163846fe25560e01b8152905160009261569b926501d1a94a200092610f15926001600160a01b03169163846fe255916004808301926020929190829003018186803b1580156149cb57600080fd5b905060006156a985836148b2565b600254604080516340c10f1960e01b81526001600160a01b038a811660048301526024820185905291519394509116916340c10f199160448082019260009290919082900301818387803b15801561570057600080fd5b505af1158015615714573d6000803e3d6000fd5b50506002546001600160a01b038981166000908152600f60205260408082206001015481516340c10f1960e01b815290841660048201526024810189905290519290931694506340c10f19935060448084019391929182900301818387803b15801561577f57600080fd5b505af1158015615793573d6000803e3d6000fd5b5050506001600160a01b038088166000908152600f60205260408082206001015490921681522060020180549093019092555050600a8054840190555b5050505050565b6001600160a01b03831660009081526010602090815260408083208584529091528120826003811061580557fe5b6001600160a01b03868116600090815260136020908152604080832089845290915280822054600154600d959095029590950160038101546008820154835162b4e89160e21b8152600481018c905260248101929092526044820152915190965093909216926302d3a24492606480820193929182900301818387803b15801561588e57600080fd5b505af11580156158a2573d6000803e3d6000fd5b505050506001600160a01b0385166000908152601160209081526040808320878452909152902054600114156159d5576000848152601a602052604090208054819060001981019081106158f257fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061591c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816013600083858154811061595b57fe5b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182208a83528152828220949094559189168252601383528082208883529092529081205580548190806159b157fe5b600082815260209020810160001990810180546001600160a01b0319169055019055505b6001600160a01b038516600090815260106020908152604080832087845290915290208360038110615a0357fe5b600d020180546001600160a01b031916815560006001808301829055600283018290556003830182905560048301829055600583018290556006830182905560078301805460ff191690556008830182905560098301829055600a8301829055600b8301829055600c9092018190556001600160a01b039690961686526011602090815260408088209688529581528587208054600019019055438752601b9052939094208054909301909255505050565b6001600160a01b0383166000908152601460205260408120905b8154811015615bbc5782828281548110615ae557fe5b90600052602060002001541415615bb4578515615b2c576001600160a01b038516600090815260156020908152604080832087845290915290208054600019019055615b58565b6001600160a01b0385166000908152601660209081526040808320878452909152902080546000190190555b815482906000198101908110615b6a57fe5b9060005260206000200154828281548110615b8157fe5b906000526020600020018190555081805480615b9957fe5b60019003818190600052602060002001600090559055615bbc565b600101615acf565b5050600090815260176020526040812080546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006810182905560078101805460ff191690556008810182905560098101829055600a8101829055600b8101829055600c8101829055600d8101829055600e8101829055600f0155505050565b6000818303818312801590615c5f5750838113155b80615c745750600083128015615c7457508381135b6148445760405162461bcd60e51b8152600401808060200182810382526024815260200180615d5e6024913960400191505060405180910390fdfe4e4f5f434f52524553504f4e44494e475f4e46545f5350524541445f524544554354494f4e5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77943e9d45a11aaae5d87503e3bc248665d9807856e5cf2bdb4a988bee444227815369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220eaa69de5a7d1367e8078de9fd21c3d22bd29e1d8590bab2970827c5ec47ae6ac64736f6c634300060c0033

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

000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d000000000000000000000000f9a4c522e327935bd1f5a338c121e14e4cc1f89800000000000000000000000077cd42b925e1a82f41d852d6be727cfc88fddbbc0000000000000000000000003378ad81d09de23725ee9b9270635c97ed60192100000000000000000000000002e2c5825c1a3b69c0417706dbe1327c2af3e6c20000000000000000000000002d266a94469d05c9e06d52a4d0d9c23b157767c2

-----Decoded View---------------
Arg [0] : _gov (address): 0xC66FbE50Dd33c9AAdd65707F7088D597C86fE00F
Arg [1] : _dev (address): 0xd39A38bD2D2d552f3908ff698a5530aa397fb92d
Arg [2] : _nft (address[5]): 0xF9A4c522E327935BD1F5a338c121E14e4cc1f898,0x77cd42B925e1A82f41d852D6BE727CFc88fddBbC,0x3378AD81D09DE23725Ee9B9270635c97Ed601921,0x02e2c5825C1a3b69C0417706DbE1327C2Af3e6C2,0x2D266A94469d05C9e06D52A4D0d9C23b157767c2

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f
Arg [1] : 000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d
Arg [2] : 000000000000000000000000f9a4c522e327935bd1f5a338c121e14e4cc1f898
Arg [3] : 00000000000000000000000077cd42b925e1a82f41d852d6be727cfc88fddbbc
Arg [4] : 0000000000000000000000003378ad81d09de23725ee9b9270635c97ed601921
Arg [5] : 00000000000000000000000002e2c5825c1a3b69c0417706dbe1327c2af3e6c2
Arg [6] : 0000000000000000000000002d266a94469d05c9e06d52a4d0d9c23b157767c2


Deployed Bytecode Sourcemap

15077:37284:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15912:19;;;:::i;:::-;;;;;;;;;;;;;;;;17533:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17533:64:0;;;;;;;;:::i;51752:606::-;;;;;;;;;;;;;;;;-1:-1:-1;51752:606:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51752:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20888:220;;;;;;;;;;;;;;;;-1:-1:-1;20888:220:0;-1:-1:-1;;;;;20888:220:0;;:::i;:::-;;15194:32;;;:::i;:::-;;;;-1:-1:-1;;;;;15194:32:0;;;;;;;;;;;;;;17445:81;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17445:81:0;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17445:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15233:49;;;:::i;15360:24::-;;;:::i;18176:39::-;;;;;;;;;;;;;;;;-1:-1:-1;18176:39:0;;:::i;:::-;;;;-1:-1:-1;;;;;18176:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15946:19;;;:::i;51514:107::-;;;:::i;16035:32::-;;;:::i;17680:62::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17680:62:0;;;;;;;;:::i;21312:220::-;;;;;;;;;;;;;;;;-1:-1:-1;21312:220:0;-1:-1:-1;;;;;21312:220:0;;:::i;21542:248::-;;;;;;;;;;;;;;;;-1:-1:-1;21542:248:0;-1:-1:-1;;;;;21542:248:0;;:::i;29368:181::-;;;:::i;18329:43::-;;;;;;;;;;;;;;;;-1:-1:-1;18329:43:0;;:::i;15875:22::-;;;:::i;51377:131::-;;;;;;;;;;;;;;;;-1:-1:-1;51377:131:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15836:24;;;:::i;30248:4203::-;;;;;;;;;;;;;;;;-1:-1:-1;30248:4203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30248:4203:0;;:::i;20714:168::-;;;;;;;;;;;;;;;;-1:-1:-1;20714:168:0;-1:-1:-1;;;;;20714:168:0;;:::i;16006:22::-;;;:::i;43793:2867::-;;;;;;;;;;;;;;;;-1:-1:-1;43793:2867:0;;;;;;;;;;;;:::i;40271:1797::-;;;;;;;;;;;;;;;;-1:-1:-1;40271:1797:0;;;;;;;:::i;17397:41::-;;;;;;;;;;;;;;;;-1:-1:-1;17397:41:0;-1:-1:-1;;;;;17397:41:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;17397:41:0;;;;;;;;;;;;;;;;;;;;29822:371;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29822:371:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49961:1078;;;;;;;;;;;;;;;;-1:-1:-1;49961:1078:0;;:::i;18063:61::-;;;;;;;;;;;;;;;;-1:-1:-1;18063:61:0;;:::i;:::-;;;;;-1:-1:-1;;;;;18063:61:0;;;;;;;;;;;-1:-1:-1;;;;;18063:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17805:71;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17805:71:0;;;;;;;;:::i;15325:28::-;;;;;;;;;;;;;;;;-1:-1:-1;15325:28:0;;:::i;39303:960::-;;;;;;;;;;;;;;;;-1:-1:-1;39303:960:0;;;;;;;:::i;18379:43::-;;;;;;;;;;;;;;;;-1:-1:-1;18379:43:0;;:::i;17883:72::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17883:72:0;;;;;;;;:::i;17749:49::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17749:49:0;;;;;;;;:::i;37789:695::-;;;;;;;;;;;;;;;;-1:-1:-1;37789:695:0;;;;;;;;;;;;:::i;36782:557::-;;;;;;;;;;;;;;;;-1:-1:-1;36782:557:0;;:::i;51066:265::-;;;:::i;38790:463::-;;;;;;;;;;;;;;;;-1:-1:-1;38790:463:0;;;;;;;;;;;;:::i;18222:45::-;;;;;;;;;;;;;;;;-1:-1:-1;18222:45:0;;;;;;;:::i;15797:24::-;;;:::i;51627:119::-;;;:::i;34459:2283::-;;;;;;;;;;;;;;;;-1:-1:-1;34459:2283:0;;;;;;;;;;;;:::i;21114:192::-;;;;;;;;;;;;;;;;-1:-1:-1;21114:192:0;-1:-1:-1;;;;;21114:192:0;;:::i;17604:69::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17604:69:0;;;;;;;;:::i;46668:3185::-;;;;;;;;;;;;;;;;-1:-1:-1;46668:3185:0;;;;;;;:::i;42323:1462::-;;;;;;;;;;;;;;;;-1:-1:-1;42323:1462:0;;;-1:-1:-1;;;;;42323:1462:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15289:29::-;;;:::i;15912:19::-;;;;:::o;17533:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;51752:606::-;51824:4;51929:31;;;:24;:31;;;;;51993:7;;;;52015:13;;;;52043:11;;;;52069:14;;;52098:17;;;52130:23;;;;52168:25;;;;52208:24;;;;52247:11;;;;52273:16;;;;52304:10;;;;52329;;;;;51993:7;;52015:13;;52043:11;;-1:-1:-1;;;;;52069:14:0;;;;52098:17;;52130:23;;52168:25;;52208:24;;52247:11;;;;;52273:16;;51752:606::o;20888:220::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;20957:5:::1;::::0;-1:-1:-1;;;;;20957:5:0::1;:28:::0;:52;::::1;;;-1:-1:-1::0;;;;;;20989:20:0;::::1;::::0;::::1;20957:52;20949:61;;;::::0;::::1;;21021:5;:32:::0;;-1:-1:-1;;;;;21021:32:0;::::1;-1:-1:-1::0;;;;;;21021:32:0;;::::1;::::0;::::1;::::0;;;21069:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21069:31:0;;;;;-1:-1:-1;;;;;;;;;;;21069:31:0;;;;;;;::::1;20888:220:::0;:::o;15194:32::-;;;-1:-1:-1;;;;;15194:32:0;;:::o;17445:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17445:81:0;;;;-1:-1:-1;17445:81:0;;-1:-1:-1;17445:81:0;;-1:-1:-1;17445:81:0;;;;;;;;;;;;;;;;;:::o;15233:49::-;;;-1:-1:-1;;;;;15233:49:0;;:::o;15360:24::-;;;-1:-1:-1;;;;;15360:24:0;;:::o;18176:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18176:39:0;;;;-1:-1:-1;18176:39:0;;;;;;;;;;;;;;;;;;;;:::o;15946:19::-;;;;:::o;51514:107::-;51591:15;:22;51514:107;:::o;16035:32::-;;;:::o;17680:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21312:220::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;21408:1:::1;21379:4:::0;-1:-1:-1;;;;;21379:4:0::1;:31:::0;:54;::::1;;;-1:-1:-1::0;;;;;;21414:19:0;::::1;::::0;::::1;21379:54;21371:63;;;::::0;::::1;;21445:4;:34:::0;;-1:-1:-1;;;;;21445:34:0;::::1;-1:-1:-1::0;;;;;;21445:34:0;;::::1;::::0;::::1;::::0;;;21495:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21495:29:0;;;;;-1:-1:-1;;;;;;;;;;;21495:29:0;;;;;;;::::1;21312:220:::0;:::o;21542:248::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21626:25:0;::::1;21618:34;;;::::0;::::1;;21663:15;:57:::0;;-1:-1:-1;;;;;21663:57:0;::::1;-1:-1:-1::0;;;;;;21663:57:0;;::::1;::::0;::::1;::::0;;;21736:46:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21736:46:0;;;;;-1:-1:-1;;;;;;;;;;;21736:46:0;;;;;;;::::1;21542:248:::0;:::o;29368:181::-;29413:4;29430:17;29449:15;29468:12;:10;:12::i;:::-;29429:51;;-1:-1:-1;29429:51:0;-1:-1:-1;29498:43:0;29429:51;29498:25;29429:51;15542:4;29498:14;:25::i;:::-;:29;;:43::i;:::-;29491:50;;;;29368:181;:::o;18329:43::-;;;;;;;;;;;;;:::o;15875:22::-;;;;:::o;51377:131::-;51477:23;;;;:11;:23;;;;;;;;;51470:30;;;;;;;;;;;;;;;;;51442:16;;51470:30;;;51477:23;51470:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51470:30:0;;;;;;;;;;;;;;;;;;;;;;;51377:131;;;:::o;15836:24::-;;;;:::o;30248:4203::-;29656:9;29669:10;29656:23;29648:32;;;;;;30700:20:::1;30765:22;:34;30788:10;-1:-1:-1::0;;;;;30765:34:0::1;-1:-1:-1::0;;;;;30765:34:0::1;;;;;;;;;;;;:46;30800:10;30765:46;;;;;;;;;;;;30723:15;:27;30739:10;-1:-1:-1::0;;;;;30723:27:0::1;-1:-1:-1::0;;;;;30723:27:0::1;;;;;;;;;;;;:39;30751:10;30723:39;;;;;;;;;;;;:88;30700:111;;30840:41;30858:10;30870;30840:17;:41::i;:::-;:81;;30906:15;30840:81;;;30884:15;30902:1;30884:19;30840:81;30822:99;;30973:15;;;;;;;;;-1:-1:-1::0;;;;;30973:15:0::1;-1:-1:-1::0;;;;;30973:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30973:35:0;30957:12:::1;30942:28;::::0;;;:14:::1;30973:35;30942:28:::0;;;;;:66:::1;30934:99;;;::::0;;-1:-1:-1;;;30934:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30934:99:0;;;;;;;;;;;;;::::1;;31053:15;;;;;;;;;-1:-1:-1::0;;;;;31053:15:0::1;-1:-1:-1::0;;;;;31053:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31053:26:0;31052:27:::1;31044:46;;;::::0;;-1:-1:-1;;;31044:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31044:46:0;;;;;;;;;;;;;::::1;;31109:15;::::0;:71:::1;::::0;;-1:-1:-1;;;31109:71:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31109:15:0;;::::1;::::0;:28:::1;::::0;:71;;;;;::::1;::::0;;;;;;;;;:15;:71;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31109:71:0;31101:101:::1;;;::::0;;-1:-1:-1;;;31101:101:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31101:101:0;;;;;;;;;;;;;::::1;;15678:1;31221:15;:37;31213:69;;;::::0;;-1:-1:-1;;;31213:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31213:69:0;;;;;;;;;;;;;::::1;;31317:10;31301:27;::::0;;;:15:::1;:27;::::0;;;;:34;15721:1:::1;-1:-1:-1::0;31293:86:0::1;;;::::0;;-1:-1:-1;;;31293:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31293:86:0;;;;;;;;;;;;;::::1;;31391:17;31414:12;:10;:12::i;:::-;31390:36;;;31467:68;31519:15;:13;:15::i;:::-;31467:47;15542:4;31499;:14;31467:15;;;;;;;;;-1:-1:-1::0;;;;;31467:15:0::1;-1:-1:-1::0;;;;;31467:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31467:27:0;;:31:::1;:47::i;:68::-;31445:18;:90;;:196;;;;;31574:67;15542:4;31627:3;:13;31574:48;31591:15;;;;;;;;;-1:-1:-1::0;;;;;31591:15:0::1;-1:-1:-1::0;;;;;31591:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31591:30:0;31574:12;;:16:::1;:48::i;:67::-;31552:18;:89;;31445:196;31437:231;;;::::0;;-1:-1:-1;;;31437:231:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31437:231:0;;;;;;;;;;;;;::::1;;31700:1;31687:9;:14;;:34;;;;;31718:3;31705:9;:16;;31687:34;31679:61;;;::::0;;-1:-1:-1;;;31679:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31679:61:0;;;;;;;;;;;;;::::1;;31772:2;31759:9;:15;;:68;;;-1:-1:-1::0;31799:10:0::1;31791:19;::::0;;;:7:::1;:19;::::0;;;;:36;31778:49;::::1;;31759:68;31751:102;;;::::0;;-1:-1:-1;;;31751:102:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31751:102:0;;;;;;;;;;;;;::::1;;31872:23:::0;;;:79:::1;;;31950:1;31899:3;31922:1;31903:18;:20;31899:25;;;;;;;;::::0;:47:::1;::::0;;-1:-1:-1;;;31899:47:0;;31935:10:::1;31899:47;::::0;::::1;::::0;;;-1:-1:-1;;;;;31899:25:0;;::::1;::::0;:35:::1;::::0;:47;;;;;::::1;::::0;;;;;;;;;:25;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31899:47:0;:52:::1;;31872:79;31864:142;;;;-1:-1:-1::0;;;31864:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32032:18:::0;32025:25;::::1;32017:46;;;::::0;;-1:-1:-1;;;32017:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32017:46:0;;;;;;;;;;;;;::::1;;32080:6;32076:2080;;32102:10;32115:15;;;;;;;;;-1:-1:-1::0;;;;;32115:15:0::1;-1:-1:-1::0;;;;;32115:24:0::1;;32140:10;32152:1;32115:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;32102:52;;32169:15;:27;32185:10;-1:-1:-1::0;;;;;32169:27:0::1;-1:-1:-1::0;;;;;32169:27:0::1;;;;;;;;;;;;32202:5;32169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32265:12;32225:24;:31;32250:5;32225:31;;;;;;;;;;;:37;;:52;;;;32338:6;32292:24;:31;32317:5;32292:31;;;;;;;;;;;:43;;:52;;;;32403:10;32359:24;:31;32384:5;32359:31;;;;;;;;;;;:41;;:54;;;;32475:10;32428:24;:31;32453:5;32428:31;;;;;;;;;;;:37;;:44;;;:57;;;;;-1:-1:-1::0;;;;;32428:57:0::1;;;;;-1:-1:-1::0;;;;;32428:57:0::1;;;;;;32550:10;32500:24;:31;32525:5;32500:31;;;;;;;;;;;:37;;:47;;:60;;;;32619:4;32575:24;:31;32600:5;32575:31;;;;;;;;;;;:37;;:41;;;:48;;;;;;;;;;;;;;;;;;32687:9;32638:24;:31;32663:5;32638:31;;;;;;;;;;;:37;;:46;;:58;;;;32754:4;32711:24;:31;32736:5;32711:31;;;;;;;;;;;:37;;:40;;:47;;;;32834:4;32791:24;:31;32816:5;32791:31;;;;;;;;;;;:37;;:40;;:47;;;;32963:1;32942:18;:22;:84;;33025:1;32942:84;;;32967:15;::::0;:55:::1;::::0;;-1:-1:-1;;;32967:55:0;;-1:-1:-1;;33001:20:0;;32967:55:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;32967:15:0;;::::1;::::0;:33:::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;:15;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32967:55:0;32942:84:::1;32871:24;:31;32896:5;32871:31;;;;;;;;;;;:37;;:54;;:155;;;;33101:18;33043:24;:31;33068:5;33043:31;;;;;;;;;;;:37;;:55;;:76;;;;33136:22;:34;33159:10;-1:-1:-1::0;;;;;33136:34:0::1;-1:-1:-1::0;;;;;33136:34:0::1;;;;;;;;;;;;:46;33171:10;33136:46;;;;;;;;;;;;:48;;;;;;;;;;;;;32076:2080;;;;33224:41;33242:10;33254;33224:17;:41::i;:::-;33223:42;33215:73;;;::::0;;-1:-1:-1;;;33215:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33215:73:0;;;;;;;;;;;;;::::1;;33325:15;;;;;;;;;-1:-1:-1::0;;;;;33325:15:0::1;-1:-1:-1::0;;;;;33325:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33325:40:0;33311:54;::::1;;33303:85;;;::::0;;-1:-1:-1;;;33303:85:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33303:85:0;;;;;;;;;;;;;::::1;;33405:15;33426:567;;;;;;;;33459:10;-1:-1:-1::0;;;;;33426:567:0::1;;;;;33488:10;33426:567;;;;33517:18;33426:567;;;;33575:1;33554:18;:22;:84;;33637:1;33554:84;;;33579:15;::::0;:55:::1;::::0;;-1:-1:-1;;;33579:55:0;;-1:-1:-1;;33613:20:0;;33579:55:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;33579:15:0;;::::1;::::0;:33:::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;:15;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33579:55:0;33554:84:::1;33426:567;;;;33657:4;33426:567;;;;;;33680:9;33426:567;;;;33708:4;33426:567;;;;33749:4;33426:567;;;;33790:4;:69;;33853:6;33790:69;;;33797:53;33808:41;33835:13:::0;33808:22:::1;:6:::0;33819:10;33808::::1;:22::i;:41::-;33797:6:::0;;:10:::1;:53::i;:::-;33426:567;;;;33878:4;:69;;33894:53;33905:41;33932:13:::0;33905:22:::1;:6:::0;33916:10;33905::::1;:22::i;:41::-;33894:6:::0;;:10:::1;:53::i;:::-;33878:69;;;33885:6;33878:69;33426:567;;;;33966:12;33426:567;;::::0;33405:589:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33405:589:0::1;;;;;-1:-1:-1::0;;;;;33405:589:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34081:1;34058:15;:22;;;;:24;34011:20;:32;34032:10;-1:-1:-1::0;;;;;34011:32:0::1;-1:-1:-1::0;;;;;34011:32:0::1;;;;;;;;;;;;:44;34044:10;34011:44;;;;;;;;;;;:71;;;;34133:10;34121;-1:-1:-1::0;;;;;34104:40:0::1;;;;;;;;;;;32076:2080;34168:5;::::0;:42:::1;::::0;;-1:-1:-1;;;34168:42:0;;34179:10:::1;34168:42;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;34168:5:0;;::::1;::::0;:10:::1;::::0;:42;;;;;:5:::1;::::0;:42;;;;;;;;:5;;:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34221:12:0::1;:34:::0;;;::::1;::::0;;-1:-1:-1;;;;;;;34271:23:0;::::1;::::0;;::::1;::::0;:69:::1;;-1:-1:-1::0;34306:10:0::1;34338:1;34298:19:::0;;;:7:::1;:19;::::0;;;;:28:::1;;::::0;-1:-1:-1;;;;;34298:28:0::1;:42:::0;34271:69:::1;:105;;;;-1:-1:-1::0;;;;;;34353:23:0;::::1;34366:10;34353:23;;34271:105;34268:176;;;34400:10;34392:19;::::0;;;:7:::1;:19;::::0;;;;:28:::1;;:40:::0;;-1:-1:-1;;;;;;34392:40:0::1;-1:-1:-1::0;;;;;34392:40:0;::::1;;::::0;;34268:176:::1;29691:1;;30248:4203:::0;;;;;;;;;;;:::o;20714:168::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20783:18:0;::::1;20775:27;;;::::0;::::1;;20813:7;:14:::0;;-1:-1:-1;;;;;20813:14:0;::::1;-1:-1:-1::0;;;;;;20813:14:0;;::::1;::::0;::::1;::::0;;;20843:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;20843:31:0;;;;;-1:-1:-1;;;;;;;;;;;20843:31:0;;;;;;;::::1;20714:168:::0;:::o;16006:22::-;;;-1:-1:-1;;;;;16006:22:0;;:::o;43793:2867::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;43944:32:::1;43979:29:::0;;;:21:::1;:29;::::0;;;;44022:15:::1;::::0;::::1;::::0;-1:-1:-1;;;;;44022:15:0::1;44019:44;;44054:7;;;44019:44;44096:15;::::0;::::1;::::0;44113:18:::1;::::0;::::1;::::0;44078:54:::1;::::0;-1:-1:-1;;;;;44096:15:0::1;::::0;44078:17:::1;:54::i;:::-;:85;;;;;44137:15;;;;;;;;;-1:-1:-1::0;;;;;44137:15:0::1;-1:-1:-1::0;;;;;44137:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44137:26:0;44136:27:::1;44078:85;:186;;;;-1:-1:-1::0;44227:15:0::1;::::0;:36:::1;::::0;;-1:-1:-1;;;44227:36:0;;;;44192:72:::1;::::0;-1:-1:-1;;;;;44227:15:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44227:36:0;44207:14:::1;::::0;::::1;::::0;44192:30:::1;::::0;;;:14:::1;44227:36;44192:30:::0;;;;;;:34:::1;:72::i;:::-;44176:12;:88;;44078:186;44075:2531;;;44344:15;::::0;::::1;::::0;-1:-1:-1;;;;;44344:15:0::1;44280:24;44323:37:::0;;;:20:::1;:37;::::0;;;;;;;44361:18:::1;::::0;::::1;::::0;44323:57;;;;;;;;44307:15:::1;:74:::0;;:15;;44323:57;44307:74;::::1;;;;;;::::0;;;::::1;::::0;;;;44401:15:::1;::::0;44430:18:::1;::::0;::::1;::::0;44450:19:::1;44307:74;::::0;;::::1;::::0;;::::1;44450:19:::0;;::::1;::::0;44471:10:::1;::::0;::::1;::::0;44401:81:::1;::::0;;-1:-1:-1;;;44401:81:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;44307:74;;-1:-1:-1;;;;;;44401:15:0::1;::::0;:28:::1;::::0;:81;;;;;;;;;;:15;:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44401:81:0;44398:2197:::1;;;44502:17;44522:55;44535:41;44572:3;44535:32;44548:1;:18;;;44535:8;:12;;:32;;;;:::i;:41::-;44522:8:::0;;:12:::1;:55::i;:::-;44613:5;::::0;::::1;::::0;44502:75;;-1:-1:-1;44596:14:0::1;::::0;44613:5:::1;;:163;;44721:55;44732:43;44761:13:::0;44732:24:::1;:6:::0;44743:12;44732:10:::1;:24::i;:43::-;44721:6:::0;;:10:::1;:55::i;:::-;44613:163;;;44622:55;44633:43;44662:13:::0;44633:24:::1;:6:::0;44644:12;44633:10:::1;:24::i;:43::-;44622:6:::0;;:10:::1;:55::i;:::-;44596:180;;44813:1;:10;;;44800:9;:23;;:50;;;;;44840:1;:10;;;44827:9;:23;;44800:50;44797:1783;;;44920:15;::::0;:35:::1;::::0;;-1:-1:-1;;;44920:35:0;;;;44874:19:::1;::::0;44896:79:::1;::::0;44961:13;;44896:60:::1;::::0;-1:-1:-1;;;;;44920:15:0::1;::::0;:33:::1;::::0;:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44920:35:0;44896:19:::1;::::0;::::1;::::0;;:23:::1;:60::i;:79::-;44874:101;;44999:32;45033:30:::0;45067:55:::1;45082:39;45106:14;45082:1;:19;;;:23;;:39;;;;:::i;:::-;45067:14;:55::i;:::-;45194:8:::0;;;45204:11;::::1;::::0;44998:124;;-1:-1:-1;44998:124:0;;-1:-1:-1;45145:20:0::1;::::0;45168:48:::1;::::0;-1:-1:-1;;;;;45194:8:0::1;::::0;45168:25:::1;:48::i;:::-;45255:517;::::0;;::::1;::::0;::::1;::::0;;45287:8;;-1:-1:-1;;;;;45287:8:0::1;45255:517:::0;;45287:8;45322:11;::::1;::::0;45255:517:::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;45544:18:::1;::::0;::::1;::::0;45255:517;;;;45589:5:::1;::::0;::::1;::::0;::::1;;45255:517;;::::0;;;;45621:10:::1;::::0;::::1;::::0;45287:8:::1;45255:517:::0;;;45658:4:::1;::::0;::::1;::::0;45255:517;;;;45689:4:::1;::::0;::::1;::::0;45255:517;;;;-1:-1:-1;45255:517:0;;;;;;;;;;45145:71;;-1:-1:-1;45241:532:0::1;::::0;:13:::1;:532::i;:::-;45798:5;::::0;45809:18;;45798:46:::1;::::0;;-1:-1:-1;;;45798:46:0;;-1:-1:-1;;;;;45809:18:0;;::::1;45798:46;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:46;;;;;:5:::1;::::0;:46;;;;;;;:5;;:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;45882:14:0::1;::::0;;::::1;::::0;45867:30:::1;::::0;;;:14:::1;:30;::::0;;;;45900:12:::1;45867:45:::0;;45935:10:::1;:28:::0;;;::::1;::::0;;46153:18;;46073:11;;::::1;::::0;46038:8;;46198:1:::1;46262:5:::0;;::::1;::::0;46294:10:::1;::::0;::::1;::::0;-1:-1:-1;;;;;46153:18:0;;::::1;::::0;-1:-1:-1;46073:11:0;;46038:8;;;::::1;::::0;45993:499:::1;::::0;46111:15;;46226:9;;46262:5:::1;::::0;;::::1;::::0;46294:10;46331:27;;45949:14;46454:15:::1;:13;:15::i;:::-;45993:499;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;46538:8:::0;;;46548:11;::::1;::::0;46517:43:::1;::::0;-1:-1:-1;;;;;46538:8:0::1;::::0;46517:20:::1;:43::i;:::-;44797:1783;;;;;44398:2197;;;44075:2531;;-1:-1:-1::0;46623:29:0::1;::::0;;;:21:::1;:29;::::0;;;;46616:36;;-1:-1:-1;;;;;;46616:36:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;29805:1:::1;43793:2867:::0;;;:::o;40271:1797::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;40399:28:::1;40430:32:::0;;;:24:::1;:32;::::0;;;;;;;40513:14;;-1:-1:-1;;;;;40513:14:0::1;40502:26:::0;;:10:::1;:26:::0;;;;;40513:14;40529:17;::::1;::::0;40502:45;;;;;;;40548:23:::1;::::0;::::1;::::0;40430:32;;40399:28;40502:70:::1;::::0;::::1;;;;;;;;40473:99;;40588:1;:7;;;40599:1;40588:12;40585:27;;;40603:7;;;;40585:27;40627:21;::::0;::::1;::::0;:25;40624:1338:::1;;40668:13;40684:128;40720:12;:30;;;40769:12;:28;;;40684:17;:128::i;:::-;40668:144;;40829:17;40849:176;40888:12;:22;;;40929:6;40954:12;:16;;;;;;;;;;;;40989:12;:21;;;40849:20;:176::i;:::-;40829:196:::0;-1:-1:-1;41042:7:0::1;41052:56;41093:13:::0;41052:32:::1;41056:8:::0;40829:196;41052:17:::1;:32::i;:::-;:36:::0;::::1;:56::i;:::-;41192:19:::0;;41042:66;;-1:-1:-1;41125:289:0::1;::::0;41160:13;;-1:-1:-1;;;;;41192:19:0::1;;41230:8:::0;::::1;;:68;;41267:31;41285:11;:3:::0;-1:-1:-1;;41285:7:0::1;:11::i;41267:31::-;41230:68;;;41241:23;:8:::0;41259:3;41241:12:::1;:23::i;:::-;41350:15;::::0;:29:::1;::::0;;-1:-1:-1;;;41350:29:0;;;;41317:1:::1;::::0;41337:62:::1;::::0;41385:13;;41337:43:::1;::::0;-1:-1:-1;;;;;41350:15:0::1;::::0;:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41350:29:0;41337:8;;:12:::1;:43::i;:62::-;41125:16;:289::i;:::-;41510:22;::::0;::::1;::::0;41472:19;;41551:28:::1;::::0;::::1;::::0;41623:16:::1;::::0;::::1;::::0;41685:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;41472:19:0;;::::1;::::0;41436:341:::1;::::0;41551:28;41598:6;;41623:16:::1;::::0;;::::1;::::0;41658:8;;41725:3;41747:15:::1;:13;:15::i;:::-;41436:341;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;41828:19:::0;;;41866:22;::::1;::::0;41907:28:::1;::::0;::::1;::::0;41794:156:::1;::::0;-1:-1:-1;;;;;41828:19:0::1;::::0;41866:22;41794:15:::1;:156::i;:::-;40624:1338;;;;42018:14:::0;;;42034:17;::::1;::::0;41982:78:::1;::::0;42011:5:::1;::::0;-1:-1:-1;;;;;42018:14:0;;::::1;::::0;42053:6;41982:28:::1;:78::i;:::-;29805:1;;;40271:1797:::0;;:::o;17397:41::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17397:41:0;;;:::o;29822:371::-;29922:15;:22;29903:4;;29919:48;;-1:-1:-1;29959:5:0;29952:12;;29919:48;-1:-1:-1;;;;;30001:29:0;;29979:19;30001:29;;;:20;:29;;;;;;;;:41;;;;;;;;;30060:15;:31;;30001:41;;:29;:41;;30060:31;;;;;;;;;;;;;;;;;;;:38;-1:-1:-1;;;;;30060:38:0;:49;:125;;;;;30175:10;30130:15;30146:14;30130:31;;;;;;;;;;;;;;;;;;:41;;;:55;30060:125;30053:132;;;29822:371;;;;;:::o;49961:1078::-;50028:28;50059:32;;;:24;:32;;;;;50110:7;;;;:11;;;;:46;;-1:-1:-1;50141:7:0;;;;:15;;50153:2;50141:11;:15::i;:::-;50125:12;:31;;50110:46;50102:73;;;;;-1:-1:-1;;;50102:73:0;;;;;;;;;;;;-1:-1:-1;;;50102:73:0;;;;;;;;;;;;;;;50194:14;;-1:-1:-1;;;;;50194:14:0;50212:10;50194:28;50186:55;;;;;-1:-1:-1;;;50186:55:0;;;;;;;;;;;;-1:-1:-1;;;50186:55:0;;;;;;;;;;;;;;;50283:10;50254:15;50272:22;;;:10;:22;;;;;;;;50295:17;;;;50272:41;;;;;;;50314:23;;;;50272:66;;;;;;;;;;50254:84;;50349:14;50385:1;50366;:7;;:16;;;:20;50349:37;;50397:14;50427:1;50414;:10;;;:14;50397:31;;50439:13;50455:9;:59;;50495:1;:19;;;50455:59;;;50467:25;;;;50455:59;50439:75;;50561:9;:22;;;;50574:9;50561:22;50558:340;;;50603:9;50599:202;;50703:17;;;;50743:23;;;;50632:153;;50670:10;;50632:15;:153::i;:::-;50815:5;;:32;;;-1:-1:-1;;;50815:32:0;;50826:10;50815:32;;;;;;;;;;;;-1:-1:-1;;;;;50815:5:0;;;;:10;;:32;;;;;:5;;:32;;;;;;;;:5;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50862:12:0;:24;;;;;;-1:-1:-1;;50558:340:0;50910:78;50939:9;50950:10;50962:1;:7;;:17;;;50981:6;50910:28;:78::i;:::-;51006:25;;;;;;;49961:1078;;;;;;:::o;18063:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18063:61:0;;;;;;;;;;;;;:::o;17805:71::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;15325:28::-;;;;;;;;;;;;-1:-1:-1;;;;;15325:28:0;;-1:-1:-1;15325:28:0;:::o;39303:960::-;29656:9;29669:10;29656:23;29648:32;;;;;;39439:15:::1;;;;;;;;;-1:-1:-1::0;;;;;39439:15:0::1;-1:-1:-1::0;;;;;39439:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39439:35:0;39423:12:::1;39408:28;::::0;;;:14:::1;39439:35;39408:28:::0;;;;;:66:::1;39400:99;;;::::0;;-1:-1:-1;;;39400:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39400:99:0;;;;;;;;;;;;;::::1;;39584:10;39568:27;::::0;;;:15:::1;:27;::::0;;;;;;;:39;;;;;;;;;39518:35;;;:23:::1;:35:::0;;;;;:47;;;;;;;;;:89:::1;39510:134;;;::::0;;-1:-1:-1;;;39510:134:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39510:134:0;;;;;;;;;;;;;::::1;;39679:10;39663:27;::::0;;;:15:::1;:27;::::0;;;;:34;15721:1:::1;-1:-1:-1::0;39655:86:0::1;;;::::0;;-1:-1:-1;;;39655:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39655:86:0;;;;;;;;;;;;;::::1;;39771:10;39824:1;39760:22:::0;;;:10:::1;:22;::::0;;;;;;;:34;;;;;;;;39795:16;39760:52:::1;::::0;::::1;;;;;;;;:61;;;:65;39752:86;;;::::0;;-1:-1:-1;;;39752:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39752:86:0;;;;;;;;;;;;;::::1;;39864:15;::::0;;:39:::1;::::0;;-1:-1:-1;;;39864:39:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;39851:10:::1;::::0;-1:-1:-1;;;;;39864:15:0;;::::1;::::0;:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;39851:10;39864:15;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39864:39:0;39930:10:::1;39914:27;::::0;;;:15:::1;39864:39;39914:27:::0;;;;;;;:39;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;39997:31;;;:24:::1;:31:::0;;;;;40049:12:::1;40039:7;::::0;::::1;:22:::0;40072:27;;-1:-1:-1;;;;;;40072:27:0::1;::::0;::::1;::::0;;40110:17;;::::1;:30:::0;;;40151:23:::1;;:42:::0;;;;40206:35;;;:23:::1;:35:::0;;;;;:47;;;;;;;;;;:49;;;;::::1;::::0;;-1:-1:-1;39303:960:0:o;18379:43::-;;;;;;;;;;;;;:::o;17883:72::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;17749:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37789:695::-;29656:9;29669:10;29656:23;29648:32;;;;;;37920:10:::1;37891:15;37909:22:::0;;;:10:::1;:22;::::0;;;;;;;:34;;;;;;;;37944:16;37909:52:::1;::::0;::::1;;;;;;;;37891:70;;37993:1;37980;:10;;;:14;37972:35;;;::::0;;-1:-1:-1;;;37972:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37972:35:0;;;;;;;;;;;;;::::1;;38026:11:::0;;;:95:::1;;-1:-1:-1::0;38041:5:0::1;::::0;::::1;::::0;::::1;;:80:::0;::::1;;;;38059:62;38075:45;38109:1;:10;;;38105:3;:14;38075:25;15625:2;38075:1;:11;;;:15;;:25;;;;:::i;:45::-;38059:11;::::0;::::1;::::0;;:15:::1;:62::i;:::-;38050:6;:71;38041:80;38026:197;;;-1:-1:-1::0;38143:5:0::1;::::0;::::1;::::0;::::1;;38142:6;:81:::0;::::1;;;;38161:62;38177:45;38211:1;:10;;;38207:3;:14;38177:25;15625:2;38177:1;:11;;;:15;;:25;;;;:::i;:45::-;38161:11;::::0;::::1;::::0;;:15:::1;:62::i;:::-;38152:6;:71;38142:81;38018:220;;;::::0;;-1:-1:-1;;;38018:220:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38018:220:0;;;;;;;;;;;;;::::1;;15760:2;38257:33;38274:1;:15;;;38257:12;:16;;:33;;;;:::i;:::-;:51;;38249:78;;;::::0;;-1:-1:-1;;;38249:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38249:78:0;;;;;;;;;;;;;::::1;;38338:4;::::0;::::1;:13:::0;;;38380:12:::1;38362:15;::::0;::::1;:30:::0;38408:68:::1;::::0;;;;;-1:-1:-1;38408:68:0::1;::::0;::::1;::::0;;;;;;;;;38432:10;;38420::::1;::::0;38408:68:::1;::::0;;;;;;;::::1;29691:1;37789:695:::0;;;:::o;36782:557::-;36856:41;36874:10;36886;36856:17;:41::i;:::-;36848:62;;;;;-1:-1:-1;;;36848:62:0;;;;;;;;;;;;-1:-1:-1;;;36848:62:0;;;;;;;;;;;;;;;36954:10;36923:7;36933:32;;;:20;:32;;;;;;;;:44;;;;;;;;;37013:15;:19;;15760:2;;36996:43;;36933:44;;37013:19;;;;;;;;;;;;;;;;:25;;;36996:12;:16;;:43;;;;:::i;:::-;:61;;36988:88;;;;;-1:-1:-1;;;36988:88:0;;;;;;;;;;;;-1:-1:-1;;;36988:88:0;;;;;;;;;;;;;;;37089:5;;37112:15;:19;;-1:-1:-1;;;;;37089:5:0;;;;:10;;37100;;37128:2;;37112:19;;;;;;;;;;;;;;;;:37;;;37089:61;;;;;;;;;;;;;-1:-1:-1;;;;;37089:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37177:15;37193:2;37177:19;;;;;;;;;;;;;;;;:37;:19;;;;;:37;;37161:12;:53;;;;;;;37227:44;37248:10;37260;37227:20;:44::i;:::-;37289:42;;37320:10;;37308;;37289:42;;;;;36782:557;;:::o;51066:265::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;51127:7:::1;::::0;;51158::::1;::::0;;51114:10:::1;51176:11:::0;;;;51198;;;;51220:5:::1;::::0;:26:::1;::::0;;-1:-1:-1;;;51220:26:0;;-1:-1:-1;;;;;51231:7:0::1;51220:26:::0;::::1;;::::0;::::1;::::0;;;;;;;;;51127:7;;51158;;51220:5;;;::::1;::::0;:10:::1;::::0;:26;;;;;;;;;;;51114:10;51220:5;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51257:5:0::1;::::0;51268:7:::1;::::0;51257:26:::1;::::0;;-1:-1:-1;;;51257:26:0;;-1:-1:-1;;;;;51268:7:0;;::::1;51257:26;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;-1:-1:-1;51257:10:0::1;::::0;-1:-1:-1;51257:26:0;;;;;:5:::1;::::0;:26;;;;;;;:5;;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51294:12:0::1;:29:::0;;51310:13;;;::::1;51294:29:::0;;::::1;::::0;;;-1:-1:-1;;51066:265:0:o;38790:463::-;29656:9;29669:10;29656:23;29648:32;;;;;;38921:10:::1;38892:15;38910:22:::0;;;:10:::1;:22;::::0;;;;;;;:34;;;;;;;;38945:16;38910:52:::1;::::0;::::1;;;;;;;;38892:70;;38994:1;38981;:10;;;:14;38973:35;;;::::0;;-1:-1:-1;;;38973:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38973:35:0;;;;;;;;;;;;;::::1;;15760:2;39027:33;39044:1;:15;;;39027:12;:16;;:33;;;;:::i;:::-;:51;;39019:78;;;::::0;;-1:-1:-1;;;39019:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39019:78:0;;;;;;;;;;;;;::::1;;39108:4;::::0;::::1;:13:::0;;;39150:12:::1;39132:15;::::0;::::1;:30:::0;39178:67:::1;::::0;;;;;39232:4:::1;39178:67;::::0;::::1;::::0;;;;;;;;;39202:10;;39190::::1;::::0;39178:67:::1;::::0;;;;;;;::::1;29691:1;38790:463:::0;;;:::o;18222:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18222:45:0;;-1:-1:-1;18222:45:0;;-1:-1:-1;18222:45:0:o;15797:24::-;;;;:::o;51627:119::-;51720:10;51681:4;51704:27;;;:15;:27;;;;;:34;51627:119;:::o;34459:2283::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;34610:28:::1;34641:32:::0;;;:24:::1;:32;::::0;;;;34687:7:::1;::::0;::::1;::::0;34684:27:::1;;34702:7;;;34684:27;34723:17;34743:61;34756:47;34799:3;34756:38;34769:1;:7;;:24;;;34756:8;:12;;:38;;;;:::i;:47::-;34743:8:::0;;:12:::1;:61::i;:::-;34834:11;::::0;::::1;::::0;34723:81;;-1:-1:-1;34817:14:0::1;::::0;34834:11:::1;;:170;;34949:55;34960:43;34989:13:::0;34960:24:::1;:6:::0;34971:12;34960:10:::1;:24::i;:43::-;34949:6:::0;;:10:::1;:55::i;:::-;34834:170;;;34848:55;34859:43;34888:13:::0;34859:24:::1;:6:::0;34870:12;34859:10:::1;:24::i;:43::-;34848:6:::0;;:10:::1;:55::i;:::-;34817:187;;35017:16;35036:49;15542:4;35071:3;:13;35036:30;35054:1;:11;;;35036:1;:13;;;:17;;:30;;;;:::i;:49::-;35017:68;;35099:32;35133:30:::0;35167:41:::1;35182:1;:7;;:25;;;35167:14;:41::i;:::-;35224:11;::::0;::::1;::::0;35098:110;;-1:-1:-1;35098:110:0;-1:-1:-1;35224:11:0::1;;:57:::0;::::1;;;-1:-1:-1::0;35251:13:0::1;::::0;::::1;::::0;:30:::1;::::0;35269:11;35251:17:::1;:30::i;:::-;35239:9;:42;35224:57;:128;;;-1:-1:-1::0;35295:11:0::1;::::0;::::1;::::0;::::1;;35294:12;:58:::0;::::1;;;-1:-1:-1::0;35322:13:0::1;::::0;::::1;::::0;:30:::1;::::0;35340:11;35322:17:::1;:30::i;:::-;35310:9;:42;35294:58;35221:1424;;;35370:5;::::0;35381:14;;35370:55:::1;::::0;;-1:-1:-1;;;35370:55:0;;-1:-1:-1;;;;;35381:14:0;;::::1;35370:55;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:55;;;;;:5:::1;::::0;:55;;;;;;;:5;;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35440:12:0::1;:43:::0;;;::::1;::::0;;-1:-1:-1;;35543:14:0;;-1:-1:-1;35576:17:0;::::1;::::0;35612:13:::1;::::0;::::1;::::0;35644:11:::1;::::0;::::1;::::0;35505:193:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35543:14:0;;::::1;::::0;35505:193:::1;::::0;;;;;;;::::1;35221:1424;;;35780:14:::0;;;35796:17;::::1;::::0;35731:20:::1;::::0;35754:60:::1;::::0;-1:-1:-1;;;;;35780:14:0;;::::1;::::0;35754:25:::1;:60::i;:::-;35845:447;::::0;;::::1;::::0;::::1;::::0;;35869:14;;-1:-1:-1;;;;;35869:14:0::1;35845:447:::0;;35869:14;35902:17;::::1;::::0;35845:447:::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;36090:24:::1;::::0;::::1;::::0;35845:447;;;;36133:11:::1;::::0;::::1;::::0;::::1;;35845:447;;::::0;;;;36163:16:::1;::::0;::::1;::::0;35869:14:::1;35845:447:::0;;;36198:10:::1;::::0;::::1;::::0;35845:447;;;;36227:10:::1;::::0;::::1;::::0;35845:447;;;;-1:-1:-1;35845:447:0;;;;;;;;;;35731:83;;-1:-1:-1;35831:462:0::1;::::0;:13:::1;:462::i;:::-;36384:17;::::0;::::1;::::0;36351:14;;36454:11:::1;::::0;::::1;::::0;36484:16:::1;::::0;::::1;::::0;36315:318:::1;::::0;;;;;36454:11:::1;::::0;;::::1;36315:318;;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36351:14:0;;::::1;::::0;36315:318:::1;::::0;;;;;;;::::1;35221:1424;;36692:14:::0;;36686:4:::1;36708:17:::0;;::::1;::::0;36657:77:::1;::::0;-1:-1:-1;;;;;36692:14:0::1;::::0;36727:6;36657:28:::1;:77::i;:::-;29805:1;;;;;;34459:2283:::0;;;:::o;21114:192::-;20649:7;;-1:-1:-1;;;;;20649:7:0;20635:10;:21;20627:37;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;-1:-1:-1;;;20627:37:0;;;;;;;;;;;;;;;21177:2:::1;::::0;-1:-1:-1;;;;;21177:2:0::1;:23:::0;:44;::::1;;;-1:-1:-1::0;;;;;;21204:17:0;::::1;::::0;::::1;21177:44;21169:53;;;::::0;::::1;;21233:2;:24:::0;;-1:-1:-1;;;;;21233:24:0;::::1;-1:-1:-1::0;;;;;;21233:24:0;;::::1;::::0;::::1;::::0;;;21273:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;;;21273:25:0;;;;;-1:-1:-1;;;;;;;;;;;21273:25:0;;;;;;;::::1;21114:192:::0;:::o;17604:69::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;46668:3185::-;29777:15;;-1:-1:-1;;;;;29777:15:0;29755:10;:38;29747:47;;;;;;46800:19:::1;46833:29:::0;;;:21:::1;:29;::::0;;;;:36:::1;;::::0;-1:-1:-1;;;;;46833:36:0::1;46830:65;;46886:7;;;46830:65;46907:15;46936:29:::0;;;:21:::1;:29;::::0;;;;;;;:36:::1;::::0;::::1;::::0;-1:-1:-1;;;;;46936:36:0::1;46925:48:::0;;:10:::1;:48:::0;;;;;46974:39:::1;::::0;;::::1;::::0;46925:89;;;;;;;;47015:29;;;;;;;:45:::1;::::0;;::::1;::::0;;46925:136;::::1;;;;;;;;46907:154;;47090:1;47077;:10;;;:14;:127;;;;-1:-1:-1::0;47167:15:0::1;::::0;:36:::1;::::0;;-1:-1:-1;;;47167:36:0;;;;47111:93:::1;::::0;-1:-1:-1;;;;;47167:15:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47167:36:0;47111:51:::1;47126:29:::0;;;:21:::1;47167:36;47126:29:::0;;;;;;;:35:::1;;::::0;47111:51;;:14:::1;:51:::0;;;;;;;:55:::1;:93::i;:::-;47095:12;:109;;47077:127;47074:2723;;;47280:11;::::0;::::1;::::0;47335:5:::1;::::0;::::1;::::0;47359:10:::1;::::0;::::1;::::0;47221:17:::1;::::0;47241:143:::1;::::0;47280:11;;47310:6;;47335:5:::1;;::::0;47241:20:::1;:143::i;:::-;47221:163;;47401:13;47417:57;47435:1;:19;;;47456:1;:17;;;47417;:57::i;:::-;47520:29;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47401:73;;-1:-1:-1;47563:1:0::1;47520:44;:56:::0;::::1;;;;47575:1;47568;:4;;;:8;47520:56;:65;;;;-1:-1:-1::0;47580:5:0::1;::::0;::::1;::::0;::::1;;47520:65;:83;;;;;47599:1;:4;;;47589:6;:14;;47520:83;47519:188;;;-1:-1:-1::0;47622:29:0::1;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47665:1:::1;47622:44;:56:::0;::::1;;;;47677:1;47670;:4;;;:8;47622:56;:66;;;;-1:-1:-1::0;47683:5:0::1;::::0;::::1;::::0;::::1;;47682:6;47622:66;:84;;;;;47702:1;:4;;;47692:6;:14;;47622:84;47519:290;;;-1:-1:-1::0;47725:29:0::1;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47768:1:::1;47725:44;:56:::0;::::1;;;;47780:1;47773;:4;;;:8;47725:56;:65;;;;-1:-1:-1::0;47785:5:0::1;::::0;::::1;::::0;::::1;;47725:65;:83;;;;;47804:1;:4;;;47794:6;:14;;47725:83;47519:393;;;-1:-1:-1::0;47827:29:0::1;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;47870:1:::1;47827:44;:56:::0;::::1;;;;47882:1;47875;:4;;;:8;47827:56;:66;;;;-1:-1:-1::0;47888:5:0::1;::::0;::::1;::::0;::::1;;47887:6;47827:66;:84;;;;;47907:1;:4;;;47897:6;:14;;47827:84;47516:516;;;47948:68;15542:4;48002:3;:13;47948:49;47961:15;;;;;;;;;-1:-1:-1::0;;;;;47961:15:0::1;-1:-1:-1::0;;;;;47961:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;47948:68;47931:85;;47516:516;48091:29;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;48134:1:::1;48091:44;:101:::0;::::1;;;-1:-1:-1::0;48156:36:0::1;48160:23:::0;-1:-1:-1;;48156:32:0::1;:36::i;:::-;48139:13;:53;;48091:101;48088:208;;;48229:51;48276:3;48229:42;48242:15;;;;;;;;;-1:-1:-1::0;;;;;48242:15:0::1;-1:-1:-1::0;;;;;48242:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;48229:51;48212:68;;48088:208;48315:18:::0;;48312:1474:::1;;48353:7;48363:56;48404:13:::0;48363:32:::1;48367:8:::0;48381:13;48363:17:::1;:32::i;:56::-;48515:8:::0;;48353:66;;-1:-1:-1;48440:436:0::1;::::0;48479:13;;-1:-1:-1;;;;;48515:8:0::1;;48546::::0;::::1;;:68;;48583:31;48601:11;:3:::0;-1:-1:-1;;48601:7:0::1;:11::i;48583:31::-;48546:68;;;48557:23;:8:::0;48575:3;48557:12:::1;:23::i;:::-;48674:29;::::0;;;:21:::1;:29;::::0;;;;:39:::1;;::::0;48637:14;;48717:1:::1;48674:44;:183;;48795:62;15542:4;48843:3;:13;48795:43;48808:15;;;;;;;;;-1:-1:-1::0;;;;;48808:15:0::1;-1:-1:-1::0;;;;;48808:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48808:29:0;48795:8;;:12:::1;:43::i;:62::-;48674:183;;;48721:50;48767:3;48721:41;48734:15;;;;;;;;;-1:-1:-1::0;;;;;48734:15:0::1;-1:-1:-1::0;;;;;48734:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;48440:436;49048:29;::::0;;;:21:::1;:29;::::0;;;;:39;;;48974:11;::::1;::::0;48943:8;;49008:17:::1;::::0;::::1;::::0;49110:39:::1;::::0;;::::1;::::0;49201:5:::1;::::0;::::1;::::0;49229:10:::1;::::0;::::1;::::0;-1:-1:-1;;;;;49048:39:0;;::::1;::::0;48974:11;;48943:8;;::::1;::::0;48902:488:::1;::::0;49008:17;;49110:39;49172:6;;49201:5:::1;::::0;;::::1;::::0;49262:8;49293:3;49319:14;49356:15:::1;:13;:15::i;:::-;48902:488;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;49449:8:::0;;;49480:11;::::1;::::0;49514:17:::1;::::0;::::1;::::0;49411:139:::1;::::0;-1:-1:-1;;;;;49449:8:0::1;::::0;49480:11;49411:15:::1;:139::i;:::-;49571:5;::::0;::::1;49582:29:::0;;;:21:::1;:29;::::0;;;;;:39;49571:67;;-1:-1:-1;;;49571:67:0;;-1:-1:-1;;;;;49582:39:0;;::::1;49571:67;::::0;::::1;::::0;;;;;;;;;:5;::::1;::::0;:10:::1;::::0;:67;;;;;:5;;:67;;;;;;:5;;:67;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;49657:51:0::1;49672:29:::0;;;:21:::1;:29;::::0;;;;;;;:35:::1;;::::0;49657:51;;:14:::1;:51:::0;;;;;49711:12:::1;49657:66:::0;;-1:-1:-1;;49742:10:0::1;:28:::0;;;::::1;::::0;;48312:1474:::1;-1:-1:-1::0;;;49816:29:0::1;::::0;;;-1:-1:-1;;49816:21:0::1;:29;::::0;;;;49809:36;;-1:-1:-1;;;;;;49809:36:0;;::::1;::::0;;-1:-1:-1;49809:36:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;46668:3185::o;42323:1462::-;29656:9;29669:10;29656:23;29648:32;;;;;;42498:1:::1;42484:10;:15;;:34;;;;;42517:1;42503:10;:15;;42484:34;42476:63;;;::::0;;-1:-1:-1;;;42476:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42476:63:0;;;;;;;;;;;;;::::1;;42569:1;42558:8;:12;:28;;;;;42585:1;42574:8;:12;42558:28;42550:55;;;::::0;;-1:-1:-1;;;42550:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42550:55:0;;;;;;;;;;;;;::::1;;42638:7;::::0;-1:-1:-1;;;;;42638:7:0::1;42624:10;:21;::::0;:70:::1;;-1:-1:-1::0;42684:10:0::1;42649:3;-1:-1:-1::0;;42653:10:0;;42649:15:::1;::::0;::::1;;;;;;::::0;:31:::1;::::0;;-1:-1:-1;;;42649:31:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;42649:15:0;;::::1;::::0;:23:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;;:15;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42649:31:0;-1:-1:-1;;;;;42649:45:0::1;;42624:70;42616:89;;;::::0;;-1:-1:-1;;;42616:89:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42616:89:0;;;;;;;;;;;;;::::1;;42767:15;::::0;:36:::1;::::0;;-1:-1:-1;;;42767:36:0;;;;42740:64:::1;::::0;-1:-1:-1;;;;;42767:15:0::1;::::0;:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42767:36:0;42740:22:::1;::::0;;;:14:::1;42767:36;42740:22:::0;;;;;;:26:::1;:64::i;:::-;42724:12;:80;;42716:109;;;::::0;;-1:-1:-1;;;42716:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42716:109:0;;;;;;;;;;;;;::::1;;42881:15;::::0;42899:28:::1;::::0;;-1:-1:-1;;;42899:28:0;;;;15446:42:::1;::::0;42838:22:::1;::::0;42861:10:::1;::::0;-1:-1:-1;;;;;42881:15:0;;::::1;::::0;;;42899:26:::1;::::0;:28:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;42881:15;42899:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42899:28:0;42838:90:::1;::::0;;-1:-1:-1;;;;;;42838:90:0::1;::::0;;;;;;-1:-1:-1;;;;;42838:90:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;;;42899:28:::1;::::0;42838:90;;;;;;;-1:-1:-1;42838:90:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42939:10:0::1;::::0;-1:-1:-1;42979:1:0::1;42965:15:::0;::::1;42962:539;;;43004:33;43022:2;43026:10;43004:17;:33::i;:::-;42996:54;;;::::0;;-1:-1:-1;;;42996:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42996:54:0;;;;;;;;;;;;;::::1;;43073:15;::::0;:39:::1;::::0;;-1:-1:-1;;;43073:39:0;;::::1;::::0;::::1;::::0;;;43110:1:::1;43073:39:::0;;;;;;-1:-1:-1;;;;;43073:15:0;;::::1;::::0;:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:15:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43073:39:0;;-1:-1:-1;42962:539:0::1;;;-1:-1:-1::0;;;;;43151:14:0;::::1;43207:1;43151:14:::0;;;:10:::1;:14;::::0;;;;;;;:26;;;;;;;;43178:16;43151:44:::1;::::0;::::1;;;;;;;;:53;;;:57;43143:78;;;::::0;;-1:-1:-1;;;43143:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43143:78:0;;;;;;;;;;;;;::::1;;43244:10;43258:1;43244:15;;:70;;;-1:-1:-1::0;;;;;;43263:14:0;::::1;43313:1;43263:14:::0;;;:10:::1;:14;::::0;;;;;;;:26;;;;;;;;43290:16;43263:44:::1;::::0;::::1;;;;;;;;:47;;;:51;43244:70;43236:88;;;::::0;;-1:-1:-1;;;43236:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43236:88:0;;;;;;;;;;;;;::::1;;43347:10;43361:1;43347:15;;:70;;;-1:-1:-1::0;;;;;;43366:14:0;::::1;43416:1;43366:14:::0;;;:10:::1;:14;::::0;;;;;;;:26;;;;;;;;43393:16;43366:44:::1;::::0;::::1;;;;;;;;:47;;;:51;43347:70;43339:88;;;::::0;;-1:-1:-1;;;43339:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43339:88:0;;;;;;;;;;;;;::::1;;43450:15;::::0;:39:::1;::::0;;-1:-1:-1;;;43450:39:0;;::::1;::::0;::::1;::::0;;;43487:1:::1;43450:39:::0;;;;;;-1:-1:-1;;;;;43450:15:0;;::::1;::::0;:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:15:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43450:39:0;;-1:-1:-1;42962:539:0::1;43513:25;43541:28:::0;;;:21:::1;:28;::::0;;;;43580:24;;43594:10:::1;-1:-1:-1::0;;;;;;43580:24:0;;::::1;;::::0;;-1:-1:-1;43615:7:0;::::1;:17:::0;;;;43644:8:::1;::::0;::::1;:14:::0;;;;::::1;-1:-1:-1::0;;;;;43644:14:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;43670:11:0::1;::::0;::::1;:25:::0;;;;43706:17:::1;::::0;::::1;:36:::0;43753:11:::1;;:24:::0;42323:1462::o;15289:29::-;;;-1:-1:-1;;;;;15289:29:0;;:::o;29026:291::-;29069:4;29075;29092:17;29111;29134:2;;;;;;;;;-1:-1:-1;;;;;29134:2:0;-1:-1:-1;;;;;29134:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29134:16:0;;;;;;;29187:5;;29164:2;;29134:16;29164:11;;-1:-1:-1;;;29164:11:0;;;;29134:16;;-1:-1:-1;29134:16:0;;-1:-1:-1;;;;;;29187:5:0;;;;29164:2;;;:9;;:11;;;;;29134:16;29164:11;;;;;;:2;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29164:11:0;-1:-1:-1;;;;;29164:29:0;;29161:149;;;-1:-1:-1;;;;;29209:29:0;;;;-1:-1:-1;29209:29:0;;-1:-1:-1;29209:29:0;;29161:149;-1:-1:-1;;;;;29269:29:0;;;;-1:-1:-1;29269:29:0;;-1:-1:-1;29026:291:0;;;:::o;6254:220::-;6312:7;6336:6;6332:20;;-1:-1:-1;6351:1:0;6344:8;;6332:20;6375:5;;;6379:1;6375;:5;:1;6399:5;;;;;:10;6391:56;;;;-1:-1:-1;;;6391:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6465:1;6254:220;-1:-1:-1;;;6254:220:0:o;6952:153::-;7010:7;7042:1;7038;:5;7030:44;;;;;-1:-1:-1;;;7030:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7096:1;7092;:5;;;;;;;6952:153;-1:-1:-1;;;6952:153:0:o;5837:158::-;5895:7;5928:1;5923;:6;;5915:49;;;;;-1:-1:-1;;;5915:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5982:5:0;;;5837:158::o;5375:179::-;5433:7;5465:5;;;5489:6;;;;5481:46;;;;;-1:-1:-1;;;5481:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;23449:552;23514:23;23539:21;23572:11;23586:72;15542:4;23644:3;:13;23586:53;23609:15;;;;;;;;;-1:-1:-1;;;;;23609:15:0;-1:-1:-1;;;;;23609:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23609:29:0;23586:18;;:22;:53::i;:72::-;23572:86;;23669:11;23683:72;15542:4;23741:3;:13;23683:53;23706:15;;;;;;;;;-1:-1:-1;;;;;23706:15:0;-1:-1:-1;;;;;23706:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23706:29:0;23683:18;;:22;:53::i;:72::-;23669:86;-1:-1:-1;23787:42:0;23669:86;23787:30;:18;23810:6;23787:22;:30::i;:::-;:34;;:42::i;:::-;23766:63;;23859:54;15542:4;23859:39;23882:15;:13;:15::i;:::-;23859:18;;:22;:39::i;:54::-;23934:7;;23840:73;;-1:-1:-1;23934:19:0;;23946:6;23934:11;:19::i;:::-;23924:7;:29;23974:7;;:19;;23986:6;23974:11;:19::i;:::-;23964:7;:29;;;;23449:552;;;;;:::o;23073:306::-;23161:10;;23183:189;15678:1;23199;:23;23183:189;;;-1:-1:-1;;;;;23246:18:0;;;;;;:10;:18;;;;;;;;:29;;;;;;;;23276:1;23246:32;;;;;;;;;;:41;;;23291:1;23246:46;23243:118;;;23320:1;23312:9;;23340:5;;23243:118;23224:3;;23183:189;;;;23073:306;;;;:::o;24041:1282::-;24105:5;:9;;;24102:577;;;24152:1;24141:5;:8;;;:12;:108;;24248:1;24141:108;;;24156:89;24176:68;15542:4;24240:3;24230:13;24176:49;24210:5;:14;;;24176:29;24196:5;:8;;;24176:5;:15;;;:19;;:29;;;;:::i;:68::-;24156:15;;;;;:19;:89::i;:::-;24130:8;;;:119;24275:8;;;;:108;;24382:1;24275:108;;;24290:89;24310:68;15542:4;24374:3;24364:13;24310:49;24344:5;:14;;;24310:29;24330:5;:8;;;24310:5;:15;;;:19;;:29;;;;:::i;:68::-;24290:15;;;;;:19;:89::i;:::-;24264:8;;;:119;24102:577;;;24436:1;24425:5;:8;;;:12;:108;;24532:1;24425:108;;;24440:89;24460:68;15542:4;24524:3;24514:13;24460:49;24494:5;:14;;;24460:29;24480:5;:8;;;24460:5;:15;;;:19;;:29;;;;:::i;24440:89::-;24414:8;;;:119;24559:8;;;;:108;;24666:1;24559:108;;;24574:89;24594:68;15542:4;24658:3;24648:13;24594:49;24628:5;:14;;;24594:29;24614:5;:8;;;24594:5;:15;;;:19;;:29;;;;:::i;24574:89::-;24548:8;;;:119;24102:577;24702:12;;-1:-1:-1;;;;;24691:24:0;;;;;:10;:24;;;;;;;;24716:15;;;;24691:41;;;;;;;;;24733:21;;;;24758:5;;24691:41;:64;;;;;;;:72;;:64;;;;;;;;;:72;;-1:-1:-1;;;;;;24691:72:0;-1:-1:-1;;;;;24691:72:0;;;;;;;;;;;-1:-1:-1;24691:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24691:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24790:12;;24774:29;;-1:-1:-1;24774:29:0;;;:15;:29;;;;;;24804:15;;;;;24774:46;;;;;;;;:48;;;;;;24854:12;;24838:29;;;;;;;;;;24868:15;;24838:46;;;;;;;;;:51;24835:226;;;24964:15;;;;;;24952:28;;;;:11;:28;;;;;;;:35;24919:12;;-1:-1:-1;;;;;24905:27:0;;;;;:13;:27;;;;;24933:15;;24905:44;;;;;;;:82;;;;25014:15;;25002:28;;;;;;;25036:12;;25002:47;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25002:47:0;;;;;;;;;;;24835:226;25073:15;;25110;;;;25127:23;;;;25073:15;25152:14;;;25073:94;;;-1:-1:-1;;;25073:94:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25073:15:0;;;;:36;;:94;;;;;:15;;:94;;;;;;;;:15;;:94;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25227:12:0;;-1:-1:-1;;;;;25219:21:0;;;;;:7;:21;;;;;:38;:43;;-1:-1:-1;25219:55:0;;-1:-1:-1;25219:55:0;25271:3;25219:55;;;25265:3;25219:55;25186:12;;-1:-1:-1;;;;;25178:21:0;;;;;:7;:21;;;;;;;;:96;;;;;;;25300:12;25285:28;;:14;:28;;;:30;;;;;;24041:1282::o;27129:500::-;-1:-1:-1;;;;;27299:29:0;;27289:7;27299:29;;;:20;:29;;;;;;;;:41;;;;;;;;;27373:15;27389:22;;-1:-1:-1;;27389:24:0;;;27373:41;;;;;;;;;;;;;;;;27351:15;27367:2;27351:19;;;;;;;;;;;;;;;:63;;:19;;;;;:63;;-1:-1:-1;;;;;;27351:63:0;-1:-1:-1;;;;;27351:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27351:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27446:15;:19;;27507:2;;27425:20;;27351:19;;27507:2;;27446:19;;;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;27446:26:0;27425:48;;;;;;;;;;;;27474:15;:19;;27425:48;;27446:19;27490:2;;27474:19;;;;;;;;;;;;;;:29;:19;;;;;:29;;;;;27425:79;;;;;;;;;;;;;;;:84;;;;-1:-1:-1;;;;;27548:29:0;;;;:20;:29;;;;;:41;;;;;;;;27541:48;27600:15;:21;;;;;;;;;;;;;;;-1:-1:-1;;27600:21:0;;;;;;;;;-1:-1:-1;;;;;;27600:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27600:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27129:500:0:o;22536:452::-;22638:20;22688:42;22714:15;:13;:15::i;:::-;22688:21;:6;15542:4;22688:10;:21::i;:42::-;22670:60;;22788:14;22805:89;22825:68;22889:3;22825:59;22845:15;;;;;;;;;-1:-1:-1;;;;;22845:15:0;-1:-1:-1;;;;;22845:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22825:68;22805:15;;:19;:89::i;:::-;22788:106;;22941:9;22923:15;:27;:57;;22965:15;22923:57;;21890:610;22038:5;22061:3;:227;;22185:103;22277:9;22185:83;22258:8;22185:64;-1:-1:-1;;22185:64:0;22190:12;22277:9;22186:21;:37::i;:::-;22185:43;;:64::i;:103::-;22061:227;;;22067:102;22158:9;22067:82;22139:8;22067:63;22111:18;22067:63;22072:12;22158:9;22068:21;:37::i;22067:102::-;22057:231;-1:-1:-1;22309:24:0;15542:4;-1:-1:-1;;22309:18:0;:24::i;:::-;22305:1;:28;:59;;22363:1;22305:59;;;22336:24;15542:4;-1:-1:-1;;22336:18:0;:24::i;:::-;22301:63;;22383:51;15542:4;22387:15;;;;;;;;;-1:-1:-1;;;;;22387:15:0;-1:-1:-1;;;;;22387:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22387:26:0;;22383:35;:51::i;:::-;22379:1;:55;:113;;22491:1;22379:113;;;22437:51;15542:4;22441:15;;;;;;;;;-1:-1:-1;;;;;22441:15:0;-1:-1:-1;;;;;22441:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22437:51;22375:117;21890:610;-1:-1:-1;;;;;21890:610:0:o;10579:568::-;10635:6;10879;10875:47;;-1:-1:-1;10909:1:0;10902:8;;10875:47;10944:1;-1:-1:-1;;10944:7:0;:27;;;;;-1:-1:-1;;;10955:1:0;:16;10944:27;10942:30;10934:82;;;;-1:-1:-1;;;10934:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11040:5;;;11044:1;11040;:5;:1;11064:5;;;;;:10;11056:62;;;;-1:-1:-1;;;11056:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11621:271;11677:6;11704;11696:51;;;;;-1:-1:-1;;;11696:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11768:1;-1:-1:-1;;11768:7:0;:27;;;;;-1:-1:-1;;;11779:1:0;:16;11768:27;11766:30;11758:76;;;;-1:-1:-1;;;11758:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11847:8;11862:1;11858;:5;;;;;;;11621:271;-1:-1:-1;;;;11621:271:0:o;27721:1266::-;27907:4;;;:35;;;-1:-1:-1;;;27907:35:0;;;;;;;;;;-1:-1:-1;;;;;27907:4:0;;;;:27;;:35;;;;;;;;;;:4;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27973:27;27993:6;27973:15;:19;;:27;;;;:::i;:::-;27958:11;:42;;:108;;;;-1:-1:-1;28030:36:0;28034:23;-1:-1:-1;;28030:32:0;:36::i;:::-;28013:14;:53;27958:108;27955:1025;;;28096:44;28124:15;28096:23;:11;28112:6;28096:15;:23::i;:44::-;-1:-1:-1;;;;;28160:16:0;;;28197:1;28160:16;;;:7;:16;;;;;:25;;;28082:58;;-1:-1:-1;28160:25:0;28157:812;;28255:15;;:27;;;-1:-1:-1;;;28255:27:0;;;;28219:17;;28239:63;;28288:13;;28239:44;;-1:-1:-1;;;;;28255:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;28239:63;28323:5;;28219:83;;-1:-1:-1;;;;;;28323:5:0;:10;28334:7;28343:29;:11;28219:83;28343:15;:29::i;:::-;28323:50;;;;;;;;;;;;;-1:-1:-1;;;;;28323:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28392:12:0;:42;;28408:26;;;28392:42;;;;;;-1:-1:-1;28157:812:0;;-1:-1:-1;28157:812:0;;28511:15;;:27;;;-1:-1:-1;;;28511:27:0;;;;28473:19;;28495:63;;28544:13;;28495:44;;-1:-1:-1;;;;;28511:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;28495:63;28473:85;-1:-1:-1;28577:15:0;28595:31;:11;28473:85;28595:15;:31::i;:::-;28647:5;;:31;;;-1:-1:-1;;;28647:31:0;;-1:-1:-1;;;;;28647:31:0;;;;;;;;;;;;;;;28577:49;;-1:-1:-1;28647:5:0;;;:10;;:31;;;;;:5;;:31;;;;;;;;:5;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28697:5:0;;-1:-1:-1;;;;;28708:16:0;;;28697:5;28708:16;;;:7;:16;;;;;;28697:5;28708:25;;28697:53;;-1:-1:-1;;;28697:53:0;;28708:25;;;28697:53;;;;;;;;;;;;:5;;;;;-1:-1:-1;28697:10:0;;-1:-1:-1;28697:53:0;;;;;:5;;:53;;;;;;:5;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;28809:16:0;;;28771:27;28809:16;;;28801:7;28809:16;;;;;;:25;;;;;;28801:34;;;28854:33;;:51;;;;;;;;-1:-1:-1;;28926:12:0;:27;;;;;;28157:812;27721:1266;;;;;:::o;25379:990::-;-1:-1:-1;;;;;25522:18:0;;25504:15;25522:18;;;:10;:18;;;;;;;;:29;;;;;;;;25552:15;25522:46;;;;;;;-1:-1:-1;;;;;25601:21:0;;;25579:19;25601:21;;;:13;:21;;;;;;;;:32;;;;;;;;;;25679:15;;25522:46;;;;;;;;;25727:19;;;;25748:10;;;;25679:80;;-1:-1:-1;;;25679:80:0;;;;;;;;;;;;;;;;;;;;;25522:46;;-1:-1:-1;25679:15:0;;;;;:36;;:80;;;;;25579:19;25679:80;;;;;;25579:19;25679:15;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;25817:23:0;;;;;;:15;:23;;;;;;;;:34;;;;;;;;;25855:1;25817:39;25814:313;;;25872:19;25894:22;;;:11;:22;;;;;25953:8;;25894:22;;-1:-1:-1;;25953:10:0;;;25951:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25951:13:0;25931:1;25933:14;25931:17;;;;;;;;;;;;;;;;:33;;;;;-1:-1:-1;;;;;25931:33:0;;;;;-1:-1:-1;;;;;25931:33:0;;;;;;26025:14;25979:13;:32;25993:1;25995:14;25993:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25993:17:0;;;25979:32;;;;;;;;;;;;;;;:43;;;;;;;;:60;;;;26061:21;;;;;:13;:21;;;;;:32;;;;;;;;;26054:39;26108:7;;:1;;:7;;;;;;;;;;;;;;-1:-1:-1;;26108:7:0;;;;;-1:-1:-1;;;;;;26108:7:0;;;;;;-1:-1:-1;25814:313:0;-1:-1:-1;;;;;26225:18:0;;;;;;:10;:18;;;;;;;;:29;;;;;;;;26255:15;26225:46;;;;;;;;;;26218:53;;-1:-1:-1;;;;;;26218:53:0;;;26225:46;26218:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26218:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26282:23:0;;;;;;:15;:23;;;;;;;;:34;;;;;;;;;:36;;-1:-1:-1;;26282:36:0;;;26346:12;26331:28;;:14;:28;;;;;;:30;;;;;;;;-1:-1:-1;;;25379:990:0:o;26417:673::-;-1:-1:-1;;;;;26558:24:0;;26532:23;26558:24;;;:15;:24;;;;;;26593:438;26613:15;;26609:19;;26593:438;;;26667:6;26652:8;26661:1;26652:11;;;;;;;;;;;;;;;;:21;26649:371;;;26696:5;26693:191;;;-1:-1:-1;;;;;26726:31:0;;;;;;:22;:31;;;;;;;;:43;;;;;;;;:45;;-1:-1:-1;;26726:45:0;;;26693:191;;;-1:-1:-1;;;;;26818:32:0;;;;;;:23;:32;;;;;;;;:44;;;;;;;;:46;;-1:-1:-1;;26818:46:0;;;26693:191;26927:15;;26918:8;;-1:-1:-1;;26927:17:0;;;26918:27;;;;;;;;;;;;;;26904:8;26913:1;26904:11;;;;;;;;;;;;;;;:41;;;;26964:8;:14;;;;;;;;;;;;;;;;;;;;;;;;26999:5;;26649:371;26630:3;;26593:438;;;-1:-1:-1;;27050:32:0;;;;:24;:32;;;;;27043:39;;-1:-1:-1;;;;;;27043:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27043:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26417:673:0:o;12143:218::-;12199:6;12229:5;;;12254:6;;;;;;:16;;;12269:1;12264;:6;;12254:16;12253:38;;;;12280:1;12276;:5;:14;;;;;12289:1;12285;:5;12276:14;12245:87;;;;-1:-1:-1;;;12245:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://eaa69de5a7d1367e8078de9fd21c3d22bd29e1d8590bab2970827c5ec47ae6ac

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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