valr-typescript-client 1.0.21 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHECKSUMS.txt +13 -13
- package/dist/index.d.mts +193 -35
- package/dist/index.d.ts +193 -35
- package/dist/index.js +84 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +84 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/ValrError.ts","../src/utils/constants.ts","../src/utils/http.ts","../src/auth/RequestSigner.ts","../src/api/public.ts","../src/api/account.ts","../src/api/trading.ts","../src/api/wallets.ts","../src/api/futures.ts","../src/api/margin.ts","../src/api/loans.ts","../src/api/stake.ts","../src/api/pay.ts","../src/api/bundles.ts","../src/api/health.ts","../src/client/ValrClient.ts","../src/client/ValrWebSocketClient.ts","../src/client/AccountWebSocket.ts","../src/client/TradeWebSocket.ts"],"names":["axios","createHmac","config","EventEmitter","WebSocket"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for all VALR API errors\n */\nexport class ValrError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValrError';\n Object.setPrototypeOf(this, ValrError.prototype);\n }\n}\n\n/**\n * Error thrown when API authentication fails\n */\nexport class ValrAuthenticationError extends ValrError {\n constructor(message: string = 'Authentication failed') {\n super(message);\n this.name = 'ValrAuthenticationError';\n Object.setPrototypeOf(this, ValrAuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when API rate limit is exceeded\n */\nexport class ValrRateLimitError extends ValrError {\n constructor(message: string = 'Rate limit exceeded') {\n super(message);\n this.name = 'ValrRateLimitError';\n Object.setPrototypeOf(this, ValrRateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when API request validation fails\n */\nexport class ValrValidationError extends ValrError {\n public readonly errors?: Record<string, string[]>;\n\n constructor(message: string, errors?: Record<string, string[]>) {\n super(message);\n this.name = 'ValrValidationError';\n this.errors = errors;\n Object.setPrototypeOf(this, ValrValidationError.prototype);\n }\n}\n\n/**\n * Error thrown when API request fails due to network or server error\n */\nexport class ValrApiError extends ValrError {\n public readonly statusCode?: number;\n public readonly response?: unknown;\n\n constructor(message: string, statusCode?: number, response?: unknown) {\n super(message);\n this.name = 'ValrApiError';\n this.statusCode = statusCode;\n this.response = response;\n Object.setPrototypeOf(this, ValrApiError.prototype);\n }\n}\n\n/**\n * Error thrown when WebSocket connection fails\n */\nexport class ValrWebSocketError extends ValrError {\n constructor(message: string) {\n super(message);\n this.name = 'ValrWebSocketError';\n Object.setPrototypeOf(this, ValrWebSocketError.prototype);\n }\n}\n\n/**\n * Error thrown when required configuration is missing\n */\nexport class ValrConfigurationError extends ValrError {\n constructor(message: string) {\n super(message);\n this.name = 'ValrConfigurationError';\n Object.setPrototypeOf(this, ValrConfigurationError.prototype);\n }\n}\n","/**\n * VALR API constants\n */\n\n/**\n * Base URL for VALR API\n */\nexport const API_BASE_URL = 'https://api.valr.com';\nexport const WS_BASE_URL = 'wss://api.valr.com';\n\n/**\n * WebSocket URLs\n */\nexport const WS_ACCOUNT_URL_PATH = '/ws/account';\nexport const WS_TRADE_URL_PATH = '/ws/trade';\n\n/**\n * API rate limits\n */\nexport const RATE_LIMITS = {\n /** Global rate limit per API key */\n PER_KEY_PER_MINUTE: 2000,\n /** Global rate limit per IP */\n PER_IP_PER_MINUTE: 1200,\n /** WebSocket new connections per minute */\n WS_CONNECTIONS_PER_MINUTE: 60,\n /** Specific endpoint limits (per second) */\n ENDPOINTS: {\n PUBLIC_TIME: 20,\n PUBLIC_STATUS: 20,\n PUBLIC_BUCKETS: 20,\n BATCH_ORDERS: 400,\n DELETE_ORDERS: 450,\n POST_ORDERS: 400,\n MODIFY_ORDERS: 400,\n LOANS: 1,\n CREATE_SUBACCOUNT: 1,\n SUBACCOUNT_TRANSFER: 20,\n },\n} as const;\n\n/**\n * HTTP request headers\n */\nexport const HEADERS = {\n API_KEY: 'X-VALR-API-KEY',\n SIGNATURE: 'X-VALR-SIGNATURE',\n TIMESTAMP: 'X-VALR-TIMESTAMP',\n SUB_ACCOUNT_ID: 'X-VALR-SUB-ACCOUNT-ID',\n CONTENT_TYPE: 'Content-Type',\n RATE_LIMITED: 'x-valr-ratelimited',\n} as const;\n\n/**\n * API content type\n */\nexport const CONTENT_TYPE_JSON = 'application/json';\n\n/**\n * API version prefixes\n */\nexport const API_VERSION = {\n V1: '/v1',\n V2: '/v2',\n} as const;\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport {\n ValrApiError,\n ValrAuthenticationError,\n ValrRateLimitError,\n ValrValidationError,\n} from '../errors/ValrError';\nimport { API_BASE_URL, CONTENT_TYPE_JSON, HEADERS } from './constants';\n\n/**\n * HTTP client configuration\n */\nexport interface HttpClientConfig {\n baseURL?: string;\n timeout?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * HTTP client wrapper for VALR API\n */\nexport class HttpClient {\n private axiosInstance: AxiosInstance;\n\n constructor(config: HttpClientConfig = {}) {\n this.axiosInstance = axios.create({\n baseURL: config.baseURL || API_BASE_URL,\n timeout: config.timeout || 30000,\n headers: {\n [HEADERS.CONTENT_TYPE]: CONTENT_TYPE_JSON,\n ...config.headers,\n },\n });\n\n // Response interceptor for error handling\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response) {\n const { status, data, headers } = error.response;\n\n // Check for rate limiting\n if (status === 429 || headers[HEADERS.RATE_LIMITED] === 'true') {\n throw new ValrRateLimitError(\n data?.message || 'API rate limit exceeded'\n );\n }\n\n // Check for authentication errors\n if (status === 401 || status === 403) {\n throw new ValrAuthenticationError(\n data?.message || 'Authentication failed'\n );\n }\n\n // Check for validation errors\n if (status === 400) {\n throw new ValrValidationError(\n data?.message || 'Validation failed',\n data?.errors\n );\n }\n\n // Generic API error\n throw new ValrApiError(\n data?.message || `API request failed with status ${status}`,\n status,\n data\n );\n }\n\n // Network or other errors\n throw new ValrApiError(\n error.message || 'Network error occurred',\n undefined,\n error\n );\n }\n );\n }\n\n /**\n * Perform GET request\n */\n async get<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.get<T>(url, config);\n }\n\n /**\n * Perform POST request\n */\n async post<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.post<T>(url, data, config);\n }\n\n /**\n * Perform PUT request\n */\n async put<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.put<T>(url, data, config);\n }\n\n /**\n * Perform PATCH request\n */\n async patch<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.patch<T>(url, data, config);\n }\n\n /**\n * Perform DELETE request\n */\n async delete<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.delete<T>(url, config);\n }\n\n /**\n * Set default header\n */\n setHeader(key: string, value: string): void {\n this.axiosInstance.defaults.headers.common[key] = value;\n }\n\n /**\n * Remove default header\n */\n removeHeader(key: string): void {\n delete this.axiosInstance.defaults.headers.common[key];\n }\n\n /**\n * Get the underlying Axios instance\n */\n getInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","import { createHmac } from 'crypto';\n\n/**\n * Request signing configuration\n */\nexport interface SignRequestParams {\n /** API secret key for HMAC signing */\n apiSecret: string;\n /** Unix timestamp in milliseconds */\n timestamp: number;\n /** HTTP verb (GET, POST, PUT, DELETE, etc.) */\n verb: string;\n /** Request path (including query string, excluding host) */\n path: string;\n /** Request body as string (optional, empty string if no body) */\n body?: string;\n /** Subaccount ID (optional, for subaccount impersonation) */\n subaccountId?: string;\n}\n\n/**\n * Request signer for VALR API authentication\n * Implements HMAC SHA512 signature generation as per VALR API specification\n */\nexport class RequestSigner {\n static lastUsedTimeStamp: number = 0;\n /**\n * Generate HMAC SHA512 signature for VALR API request\n *\n * Signature is computed from concatenation of:\n * timestamp + verb + path + body + subaccountId\n *\n * @param params - Request signing parameters\n * @returns Hex-encoded HMAC SHA512 signature\n *\n * @example\n * ```typescript\n * const signature = RequestSigner.signRequest({\n * apiSecret: 'your-api-secret',\n * timestamp: Date.now(),\n * verb: 'GET',\n * path: '/v1/account/balances',\n * });\n * ```\n */\n static signRequest(params: SignRequestParams): string {\n const {\n apiSecret,\n timestamp,\n verb,\n path,\n body = '',\n subaccountId = '',\n } = params;\n\n // Concatenate all parameters in the required order\n const payload = `${timestamp}${verb.toUpperCase()}${path}${body}${subaccountId}`;\n\n // Create HMAC SHA512 hash\n const hmac = createHmac('sha512', apiSecret);\n hmac.update(payload);\n\n // Return hex-encoded signature\n return hmac.digest('hex');\n }\n\n /**\n * Get current timestamp in milliseconds\n * Guarantees unique timestamps by waiting for the next millisecond if necessary\n *\n * @returns Unix timestamp in milliseconds (guaranteed unique and monotonically increasing)\n */\n static getTimestamp(): number {\n let now = Date.now();\n\n // Spin-lock: wait until we get a timestamp greater than the last used one\n while (now <= this.lastUsedTimeStamp) {\n now = Date.now();\n }\n\n this.lastUsedTimeStamp = now;\n return now;\n }\n\n /**\n * Validate API credentials\n *\n * @param apiKey - API key\n * @param apiSecret - API secret\n * @throws Error if credentials are invalid\n */\n static validateCredentials(apiKey: string, apiSecret: string): void {\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('Invalid API key: must be a non-empty string');\n }\n\n if (!apiSecret || typeof apiSecret !== 'string') {\n throw new Error('Invalid API secret: must be a non-empty string');\n }\n\n // VALR API keys and secrets are 64 characters long\n if (apiKey.length !== 64) {\n throw new Error('Invalid API key: must be 64 characters long');\n }\n\n if (apiSecret.length !== 64) {\n throw new Error('Invalid API secret: must be 64 characters long');\n }\n\n // Validate hex format (only alphanumeric characters)\n const hexRegex = /^[a-f0-9]+$/i;\n if (!hexRegex.test(apiKey)) {\n throw new Error('Invalid API key: must be hexadecimal');\n }\n\n if (!hexRegex.test(apiSecret)) {\n throw new Error('Invalid API secret: must be hexadecimal');\n }\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ServerTime,\n ValrStatus,\n Currency,\n CurrencyPairInfo,\n MarketSummary,\n OrderBook,\n Trade,\n CurrencyPairOrderTypes,\n PriceBucket,\n FuturesInfo,\n FundingRateHistory,\n LoanInfo,\n LeverageOption,\n TradeHistoryParams,\n PriceBucketsParams,\n OrderTypesParams,\n CurrencyPair,\n PairType,\n} from '../types';\n\n/**\n * Public API methods (no authentication required)\n */\nexport class PublicAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get server time\n * GET /v1/public/time\n *\n * @returns Server time with Unix epoch and ISO timestamp\n */\n async getServerTime(): Promise<ServerTime> {\n const response = await this.http.get<ServerTime>('/v1/public/time');\n return response.data;\n }\n\n /**\n * Get VALR API status\n * GET /v1/public/status\n *\n * @returns Current API status\n */\n async getStatus(): Promise<ValrStatus> {\n const response = await this.http.get<ValrStatus>('/v1/public/status');\n return response.data;\n }\n\n /**\n * Get list of currencies supported by VALR\n * GET /v1/public/currencies\n *\n * @returns Array of currency information\n */\n async getCurrencies(): Promise<Currency[]> {\n const response = await this.http.get<Currency[]>('/v1/public/currencies');\n return response.data;\n }\n\n /**\n * Get list of all currency pairs\n * GET /v1/public/pairs\n *\n * @returns Array of currency pair information\n */\n async getCurrencyPairs(): Promise<CurrencyPairInfo[]> {\n const response = await this.http.get<CurrencyPairInfo[]>('/v1/public/pairs');\n return response.data;\n }\n\n /**\n * Get currency pairs by type (SPOT or FUTURES)\n * GET /v1/public/pairs/:type\n *\n * @param type - Pair type (SPOT or FUTURES)\n * @returns Array of currency pair information\n */\n async getCurrencyPairsByType(type: PairType): Promise<CurrencyPairInfo[]> {\n const response = await this.http.get<CurrencyPairInfo[]>(`/v1/public/pairs/${type}`);\n return response.data;\n }\n\n /**\n * Get market summary for all pairs\n * GET /v1/public/marketsummary\n *\n * @returns Array of market summaries\n */\n async getMarketSummary(): Promise<MarketSummary[]> {\n const response = await this.http.get<MarketSummary[]>('/v1/public/marketsummary');\n return response.data;\n }\n\n /**\n * Get market summary for a specific currency pair\n * GET /v1/public/:currencyPair/marketsummary\n *\n * @param pair - Currency pair (e.g., 'BTCZAR', 'ETHUSDC')\n * @returns Market summary for the pair\n */\n async getMarketSummaryForPair(pair: CurrencyPair): Promise<MarketSummary> {\n const response = await this.http.get<MarketSummary>(`/v1/public/${pair}/marketsummary`);\n return response.data;\n }\n\n /**\n * Get aggregated order book for a currency pair\n * GET /v1/public/:currencyPair/orderbook\n *\n * @param pair - Currency pair\n * @returns Aggregated order book\n */\n async getOrderBook(pair: CurrencyPair): Promise<OrderBook> {\n const response = await this.http.get<OrderBook>(`/v1/public/${pair}/orderbook`);\n return response.data;\n }\n\n /**\n * Get full (non-aggregated) order book for a currency pair\n * GET /v1/public/:currencyPair/orderbook/full\n *\n * @param pair - Currency pair\n * @returns Full order book with individual orders\n */\n async getFullOrderBook(pair: CurrencyPair): Promise<OrderBook> {\n const response = await this.http.get<OrderBook>(`/v1/public/${pair}/orderbook/full`);\n return response.data;\n }\n\n /**\n * Get recent trades for a currency pair\n * GET /v1/public/:currencyPair/trades\n *\n * @param pair - Currency pair\n * @param params - Query parameters (skip, limit, startTime, endTime, beforeId)\n * @returns Array of trades\n */\n async getTradeHistory(pair: CurrencyPair, params?: TradeHistoryParams): Promise<Trade[]> {\n const response = await this.http.get<Trade[]>(`/v1/public/${pair}/trades`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get supported order types for all currency pairs\n * GET /v1/public/ordertypes\n *\n * @param params - Query parameters (includeInactivePairs)\n * @returns Array of currency pairs with their supported order types\n */\n async getOrderTypes(params?: OrderTypesParams): Promise<CurrencyPairOrderTypes[]> {\n const response = await this.http.get<CurrencyPairOrderTypes[]>('/v1/public/ordertypes', {\n params,\n });\n return response.data;\n }\n\n /**\n * Get supported order types for a specific currency pair\n * GET /v1/public/:currencyPair/ordertypes\n *\n * @param pair - Currency pair\n * @returns Array of supported order type strings\n */\n async getOrderTypesForPair(pair: CurrencyPair): Promise<string[]> {\n const response = await this.http.get<string[]>(`/v1/public/${pair}/ordertypes`);\n return response.data;\n }\n\n /**\n * Get OHLC price buckets for a currency pair\n * GET /v1/public/:currencyPair/buckets\n *\n * @param pair - Currency pair\n * @param params - Query parameters (periodSeconds, startTime, endTime, skip, limit, includeEmpty)\n * @returns Array of price buckets (OHLC data)\n */\n async getPriceBuckets(pair: CurrencyPair, params: PriceBucketsParams): Promise<PriceBucket[]> {\n const response = await this.http.get<PriceBucket[]>(`/v1/public/${pair}/buckets`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get mark price buckets for a futures currency pair\n * GET /v1/public/:currencyPair/markprice/buckets\n *\n * @param pair - Currency pair (futures)\n * @param params - Query parameters (periodSeconds, startTime, endTime, skip, limit, includeEmpty)\n * @returns Array of mark price buckets\n */\n async getMarkPriceBuckets(pair: CurrencyPair, params: PriceBucketsParams): Promise<PriceBucket[]> {\n const response = await this.http.get<PriceBucket[]>(`/v1/public/${pair}/markprice/buckets`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get futures contracts information\n * GET /v1/public/futures/info\n *\n * @returns Array of futures contract information\n */\n async getFuturesInfo(): Promise<FuturesInfo[]> {\n const response = await this.http.get<FuturesInfo[]>('/v1/public/futures/info');\n return response.data;\n }\n\n /**\n * Get funding rate history for a futures pair\n * GET /v1/public/futures/funding/history\n *\n * @param pair - Futures currency pair\n * @returns Array of funding rate history\n */\n async getFundingRateHistory(pair: CurrencyPair): Promise<FundingRateHistory[]> {\n const response = await this.http.get<FundingRateHistory[]>('/v1/public/futures/funding/history', {\n params: { currencyPair: pair },\n });\n return response.data;\n }\n\n /**\n * Get loan information for all currencies\n * GET /v1/public/loans/info\n *\n * @returns Array of loan information\n */\n async getLoanInfo(): Promise<LoanInfo[]> {\n const response = await this.http.get<LoanInfo[]>('/v1/public/loans/info');\n return response.data;\n }\n\n /**\n * Get available leverage options for a currency pair\n * GET /v1/public/risklimit/:currencypair\n *\n * @param pair - Currency pair\n * @returns Array of leverage options with risk limits\n */\n async getAvailableLeverageOptions(pair: CurrencyPair): Promise<LeverageOption[]> {\n const response = await this.http.get<LeverageOption[]>(`/v1/public/risklimit/${pair}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n Balance,\n Transaction,\n AccountTrade,\n TradeFee,\n Subaccount,\n ApiKey,\n BalancesParams,\n TransactionHistoryParams,\n TradeHistoryParams as AccountTradeHistoryParams,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateSubaccountRequest,\n TransferRequest,\n CurrencyPair,\n} from '../types';\n\n/**\n * Account API methods (requires authentication)\n */\nexport class AccountAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get account balances for all currencies\n * GET /v1/account/balances\n *\n * @param params - Query parameters (excludeZeroBalances)\n * @returns Array of currency balances\n */\n async getBalances(params?: BalancesParams): Promise<Balance[]> {\n const response = await this.http.get<Balance[]>('/v1/account/balances', {\n params,\n });\n return response.data;\n }\n\n /**\n * Get transaction history\n * GET /v1/account/transactionhistory\n *\n * @param params - Query parameters (skip, limit, beforeId, transactionTypes, currency, startTime, endTime)\n * @returns Array of transactions\n */\n async getTransactionHistory(params?: TransactionHistoryParams): Promise<Transaction[]> {\n const response = await this.http.get<Transaction[]>('/v1/account/transactionhistory', {\n params: params ? {\n ...params,\n transactionTypes: params.transactionTypes?.join(','),\n } : undefined,\n });\n return response.data;\n }\n\n /**\n * Get trade history for all currency pairs\n * GET /v1/account/tradehistory\n *\n * @param params - Query parameters (skip, limit)\n * @returns Array of account trades\n */\n async getTradeHistory(params?: AccountTradeHistoryParams): Promise<AccountTrade[]> {\n const response = await this.http.get<AccountTrade[]>('/v1/account/tradehistory', {\n params,\n });\n return response.data;\n }\n\n /**\n * Get trade history for a specific currency pair\n * GET /v1/account/:currencyPair/tradehistory\n *\n * @param pair - Currency pair\n * @param params - Query parameters (skip, limit)\n * @returns Array of account trades for the pair\n */\n async getTradeHistoryForPair(pair: CurrencyPair, params?: AccountTradeHistoryParams): Promise<AccountTrade[]> {\n const response = await this.http.get<AccountTrade[]>(`/v1/account/${pair}/tradehistory`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get trading fees for all currency pairs\n * GET /v1/account/fees/trade\n *\n * @returns Array of trading fees per currency pair\n */\n async getTradeFees(): Promise<TradeFee[]> {\n const response = await this.http.get<TradeFee[]>('/v1/account/fees/trade');\n return response.data;\n }\n\n /**\n * Get list of subaccounts\n * GET /v1/account/subaccounts\n *\n * @returns Array of subaccounts\n */\n async getSubaccounts(): Promise<Subaccount[]> {\n const response = await this.http.get<Subaccount[]>('/v1/account/subaccounts');\n return response.data;\n }\n\n /**\n * Create a new subaccount\n * POST /v1/account/subaccount\n *\n * @param request - Subaccount creation request\n * @returns Created subaccount\n */\n async createSubaccount(request: CreateSubaccountRequest): Promise<Subaccount> {\n const response = await this.http.post<Subaccount>('/v1/account/subaccount', request);\n return response.data;\n }\n\n /**\n * Transfer funds between primary account and subaccounts\n * POST /v1/account/subaccount/transfer\n *\n * @param request - Transfer request\n * @returns Transfer confirmation\n */\n async transferBetweenAccounts(request: TransferRequest): Promise<{ success: boolean }> {\n const response = await this.http.post<{ success: boolean }>('/v1/account/subaccount/transfer', request);\n return response.data;\n }\n\n /**\n * Get list of API keys\n * GET /v1/account/api-keys\n *\n * @returns Array of API keys\n */\n async getApiKeys(): Promise<ApiKey[]> {\n const response = await this.http.get<ApiKey[]>('/v1/account/api-keys');\n return response.data;\n }\n\n /**\n * Create a new API key\n * POST /v1/account/api-keys\n *\n * @param request - API key creation request\n * @returns Created API key with secret (SAVE THE SECRET - only returned once!)\n */\n async createApiKey(request: CreateApiKeyRequest): Promise<CreateApiKeyResponse> {\n const response = await this.http.post<CreateApiKeyResponse>('/v1/account/api-keys', request);\n return response.data;\n }\n\n /**\n * Delete an API key\n * DELETE /v1/account/api-keys/:keyId\n *\n * @param keyId - API key ID to delete\n * @returns Deletion confirmation\n */\n async deleteApiKey(keyId: string): Promise<{ success: boolean }> {\n const response = await this.http.delete<{ success: boolean }>(`/v1/account/api-keys/${keyId}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n LimitOrderRequest,\n LimitOrderRequestV2,\n MarketOrderRequest,\n MarketOrderRequestV2,\n StopLimitOrderRequest,\n StopLimitOrderRequestV2,\n SimpleQuoteRequest,\n SimpleQuoteResponse,\n SimpleOrderRequest,\n OrderResponse,\n BatchOrderRequest,\n BatchOrderResponse,\n OrderStatusSummary,\n OpenOrder,\n ConditionalOrderRequest,\n ConditionalOrderResponse,\n ConditionalOrderStatus,\n ModifyConditionalOrderRequest,\n ModifyOrderRequest,\n ModifyOrderRequestV2,\n CancelOrderRequest,\n CancelOrderRequestV2,\n OrderHistoryParams,\n HistoricalOrderSummary,\n HistoricalOrderDetail,\n CurrencyPair,\n OrderId,\n CustomerOrderId,\n} from '../types';\n\n/**\n * Trading API methods (requires authentication with trade permission)\n */\nexport class TradingAPI {\n constructor(private http: HttpClient) {}\n\n // ============================================================================\n // Order Placement\n // ============================================================================\n\n /**\n * Place a limit order (v1)\n * POST /v1/orders/limit\n *\n * @param request - Limit order request\n * @returns Order response with order ID\n */\n async placeLimitOrder(request: LimitOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v1/orders/limit', request);\n return response.data;\n }\n\n /**\n * Place a limit order (v2) - supports baseAmount or quoteAmount\n * POST /v2/orders/limit\n *\n * @param request - Limit order request (v2)\n * @returns Order response with order ID\n */\n async placeLimitOrderV2(request: LimitOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v2/orders/limit', request);\n return response.data;\n }\n\n /**\n * Place a market order (v1)\n * POST /v1/orders/market\n *\n * @param request - Market order request\n * @returns Order response with order ID\n */\n async placeMarketOrder(request: MarketOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v1/orders/market', request);\n return response.data;\n }\n\n /**\n * Place a market order (v2)\n * POST /v2/orders/market\n *\n * @param request - Market order request (v2)\n * @returns Order response with order ID\n */\n async placeMarketOrderV2(request: MarketOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v2/orders/market', request);\n return response.data;\n }\n\n /**\n * Place a stop-limit order (v1)\n * POST /v1/orders/stop/limit\n *\n * @param request - Stop-limit order request\n * @returns Order response with order ID\n */\n async placeStopLimitOrder(request: StopLimitOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v1/orders/stop/limit', request);\n return response.data;\n }\n\n /**\n * Place a stop-limit order (v2)\n * POST /v2/orders/stop/limit\n *\n * @param request - Stop-limit order request (v2)\n * @returns Order response with order ID\n */\n async placeStopLimitOrderV2(request: StopLimitOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v2/orders/stop/limit', request);\n return response.data;\n }\n\n /**\n * Place batch orders (up to 10 orders in a single request)\n * POST /v1/batch/orders\n *\n * @param request - Batch order request\n * @returns Array of order responses\n */\n async placeBatchOrders(request: BatchOrderRequest): Promise<BatchOrderResponse> {\n const response = await this.http.post<BatchOrderResponse>('/v1/batch/orders', request);\n return response.data;\n }\n\n // ============================================================================\n // Conditional Orders\n // ============================================================================\n\n /**\n * Place a conditional order (stop-loss or take-profit)\n * POST /v1/orders/conditionals\n *\n * @param request - Conditional order request\n * @returns Conditional order response\n */\n async placeConditionalOrder(request: ConditionalOrderRequest): Promise<ConditionalOrderResponse> {\n const response = await this.http.post<ConditionalOrderResponse>('/v1/orders/conditionals', request);\n return response.data;\n }\n\n /**\n * Get all conditional orders\n * GET /v1/orders/conditionals\n *\n * @returns Array of conditional orders\n */\n async getAllConditionalOrders(): Promise<ConditionalOrderStatus[]> {\n const response = await this.http.get<ConditionalOrderStatus[]>('/v1/orders/conditionals');\n return response.data;\n }\n\n /**\n * Get conditional order status by ID\n * GET /v1/orders/conditionals/conditional/:currencyPair/orderid/:orderId\n *\n * @param pair - Currency pair\n * @param orderId - Conditional order ID\n * @returns Conditional order status\n */\n async getConditionalOrderStatus(pair: CurrencyPair, orderId: string): Promise<ConditionalOrderStatus> {\n const response = await this.http.get<ConditionalOrderStatus>(\n `/v1/orders/conditionals/conditional/${pair}/orderid/${orderId}`\n );\n return response.data;\n }\n\n /**\n * Get conditional order history for a currency pair\n * GET /v1/orders/conditionals/:currencyPair/history\n *\n * @param pair - Currency pair\n * @returns Array of historical conditional orders\n */\n async getConditionalOrderHistory(pair: CurrencyPair): Promise<ConditionalOrderStatus[]> {\n const response = await this.http.get<ConditionalOrderStatus[]>(\n `/v1/orders/conditionals/${pair}/history`\n );\n return response.data;\n }\n\n /**\n * Modify a conditional order\n * PUT /v1/orders/conditionals/modify\n *\n * @param request - Conditional order modification request\n * @returns Updated conditional order\n */\n async modifyConditionalOrder(request: ModifyConditionalOrderRequest): Promise<ConditionalOrderResponse> {\n const response = await this.http.put<ConditionalOrderResponse>('/v1/orders/conditionals/modify', request);\n return response.data;\n }\n\n // ============================================================================\n // Simple Buy/Sell\n // ============================================================================\n\n /**\n * Get a quote for simple buy/sell\n * POST /v1/simple/:currencyPair/quote\n *\n * @param pair - Currency pair\n * @param request - Quote request\n * @returns Quote with ID (valid for 5 seconds)\n */\n async getSimpleQuote(pair: CurrencyPair, request: SimpleQuoteRequest): Promise<SimpleQuoteResponse> {\n const response = await this.http.post<SimpleQuoteResponse>(`/v1/simple/${pair}/quote`, request);\n return response.data;\n }\n\n /**\n * Place a simple buy/sell order using a quote\n * POST /v1/simple/:currencyPair/order\n *\n * @param pair - Currency pair\n * @param request - Simple order request with quote ID\n * @returns Order response\n */\n async placeSimpleOrder(pair: CurrencyPair, request: SimpleOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>(`/v1/simple/${pair}/order`, request);\n return response.data;\n }\n\n /**\n * Get simple order status\n * GET /v1/simple/:currencyPair/order/:orderId\n *\n * @param pair - Currency pair\n * @param orderId - Order ID\n * @returns Order status\n */\n async getSimpleOrderStatus(pair: CurrencyPair, orderId: OrderId): Promise<OrderStatusSummary> {\n const response = await this.http.get<OrderStatusSummary>(`/v1/simple/${pair}/order/${orderId}`);\n return response.data;\n }\n\n // ============================================================================\n // Order Status Queries\n // ============================================================================\n\n /**\n * Get order status by order ID\n * GET /v1/orders/:currencyPair/orderid/:orderId\n *\n * @param pair - Currency pair\n * @param orderId - Order ID\n * @returns Order status summary\n */\n async getOrderStatus(pair: CurrencyPair, orderId: OrderId): Promise<OrderStatusSummary> {\n const response = await this.http.get<OrderStatusSummary>(`/v1/orders/${pair}/orderid/${orderId}`);\n return response.data;\n }\n\n /**\n * Get order status by customer order ID\n * GET /v1/orders/:currencyPair/customerorderid/:customerOrderId\n *\n * @param pair - Currency pair\n * @param customerOrderId - Customer order ID\n * @returns Order status summary\n */\n async getOrderStatusByCustomerId(pair: CurrencyPair, customerOrderId: CustomerOrderId): Promise<OrderStatusSummary> {\n const response = await this.http.get<OrderStatusSummary>(\n `/v1/orders/${pair}/customerorderid/${customerOrderId}`\n );\n return response.data;\n }\n\n /**\n * Get all open orders\n * GET /v1/orders/open\n *\n * @returns Array of open orders\n */\n async getAllOpenOrders(): Promise<OpenOrder[]> {\n const response = await this.http.get<OpenOrder[]>('/v1/orders/open');\n return response.data;\n }\n\n // ============================================================================\n // Order History\n // ============================================================================\n\n /**\n * Get order history\n * GET /v1/orders/history\n *\n * @param params - Query parameters (skip, limit, statuses, currencyPair, startTime, endTime)\n * @returns Array of historical order summaries\n */\n async getOrderHistory(params?: OrderHistoryParams): Promise<HistoricalOrderSummary[]> {\n const response = await this.http.get<HistoricalOrderSummary[]>('/v1/orders/history', {\n params: params ? {\n ...params,\n statuses: params.statuses?.join(','),\n currencyPair: Array.isArray(params.currencyPair)\n ? params.currencyPair.join(',')\n : params.currencyPair,\n } : undefined,\n });\n return response.data;\n }\n\n /**\n * Get order history summary by order ID\n * GET /v1/orders/history/summary/orderid/:orderId\n *\n * @param orderId - Order ID\n * @returns Order history summary\n */\n async getOrderHistorySummary(orderId: OrderId): Promise<HistoricalOrderSummary> {\n const response = await this.http.get<HistoricalOrderSummary>(`/v1/orders/history/summary/orderid/${orderId}`);\n return response.data;\n }\n\n /**\n * Get order history summary by customer order ID\n * GET /v1/orders/history/summary/customerorderid/:customerOrderId\n *\n * @param customerOrderId - Customer order ID\n * @returns Order history summary\n */\n async getOrderHistorySummaryByCustomerId(customerOrderId: CustomerOrderId): Promise<HistoricalOrderSummary> {\n const response = await this.http.get<HistoricalOrderSummary>(\n `/v1/orders/history/summary/customerorderid/${customerOrderId}`\n );\n return response.data;\n }\n\n /**\n * Get order history detail by order ID (includes all trades)\n * GET /v1/orders/history/detail/orderid/:orderId\n *\n * @param orderId - Order ID\n * @returns Order history detail with trades\n */\n async getOrderHistoryDetail(orderId: OrderId): Promise<HistoricalOrderDetail> {\n const response = await this.http.get<HistoricalOrderDetail>(`/v1/orders/history/detail/orderid/${orderId}`);\n return response.data;\n }\n\n /**\n * Get order history detail by customer order ID\n * GET /v1/orders/history/detail/customerorderid/:customerOrderId\n *\n * @param customerOrderId - Customer order ID\n * @returns Order history detail with trades\n */\n async getOrderHistoryDetailByCustomerId(customerOrderId: CustomerOrderId): Promise<HistoricalOrderDetail> {\n const response = await this.http.get<HistoricalOrderDetail>(\n `/v1/orders/history/detail/customerorderid/${customerOrderId}`\n );\n return response.data;\n }\n\n // ============================================================================\n // Order Modification\n // ============================================================================\n\n /**\n * Modify an existing order (v1)\n * PUT /v1/orders/modify\n *\n * @param request - Modify order request\n * @returns Updated order response\n */\n async modifyOrder(request: ModifyOrderRequest): Promise<OrderResponse> {\n const response = await this.http.put<OrderResponse>('/v1/orders/modify', request);\n return response.data;\n }\n\n /**\n * Modify an existing order (v2)\n * PUT /v2/orders/modify\n *\n * @param request - Modify order request (v2)\n * @returns Updated order response\n */\n async modifyOrderV2(request: ModifyOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.put<OrderResponse>('/v2/orders/modify', request);\n return response.data;\n }\n\n // ============================================================================\n // Order Cancellation\n // ============================================================================\n\n /**\n * Cancel a single order (v1)\n * DELETE /v1/orders/order\n *\n * @param request - Cancel order request\n * @returns Cancellation confirmation\n */\n async cancelOrder(request: CancelOrderRequest): Promise<OrderResponse> {\n const response = await this.http.delete<OrderResponse>('/v1/orders/order', {\n data: request,\n });\n return response.data;\n }\n\n /**\n * Cancel a single order (v2)\n * DELETE /v2/orders/order\n *\n * @param request - Cancel order request (v2)\n * @returns Cancellation confirmation\n */\n async cancelOrderV2(request: CancelOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.delete<OrderResponse>('/v2/orders/order', {\n data: request,\n });\n return response.data;\n }\n\n /**\n * Cancel all conditional orders\n * DELETE /v1/orders/conditionals\n *\n * @returns Cancellation confirmation\n */\n async cancelAllConditionalOrders(): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>('/v1/orders/conditionals');\n return response.data;\n }\n\n /**\n * Cancel all conditional orders for a currency pair\n * DELETE /v1/orders/conditionals/:currencypair\n *\n * @param pair - Currency pair\n * @returns Cancellation confirmation\n */\n async cancelConditionalOrdersForPair(pair: CurrencyPair): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>(`/v1/orders/conditionals/${pair}`);\n return response.data;\n }\n\n /**\n * Cancel a specific conditional order\n * DELETE /v1/orders/conditionals/conditional\n *\n * @param request - Contains orderId and currencyPair\n * @returns Cancellation confirmation\n */\n async cancelConditionalOrder(request: { orderId: string; pair: CurrencyPair }): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>('/v1/orders/conditionals/conditional', {\n data: {\n orderId: request.orderId,\n currencyPair: request.pair,\n },\n });\n return response.data;\n }\n\n /**\n * Cancel all orders for all currency pairs\n * DELETE /v1/orders\n *\n * @returns Cancellation confirmation\n */\n async cancelAllOrders(): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>('/v1/orders');\n return response.data;\n }\n\n /**\n * Cancel all orders for a specific currency pair\n * DELETE /v1/orders/:currencyPair\n *\n * @param pair - Currency pair\n * @returns Cancellation confirmation\n */\n async cancelAllOrdersForPair(pair: CurrencyPair): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>(`/v1/orders/${pair}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n DepositAddress,\n CryptoDepositHistoryParams,\n CryptoDepositHistoryItem,\n WhitelistedAddress,\n WithdrawalConfigInfo,\n CryptoWithdrawalRequest,\n CryptoWithdrawalResponse,\n CryptoWithdrawalStatus,\n CryptoWithdrawalHistoryParams,\n CryptoWithdrawalHistoryItem,\n ServiceProvider,\n Bank,\n BankAccount,\n LinkBankAccountRequest,\n FiatDepositReference,\n AutoBuyDepositReference,\n FiatWithdrawalRequest,\n FiatWithdrawalResponse,\n CurrencyCode,\n} from '../types';\n\n/**\n * Wallets API methods (requires authentication)\n *\n * Provides methods for managing crypto and fiat wallets,\n * including deposits, withdrawals, and account management.\n */\nexport class WalletsAPI {\n constructor(private http: HttpClient) {}\n\n // ===== Crypto Wallet Methods =====\n\n /**\n * Get deposit address for a currency\n *\n * @param currencyCode - Currency code\n * @param networkType - Optional network type\n * @returns Promise resolving to deposit address\n *\n * @example\n * ```typescript\n * const address = await client.wallets.getCryptoDepositAddress('BTC');\n * console.log('Deposit to:', address.address);\n * ```\n */\n async getCryptoDepositAddress(\n currencyCode: CurrencyCode,\n networkType?: string\n ): Promise<DepositAddress> {\n const response = await this.http.get<DepositAddress>(\n `/v1/wallet/crypto/${currencyCode}/deposit/address`,\n { params: networkType ? { networkType } : undefined }\n );\n return response.data;\n }\n\n /**\n * Get crypto deposit history\n *\n * @param params - Optional query parameters for filtering\n * @returns Promise resolving to array of deposit history items\n *\n * @example\n * ```typescript\n * const deposits = await client.wallets.getCryptoDepositHistory({\n * skip: 0,\n * limit: 100,\n * currency: 'BTC',\n * startTime: '2025-01-01T00:00:00Z',\n * endTime: '2025-01-31T23:59:59Z'\n * });\n * ```\n */\n async getCryptoDepositHistory(\n params?: CryptoDepositHistoryParams\n ): Promise<CryptoDepositHistoryItem[]> {\n const response = await this.http.get<CryptoDepositHistoryItem[]>(\n '/v1/wallet/crypto/deposit/history',\n { params }\n );\n return response.data;\n }\n\n /**\n * Get whitelisted withdrawal address book\n *\n * @returns Promise resolving to array of whitelisted addresses\n *\n * @example\n * ```typescript\n * const addresses = await client.wallets.getWhitelistedAddresses();\n * ```\n */\n async getWhitelistedAddresses(): Promise<WhitelistedAddress[]> {\n const response = await this.http.get<WhitelistedAddress[]>(\n '/v1/wallet/crypto/address-book'\n );\n return response.data;\n }\n\n /**\n * Get whitelisted withdrawal addresses for a specific currency\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to array of whitelisted addresses for that currency\n *\n * @example\n * ```typescript\n * const btcAddresses = await client.wallets.getWhitelistedAddressesByCurrency('BTC');\n * ```\n */\n async getWhitelistedAddressesByCurrency(\n currencyCode: CurrencyCode\n ): Promise<WhitelistedAddress[]> {\n const response = await this.http.get<WhitelistedAddress[]>(\n `/v1/wallet/crypto/address-book/${currencyCode}`\n );\n return response.data;\n }\n\n /**\n * Get withdrawal configuration info for a currency\n *\n * Returns withdrawal limits and fees.\n *\n * @param currencyCode - Currency code\n * @param networkType - Optional network type\n * @returns Promise resolving to withdrawal config info\n *\n * @example\n * ```typescript\n * const config = await client.wallets.getCryptoWithdrawalInfo('ETH');\n * console.log('Fee:', config.withdrawalFee);\n * ```\n */\n async getCryptoWithdrawalInfo(currencyCode: CurrencyCode, networkType?: string): Promise<WithdrawalConfigInfo> {\n const response = await this.http.get<WithdrawalConfigInfo>(\n `/v1/wallet/crypto/${currencyCode}/withdraw`,\n { params: networkType ? { networkType } : undefined }\n );\n return response.data;\n }\n\n /**\n * Withdraw cryptocurrency\n *\n * @param request - Withdrawal request parameters\n * @returns Promise resolving to withdrawal response\n *\n * @example\n * ```typescript\n * const withdrawal = await client.wallets.withdrawCrypto({\n * currency: 'BTC',\n * amount: '0.1',\n * address: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n * });\n * ```\n */\n async withdrawCrypto(request: CryptoWithdrawalRequest): Promise<CryptoWithdrawalResponse> {\n const response = await this.http.post<CryptoWithdrawalResponse>(\n `/v1/wallet/crypto/${request.currency}/withdraw`,\n request\n );\n return response.data;\n }\n\n /**\n * Get withdrawal status\n *\n * @param currencyCode - Currency code\n * @param withdrawId - Withdrawal ID\n * @returns Promise resolving to withdrawal status\n *\n * @example\n * ```typescript\n * const status = await client.wallets.getCryptoWithdrawalStatus('BTC', 'withdraw-id-123');\n * console.log('Status:', status.status);\n * ```\n */\n async getCryptoWithdrawalStatus(\n currencyCode: CurrencyCode,\n withdrawId: string\n ): Promise<CryptoWithdrawalStatus> {\n const response = await this.http.get<CryptoWithdrawalStatus>(\n `/v1/wallet/crypto/${currencyCode}/withdraw/${withdrawId}`\n );\n return response.data;\n }\n\n /**\n * Get supported service providers\n *\n * Returns list of supported crypto service providers.\n *\n * @returns Promise resolving to array of service providers\n *\n * @example\n * ```typescript\n * const providers = await client.wallets.getServiceProviders();\n * ```\n */\n async getServiceProviders(): Promise<ServiceProvider[]> {\n const response = await this.http.get<ServiceProvider[]>(\n '/v1/wallet/crypto/service-providers'\n );\n return response.data;\n }\n\n /**\n * Get crypto withdrawal history\n *\n * @param params - Optional query parameters\n * @returns Promise resolving to array of withdrawal history items\n *\n * @example\n * ```typescript\n * const history = await client.wallets.getCryptoWithdrawalHistory({ skip: 0, limit: 100 });\n * ```\n */\n async getCryptoWithdrawalHistory(\n params?: CryptoWithdrawalHistoryParams\n ): Promise<CryptoWithdrawalHistoryItem[]> {\n const response = await this.http.get<CryptoWithdrawalHistoryItem[]>(\n '/v1/wallet/crypto/withdraw/history',\n { params }\n );\n return response.data;\n }\n\n // ===== Fiat Wallet Methods =====\n\n /**\n * Add/link a bank account\n *\n * @param currencyCode - Currency code (e.g., 'ZAR')\n * @param request - Bank account details\n * @returns Promise resolving to created bank account\n *\n * @example\n * ```typescript\n * const account = await client.wallets.addBankAccount('ZAR', {\n * bank: 'FNB',\n * accountHolder: 'John Doe',\n * accountNumber: '62792461544',\n * branchCode: '250655',\n * accountType: 'Current/Cheque'\n * });\n * ```\n */\n async addBankAccount(\n currencyCode: CurrencyCode,\n request: LinkBankAccountRequest\n ): Promise<BankAccount> {\n const response = await this.http.post<BankAccount>(\n `/v1/wallet/fiat/${currencyCode}/accounts`,\n request\n );\n return response.data;\n }\n\n /**\n * Get bank account details\n *\n * @param currencyCode - Currency code\n * @param accountId - Bank account ID\n * @returns Promise resolving to bank account details\n *\n * @example\n * ```typescript\n * const account = await client.wallets.getBankAccount('ZAR', 'account-id-123');\n * ```\n */\n async getBankAccount(currencyCode: CurrencyCode, accountId: string): Promise<BankAccount> {\n const response = await this.http.get<BankAccount>(\n `/v1/wallet/fiat/${currencyCode}/accounts/${accountId}`\n );\n return response.data;\n }\n\n /**\n * Get all linked bank accounts\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to array of bank accounts\n *\n * @example\n * ```typescript\n * const accounts = await client.wallets.getBankAccounts('ZAR');\n * ```\n */\n async getBankAccounts(currencyCode: CurrencyCode): Promise<BankAccount[]> {\n const response = await this.http.get<BankAccount[]>(\n `/v1/wallet/fiat/${currencyCode}/accounts`\n );\n return response.data;\n }\n\n /**\n * Delete a bank account\n *\n * @param currencyCode - Currency code\n * @param accountId - Bank account ID\n * @returns Promise that resolves when account is deleted\n *\n * @example\n * ```typescript\n * await client.wallets.deleteBankAccount('ZAR', 'account-id-123');\n * ```\n */\n async deleteBankAccount(currencyCode: CurrencyCode, accountId: string): Promise<void> {\n await this.http.delete(`/v1/wallet/fiat/${currencyCode}/accounts/${accountId}`);\n }\n\n /**\n * Get list of supported banks for a currency\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to array of banks\n *\n * @example\n * ```typescript\n * const banks = await client.wallets.getBanks('ZAR');\n * banks.forEach(bank => {\n * console.log(`${bank.displayName} (${bank.code})`);\n * });\n * ```\n */\n async getBanks(currencyCode: CurrencyCode): Promise<Bank[]> {\n const response = await this.http.get<Bank[]>(`/v1/wallet/fiat/${currencyCode}/banks`);\n return response.data;\n }\n\n /**\n * Get fiat deposit reference\n *\n * Returns your unique deposit reference for depositing fiat currency.\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to deposit reference\n *\n * @example\n * ```typescript\n * const ref = await client.wallets.getFiatDepositReference('ZAR');\n * console.log('Use reference:', ref.reference);\n * ```\n */\n async getFiatDepositReference(currencyCode: CurrencyCode): Promise<FiatDepositReference> {\n const response = await this.http.get<FiatDepositReference>(\n `/v1/wallet/fiat/${currencyCode}/deposit/reference`\n );\n return response.data;\n }\n\n /**\n * Get auto-buy deposit reference\n *\n * Returns a deposit reference that will automatically convert fiat to crypto.\n *\n * @param currencyCode - Fiat currency code (e.g., 'ZAR')\n * @param buyCurrencySymbol - Crypto currency to auto-buy (e.g., 'BTC')\n * @returns Promise resolving to auto-buy deposit reference\n *\n * @example\n * ```typescript\n * const ref = await client.wallets.getAutoBuyDepositReference('ZAR', 'BTC');\n * console.log('Deposit ZAR with this reference to auto-buy BTC:', ref.reference);\n * ```\n */\n async getAutoBuyDepositReference(\n currencyCode: CurrencyCode,\n buyCurrencySymbol: CurrencyCode\n ): Promise<AutoBuyDepositReference> {\n const response = await this.http.get<AutoBuyDepositReference>(\n `/v1/wallet/fiat/${currencyCode}/deposit/reference/${buyCurrencySymbol}`\n );\n return response.data;\n }\n\n /**\n * Get supported auto-buy currencies\n *\n * Returns which crypto currencies can be auto-bought with the specified fiat currency.\n *\n * @param currencyCode - Fiat currency code\n * @returns Promise resolving to array of supported currency codes\n *\n * @example\n * ```typescript\n * const currencies = await client.wallets.getAutoBuyCurrencies('ZAR');\n * currencies.forEach(code => {\n * console.log(`Supports auto-buy for: ${code}`);\n * });\n * ```\n */\n async getAutoBuyCurrencies(currencyCode: CurrencyCode): Promise<CurrencyCode[]> {\n const response = await this.http.get<CurrencyCode[]>(\n `/v1/wallet/fiat/${currencyCode}/auto-buy`\n );\n return response.data;\n }\n\n /**\n * Withdraw fiat currency\n *\n * @param request - Withdrawal request parameters\n * @returns Promise resolving to withdrawal response\n *\n * @example\n * ```typescript\n * const withdrawal = await client.wallets.withdrawFiat({\n * currency: 'ZAR',\n * amount: '1000',\n * linkedBankAccountId: 'account-id-123',\n * fast: true\n * });\n * ```\n */\n async withdrawFiat(request: FiatWithdrawalRequest): Promise<FiatWithdrawalResponse> {\n const response = await this.http.post<FiatWithdrawalResponse>(\n `/v1/wallet/fiat/${request.currency}/withdraw`,\n request\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n FuturesPosition,\n ClosedPositionSummary,\n ClosedPosition,\n FundingPayment,\n LeverageInfo,\n UpdateLeverageRequest,\n CurrencyPair,\n PositionHistoryParams,\n FundingHistoryParams,\n} from '../types';\n\n/**\n * Futures API methods (requires authentication)\n */\nexport class FuturesAPI {\n constructor(private http: HttpClient) {}\n\n async getOpenPositions(): Promise<FuturesPosition[]> {\n const response = await this.http.get<FuturesPosition[]>('/v1/positions/open');\n return response.data;\n }\n\n async getClosedPositionsSummary(): Promise<ClosedPositionSummary[]> {\n const response = await this.http.get<ClosedPositionSummary[]>('/v1/positions/closed/summary');\n return response.data;\n }\n\n async getClosedPositions(pair: CurrencyPair): Promise<ClosedPosition[]> {\n const response = await this.http.get<ClosedPosition[]>('/v1/positions/closed', {\n params: { currencyPair: pair },\n });\n return response.data;\n }\n\n async getPositionHistory(params: PositionHistoryParams): Promise<FuturesPosition[]> {\n const response = await this.http.get<FuturesPosition[]>('/v1/positions/history', { params });\n return response.data;\n }\n\n async getFundingHistory(params: FundingHistoryParams): Promise<FundingPayment[]> {\n const response = await this.http.get<FundingPayment[]>('/v1/positions/funding/history', { params });\n return response.data;\n }\n\n async getLeverageInfo(pair: CurrencyPair): Promise<LeverageInfo> {\n const response = await this.http.get<LeverageInfo>(`/v1/margin/leverage/${pair}`);\n return response.data;\n }\n\n async updateLeverage(pair: CurrencyPair, request: UpdateLeverageRequest): Promise<LeverageInfo> {\n const response = await this.http.put<LeverageInfo>(`/v1/margin/leverage/${pair}`, request);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n MarginInfoV1,\n MarginInfoV2,\n AccountMarginStatus,\n EnableMarginRequest,\n LeverageInfo,\n UpdateLeverageRequest,\n CurrencyPair,\n} from '../types';\n\n/**\n * Margin API methods (requires authentication)\n *\n * Provides methods for managing margin trading, leverage, and account status.\n */\nexport class MarginAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get margin information (V1)\n *\n * Returns detailed margin account information including collateral and borrowing.\n *\n * @returns Promise resolving to margin information\n *\n * @example\n * ```typescript\n * const marginInfo = await client.margin.getMarginInfo();\n * console.log('Available margin:', marginInfo.availableInReference);\n * ```\n */\n async getMarginInfo(): Promise<MarginInfoV1> {\n const response = await this.http.get<MarginInfoV1>('/v1/margin/status');\n return response.data;\n }\n\n /**\n * Get margin information (V2)\n *\n * Returns detailed margin account information with additional fields.\n *\n * @returns Promise resolving to margin information\n *\n * @example\n * ```typescript\n * const marginInfo = await client.margin.getMarginInfoV2();\n * console.log('Trade reserved:', marginInfo.tradeReservedInReference);\n * ```\n */\n async getMarginInfoV2(): Promise<MarginInfoV2> {\n const response = await this.http.get<MarginInfoV2>('/v2/margin/status');\n return response.data;\n }\n\n /**\n * Get account margin status\n *\n * Returns whether margin and futures trading are enabled for the account.\n *\n * @returns Promise resolving to account margin status\n *\n * @example\n * ```typescript\n * const status = await client.margin.getAccountStatus();\n * console.log('Margin enabled:', status.marginEnabled);\n * console.log('In liquidation:', status.inLiquidation);\n * ```\n */\n async getAccountStatus(): Promise<AccountMarginStatus> {\n const response = await this.http.get<AccountMarginStatus>('/v1/margin/account/status');\n return response.data;\n }\n\n /**\n * Enable or disable margin/futures trading\n *\n * @param request - Enable/disable request\n * @returns Promise resolving to updated account status\n *\n * @example\n * ```typescript\n * // Enable margin trading\n * await client.margin.updateAccountStatus({\n * accountStatusFieldName: 'MARGIN_ENABLED',\n * enabled: true\n * });\n *\n * // Enable futures trading\n * await client.margin.updateAccountStatus({\n * accountStatusFieldName: 'FUTURES_ENABLED',\n * enabled: true\n * });\n * ```\n */\n async updateAccountStatus(request: EnableMarginRequest): Promise<AccountMarginStatus> {\n const response = await this.http.put<AccountMarginStatus>('/v1/margin/account/status', request);\n return response.data;\n }\n\n /**\n * Get leverage information for a currency pair\n *\n * @param currencyPair - Currency pair (e.g., 'BTCUSDTPERP')\n * @returns Promise resolving to leverage information\n *\n * @example\n * ```typescript\n * const leverage = await client.margin.getLeverageInfo('BTCUSDTPERP');\n * console.log('Current leverage:', leverage.leverageMultiple);\n * console.log('Risk limit:', leverage.riskLimit);\n * ```\n */\n async getLeverageInfo(currencyPair: CurrencyPair): Promise<LeverageInfo> {\n const response = await this.http.get<LeverageInfo>(`/v1/margin/leverage/${currencyPair}`);\n return response.data;\n }\n\n /**\n * Update leverage for a currency pair\n *\n * @param currencyPair - Currency pair (e.g., 'BTCUSDTPERP')\n * @param request - Update leverage request\n * @returns Promise resolving to updated leverage information\n *\n * @example\n * ```typescript\n * const updated = await client.margin.updateLeverage('BTCUSDTPERP', {\n * leverageMultiple: 10\n * });\n * console.log('New leverage:', updated.leverageMultiple);\n * ```\n */\n async updateLeverage(currencyPair: CurrencyPair, request: UpdateLeverageRequest): Promise<LeverageInfo> {\n const response = await this.http.put<LeverageInfo>(`/v1/margin/leverage/${currencyPair}`, request);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n LoanRate,\n OpenLoan,\n CreateLoanRequest,\n LoanCreditHistoryItem,\n IncreaseLoanRequest,\n ChangeLoanRateRequest,\n RequestUnlockRequest,\n BorrowHistoryItem,\n CurrencyCode,\n} from '../types';\n\n/**\n * Loans API methods (requires authentication)\n *\n * VALR's lending platform allows users to lend crypto and earn interest.\n * Interest rates are determined through an hourly auction system.\n */\nexport class LoansAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get current loan rates for all currencies\n *\n * Returns interest rate information including:\n * - Previous funding rate from the most recent interest auction\n * - Estimated rate for the next funding period\n * - Estimated borrow rate for the next funding round\n *\n * @returns Promise resolving to array of loan rates\n *\n * @example\n * ```typescript\n * const rates = await client.loans.getRates();\n * rates.forEach(rate => {\n * console.log(`${rate.currency}: ${rate.estimatedNextRate}`);\n * });\n * ```\n */\n async getRates(): Promise<LoanRate[]> {\n const response = await this.http.get<LoanRate[]>('/v1/loans/rates');\n return response.data;\n }\n\n /**\n * Get historical loan rates\n *\n * @returns Promise resolving to array of historical loan rates\n *\n * @example\n * ```typescript\n * const history = await client.loans.getRatesHistory();\n * ```\n */\n async getRatesHistory(): Promise<LoanRate[]> {\n const response = await this.http.get<LoanRate[]>('/v1/loans/rates/history');\n return response.data;\n }\n\n /**\n * Get all open loans\n *\n * @returns Promise resolving to array of open loans\n *\n * @example\n * ```typescript\n * const openLoans = await client.loans.getOpenLoans();\n * openLoans.forEach(loan => {\n * console.log(`${loan.currency}: ${loan.totalAmount} at ${loan.hourlyRate}/hr`);\n * });\n * ```\n */\n async getOpenLoans(): Promise<OpenLoan[]> {\n const response = await this.http.get<OpenLoan[]>('/v1/loans/open');\n return response.data;\n }\n\n /**\n * Create a new loan\n *\n * Opens a new lending position at the specified hourly rate.\n *\n * @param request - Loan creation parameters\n * @returns Promise that resolves when loan is created\n *\n * @example\n * ```typescript\n * await client.loans.createLoan({\n * currencySymbol: 'USDC',\n * hourlyRate: '0.00001255',\n * amount: '100'\n * });\n * ```\n */\n async createLoan(request: CreateLoanRequest): Promise<void> {\n await this.http.post('/v1/loans', request);\n }\n\n /**\n * Get loan credit history\n *\n * Returns history of interest entries as calculated during margin interest auction runs.\n *\n * @returns Promise resolving to array of credit history items\n *\n * @example\n * ```typescript\n * const history = await client.loans.getCreditHistory();\n * history.forEach(item => {\n * console.log(`${item.currency}: earned ${item.interestAmount}`);\n * });\n * ```\n */\n async getCreditHistory(): Promise<LoanCreditHistoryItem[]> {\n const response = await this.http.get<LoanCreditHistoryItem[]>('/v1/loans/credit-history');\n return response.data;\n }\n\n /**\n * Increase loan amount\n *\n * Increases the total amount of an existing loan.\n *\n * @param request - Increase loan parameters\n * @returns Promise that resolves when loan is increased\n *\n * @example\n * ```typescript\n * await client.loans.increaseLoan({\n * currencySymbol: 'USDC',\n * increaseLoanAmountBy: '20',\n * loanId: '1289055810346737664'\n * });\n * ```\n */\n async increaseLoan(request: IncreaseLoanRequest): Promise<void> {\n await this.http.put('/v1/loans/increase', request);\n }\n\n /**\n * Change loan rate\n *\n * Updates the hourly interest rate for an existing loan.\n *\n * @param request - Change rate parameters\n * @returns Promise that resolves when rate is changed\n *\n * @example\n * ```typescript\n * await client.loans.changeRate({\n * currencySymbol: 'USDC',\n * hourlyRate: '0.0000126',\n * loanId: '1289055810346737664'\n * });\n * ```\n */\n async changeRate(request: ChangeLoanRateRequest): Promise<void> {\n await this.http.put('/v1/loans/rate', request);\n }\n\n /**\n * Get loan update history\n *\n * Returns history of loan modifications (rate changes, amount increases, etc).\n *\n * @returns Promise resolving to array of loan updates\n *\n * @example\n * ```typescript\n * const updates = await client.loans.getUpdateHistory();\n * ```\n */\n async getUpdateHistory(): Promise<any[]> {\n const response = await this.http.get<any[]>('/v1/loans/update-history');\n return response.data;\n }\n\n /**\n * Request to unlock loan funds\n *\n * Requests to unlock a portion of a loan to make it available for withdrawal.\n *\n * @param request - Unlock request parameters\n * @returns Promise that resolves when unlock is requested\n *\n * @example\n * ```typescript\n * await client.loans.requestUnlock({\n * currencySymbol: 'USDC',\n * unlockAmount: '50',\n * loanId: '1289055810346737664'\n * });\n * ```\n */\n async requestUnlock(request: RequestUnlockRequest): Promise<void> {\n await this.http.put('/v1/loans/unlock', request);\n }\n\n /**\n * Cancel unlock request\n *\n * Cancels a pending unlock request for loan funds.\n *\n * @returns Promise that resolves when unlock request is cancelled\n *\n * @example\n * ```typescript\n * await client.loans.cancelUnlock();\n * ```\n */\n async cancelUnlock(): Promise<void> {\n await this.http.delete('/v1/loans/unlock');\n }\n\n /**\n * Get borrow history for a specific currency\n *\n * @param currencySymbol - Currency symbol to get borrow history for\n * @returns Promise resolving to array of borrow history items\n *\n * @example\n * ```typescript\n * const history = await client.loans.getBorrowHistory('USDC');\n * ```\n */\n async getBorrowHistory(currencySymbol: CurrencyCode): Promise<BorrowHistoryItem[]> {\n const response = await this.http.get<BorrowHistoryItem[]>(\n `/v1/borrows/${currencySymbol}/history`\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n StakeRequest,\n UnstakeRequest,\n EarnBalance,\n EarnRate,\n EarnReward,\n EarnHistoryItem,\n EarnBalancesParams,\n EarnRatesParams,\n EarnRewardsParams,\n EarnHistoryParams,\n} from '../types';\n\n/**\n * Staking API methods - Staking and Lending (requires authentication)\n *\n * VALR offers two types of earning opportunities:\n * - STAKE: Lock crypto to earn rewards\n * - LEND: Lend crypto to earn interest\n */\nexport class StakeAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Stake/Lock cryptocurrency to earn rewards\n *\n * @param request - Stake request with currency, amount, and earn type\n * @returns Promise that resolves when stake is successful\n *\n * @example\n * ```typescript\n * await client.stake.stake({\n * currencySymbol: 'ETH',\n * amount: '1.5',\n * earnType: 'STAKE'\n * });\n * ```\n */\n async stake(request: StakeRequest): Promise<void> {\n await this.http.post('/v1/staking/stake', request);\n }\n\n /**\n * Unstake/Unlock cryptocurrency\n *\n * @param request - Unstake request with currency, amount, and earn type\n * @returns Promise that resolves when unstake is successful\n *\n * @example\n * ```typescript\n * await client.stake.unstake({\n * currencySymbol: 'ETH',\n * amount: '1.5',\n * earnType: 'STAKE'\n * });\n * ```\n */\n async unstake(request: UnstakeRequest): Promise<void> {\n await this.http.post('/v1/staking/un-stake', request);\n }\n\n /**\n * Get earn balances for a specific earn type\n *\n * @param params - Optional parameters (earnType filter)\n * @returns Promise resolving to array of earn balances\n *\n * @example\n * ```typescript\n * // Get staking balances\n * const stakingBalances = await client.stake.getBalances({ earnType: 'STAKE' });\n *\n * // Get lending balances\n * const lendingBalances = await client.stake.getBalances({ earnType: 'LEND' });\n * ```\n */\n async getBalances(params?: EarnBalancesParams): Promise<EarnBalance[]> {\n const response = await this.http.get<EarnBalance[]>('/v1/staking/balances', { params });\n return response.data;\n }\n\n /**\n * Get all earn balances\n *\n * @param params - Optional parameters (earnType filter)\n * @returns Promise resolving to array of all earn balances\n *\n * @example\n * ```typescript\n * const allBalances = await client.stake.getAllBalances({ earnType: 'LEND' });\n * ```\n */\n async getAllBalances(params?: EarnBalancesParams): Promise<EarnBalance[]> {\n const response = await this.http.get<EarnBalance[]>('/v1/staking/balances/all', { params });\n return response.data;\n }\n\n /**\n * Get current earning rates for available currencies\n *\n * @param params - Optional parameters (earnType filter)\n * @returns Promise resolving to array of earn rates\n *\n * @example\n * ```typescript\n * // Get staking rates\n * const stakingRates = await client.stake.getRates({ earnType: 'STAKE' });\n *\n * // Get lending rates\n * const lendingRates = await client.stake.getRates({ earnType: 'LEND' });\n * ```\n */\n async getRates(params?: EarnRatesParams): Promise<EarnRate[]> {\n const response = await this.http.get<EarnRate[]>('/v1/staking/rates', { params });\n return response.data;\n }\n\n /**\n * Get earn rewards history for a specific currency\n *\n * @param params - Query parameters including currency symbol\n * @returns Promise resolving to array of earn rewards\n *\n * @example\n * ```typescript\n * const rewards = await client.stake.getRewards({\n * currencySymbol: 'ETH',\n * earnType: 'LEND',\n * skip: 0,\n * limit: 100\n * });\n * ```\n */\n async getRewards(params: EarnRewardsParams): Promise<EarnReward[]> {\n const response = await this.http.get<EarnReward[]>('/v1/staking/rewards', { params });\n return response.data;\n }\n\n /**\n * Get earn transaction history (stakes and unstakes)\n *\n * @param params - Query parameters including currency symbol\n * @returns Promise resolving to array of earn history items\n *\n * @example\n * ```typescript\n * const history = await client.stake.getHistory({\n * currencySymbol: 'ETH',\n * earnType: 'STAKE',\n * skip: 0,\n * limit: 100\n * });\n * ```\n */\n async getHistory(params: EarnHistoryParams): Promise<EarnHistoryItem[]> {\n const response = await this.http.get<EarnHistoryItem[]>('/v1/staking/history', { params });\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { CreatePaymentRequest, Payment, PaymentStatus } from '../types';\n\n/**\n * Pay API methods (requires authentication)\n */\nexport class PayAPI {\n constructor(private http: HttpClient) {}\n\n async createPayment(request: CreatePaymentRequest): Promise<Payment> {\n const response = await this.http.post<Payment>('/v1/pay/payment', request);\n return response.data;\n }\n\n async getPaymentStatus(paymentId: string): Promise<PaymentStatus> {\n const response = await this.http.get<PaymentStatus>(`/v1/pay/payment/${paymentId}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { Bundle, BuyBundleRequest, BundleOrder } from '../types';\n\n/**\n * Bundles API methods (requires authentication)\n */\nexport class BundlesAPI {\n constructor(private http: HttpClient) {}\n\n async getBundles(): Promise<Bundle[]> {\n const response = await this.http.get<Bundle[]>('/v1/bundles');\n return response.data;\n }\n\n async buyBundle(request: BuyBundleRequest): Promise<BundleOrder> {\n const response = await this.http.post<BundleOrder>('/v1/bundles/buy', request);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ValrStatus } from '../types';\n\n/**\n * Health API methods\n */\nexport class HealthAPI {\n constructor(private http: HttpClient) {}\n\n async getHealth(): Promise<ValrStatus> {\n const response = await this.http.get<ValrStatus>('/v1/health');\n return response.data;\n }\n}\n","import { HttpClient } from '../utils/http';\nimport { RequestSigner } from '../auth/RequestSigner';\nimport { ValrConfigurationError } from '../errors/ValrError';\nimport { HEADERS } from '../utils/constants';\nimport { PublicAPI } from '../api/public';\nimport { AccountAPI } from '../api/account';\nimport { TradingAPI } from '../api/trading';\nimport { WalletsAPI } from '../api/wallets';\nimport { FuturesAPI } from '../api/futures';\nimport { MarginAPI } from '../api/margin';\nimport { LoansAPI } from '../api/loans';\nimport { StakeAPI } from '../api/stake';\nimport { PayAPI } from '../api/pay';\nimport { BundlesAPI } from '../api/bundles';\nimport { HealthAPI } from '../api/health';\n\n/**\n * Configuration for ValrClient\n */\nexport interface ValrClientConfig {\n /**\n * API key (required for authenticated endpoints)\n */\n apiKey?: string;\n\n /**\n * API secret (required for authenticated endpoints)\n */\n apiSecret?: string;\n\n /**\n * Base URL for API (defaults to https://api.valr.com)\n */\n baseURL?: string;\n\n /**\n * Request timeout in milliseconds (defaults to 30000)\n */\n timeout?: number;\n\n /**\n * Subaccount ID for impersonating a subaccount (optional)\n */\n subaccountId?: string;\n}\n\n/**\n * Main VALR API client\n *\n * @example\n * ```typescript\n * // For public endpoints only (no authentication)\n * const client = new ValrClient();\n * const time = await client.public.getServerTime();\n *\n * // For authenticated endpoints\n * const client = new ValrClient({\n * apiKey: 'your-api-key',\n * apiSecret: 'your-api-secret',\n * });\n * const balances = await client.account.getBalances();\n * ```\n */\nexport class ValrClient {\n private http: HttpClient;\n private apiKey?: string;\n private apiSecret?: string;\n private subaccountId?: string;\n\n /**\n * Public API methods (no authentication required)\n */\n public readonly public: PublicAPI;\n\n /**\n * Account API methods (requires authentication)\n */\n public readonly account: AccountAPI;\n\n /**\n * Trading API methods (requires authentication with trade permission)\n */\n public readonly trading: TradingAPI;\n\n /**\n * Wallets API methods (requires authentication)\n */\n public readonly wallets: WalletsAPI;\n\n /**\n * Futures API methods (requires authentication)\n */\n public readonly futures: FuturesAPI;\n\n /**\n * Margin API methods (requires authentication)\n */\n public readonly margin: MarginAPI;\n\n /**\n * Loans API methods (requires authentication)\n */\n public readonly loans: LoansAPI;\n\n /**\n * Staking/Earn API methods (requires authentication)\n */\n public readonly stake: StakeAPI;\n\n /**\n * Pay API methods (requires authentication)\n */\n public readonly pay: PayAPI;\n\n /**\n * Bundles API methods (requires authentication)\n */\n public readonly bundles: BundlesAPI;\n\n /**\n * Health API methods\n */\n public readonly health: HealthAPI;\n\n /**\n * Create a new VALR API client\n *\n * @param config - Client configuration\n */\n constructor(config: ValrClientConfig = {}) {\n const { apiKey, apiSecret, baseURL, timeout, subaccountId } = config;\n\n // Validate credentials if provided\n if ((apiKey && !apiSecret) || (!apiKey && apiSecret)) {\n throw new ValrConfigurationError(\n 'Both apiKey and apiSecret must be provided together'\n );\n }\n\n if (apiKey && apiSecret) {\n RequestSigner.validateCredentials(apiKey, apiSecret);\n }\n\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.subaccountId = subaccountId;\n\n // Initialize HTTP client\n this.http = new HttpClient({\n baseURL,\n timeout,\n });\n\n // Add request interceptor for authentication\n this.http.getInstance().interceptors.request.use((config) => {\n // Only add auth headers for authenticated requests\n if (this.apiKey && this.apiSecret) {\n const timestamp = RequestSigner.getTimestamp();\n const method = config.method?.toUpperCase() || 'GET';\n let url = config.url || '';\n const body = config.data ? JSON.stringify(config.data) : '';\n\n // Include query parameters in the signature path\n if (config.params) {\n // Build query string WITHOUT encoding to match what Axios sends\n // and what VALR expects in the signature\n const queryParts: string[] = [];\n Object.keys(config.params).sort().forEach(key => {\n const value = config.params[key];\n if (value !== undefined && value !== null) {\n // Don't URL encode - use raw values\n queryParts.push(`${key}=${value}`);\n }\n });\n if (queryParts.length > 0) {\n url = `${url}?${queryParts.join('&')}`;\n }\n\n // Update config.url with the query string and clear params\n // so Axios uses our exact URL instead of building its own query string\n config.url = url;\n delete config.params;\n }\n\n const signature = RequestSigner.signRequest({\n apiSecret: this.apiSecret,\n timestamp,\n verb: method,\n path: url,\n body,\n subaccountId: this.subaccountId,\n });\n\n // Add authentication headers\n config.headers[HEADERS.API_KEY] = this.apiKey;\n config.headers[HEADERS.SIGNATURE] = signature;\n config.headers[HEADERS.TIMESTAMP] = timestamp.toString();\n config.headers[HEADERS.CONTENT_TYPE] = config.headers.getContentType();\n\n // Add subaccount header if provided\n if (this.subaccountId) {\n config.headers[HEADERS.SUB_ACCOUNT_ID] = this.subaccountId;\n }\n }\n\n return config;\n });\n\n // Initialize API groups\n this.public = new PublicAPI(this.http);\n this.account = new AccountAPI(this.http);\n this.trading = new TradingAPI(this.http);\n this.wallets = new WalletsAPI(this.http);\n this.futures = new FuturesAPI(this.http);\n this.margin = new MarginAPI(this.http);\n this.loans = new LoansAPI(this.http);\n this.stake = new StakeAPI(this.http);\n this.pay = new PayAPI(this.http);\n this.bundles = new BundlesAPI(this.http);\n this.health = new HealthAPI(this.http);\n }\n\n /**\n * Update subaccount ID for impersonation\n *\n * @param subaccountId - Subaccount ID (or undefined to clear)\n */\n setSubaccountId(subaccountId?: string): void {\n this.subaccountId = subaccountId;\n }\n\n /**\n * Get current subaccount ID\n *\n * @returns Current subaccount ID or undefined\n */\n getSubaccountId(): string | undefined {\n return this.subaccountId;\n }\n}\n","import WebSocket from 'ws';\nimport EventEmitter from 'eventemitter3';\nimport { RequestSigner } from '../auth/RequestSigner';\nimport { ValrWebSocketError } from '../errors/ValrError';\nimport type { WebSocketMessage } from '../types';\nimport {WS_BASE_URL} from \"../utils/constants\";\n\n/**\n * WebSocket client configuration\n */\nexport interface WebSocketClientConfig {\n /** API key (required for authenticated endpoints) */\n apiKey?: string;\n /** API secret (required for authenticated endpoints) */\n apiSecret?: string;\n /** Subaccount ID for impersonation */\n subaccountId?: string;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Reconnect delay in milliseconds (default: 5000) */\n reconnectDelay?: number;\n /** Maximum reconnect attempts (default: Infinity) */\n maxReconnectAttempts?: number;\n /** Base URL for WS (defaults to wss://api.valr.com) */\n baseURL?: string;\n}\n\n/**\n * WebSocket event types\n */\nexport interface WebSocketEvents {\n connected: () => void;\n authenticated: () => void;\n message: (message: WebSocketMessage) => void;\n error: (error: Error) => void;\n close: (code: number, reason: string) => void;\n disconnected: () => void;\n reconnecting: (attempt: number) => void;\n}\n\n/**\n * Base WebSocket client for VALR API\n */\nexport abstract class ValrWebSocketClient<TEvents extends WebSocketEvents = WebSocketEvents> extends EventEmitter<TEvents> {\n protected ws?: WebSocket;\n protected url: string;\n protected path: string;\n protected config: Required<WebSocketClientConfig>;\n protected reconnectAttempts = 0;\n protected reconnectTimer?: NodeJS.Timeout;\n protected isIntentionalClose = false;\n protected isConnected = false;\n protected isAuthenticated = false;\n\n constructor(path: string, config: WebSocketClientConfig = {}) {\n super();\n this.config = {\n apiKey: config.apiKey || '',\n apiSecret: config.apiSecret || '',\n subaccountId: config.subaccountId || '',\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay || 5000,\n maxReconnectAttempts: config.maxReconnectAttempts || Infinity,\n baseURL: config.baseURL || WS_BASE_URL\n };\n this.url = `${this.config.baseURL}${path}`;\n this.path = path;\n }\n\n /**\n * Connect to WebSocket\n */\n connect(): void {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n return; // Already connected or connecting\n }\n\n this.isIntentionalClose = false;\n\n try {\n // Build WebSocket options with authentication headers if credentials provided\n const wsOptions: WebSocket.ClientOptions = {};\n\n if (this.config.apiKey && this.config.apiSecret) {\n const timestamp = RequestSigner.getTimestamp();\n const signature = RequestSigner.signRequest({\n apiSecret: this.config.apiSecret,\n timestamp,\n verb: 'GET',\n path: this.path,\n body: '',\n subaccountId: this.config.subaccountId,\n });\n\n wsOptions.headers = {\n 'X-VALR-API-KEY': this.config.apiKey,\n 'X-VALR-SIGNATURE': signature,\n 'X-VALR-TIMESTAMP': timestamp.toString(),\n };\n\n if (this.config.subaccountId) {\n wsOptions.headers['X-VALR-SUB-ACCOUNT-ID'] = this.config.subaccountId;\n }\n }\n\n this.ws = new WebSocket(this.url, wsOptions);\n\n this.ws.on('open', () => {\n this.handleOpen();\n });\n\n this.ws.on('message', (data: WebSocket.Data) => {\n this.handleMessage(data);\n });\n\n this.ws.on('error', (error: Error) => {\n this.handleError(error);\n });\n\n this.ws.on('close', (code: number, reason: Buffer) => {\n this.handleClose(code, reason.toString());\n });\n } catch (error) {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError(`Failed to connect: ${error}`));\n }\n }\n\n /**\n * Disconnect from WebSocket\n */\n disconnect(): void {\n this.isIntentionalClose = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = undefined;\n }\n }\n\n /**\n * Check if connected\n */\n isOpen(): boolean {\n return this.isConnected && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Send a message to WebSocket\n */\n protected send(message: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new ValrWebSocketError('WebSocket is not connected');\n }\n\n const data = typeof message === 'string' ? message : JSON.stringify(message);\n this.ws.send(data);\n }\n\n /**\n * Handle WebSocket open event\n */\n protected handleOpen(): void {\n this.isConnected = true;\n this.reconnectAttempts = 0;\n // @ts-ignore - Base event is always available\n this.emit('connected');\n\n // If credentials were provided, authentication happened via headers during handshake\n if (this.config.apiKey && this.config.apiSecret) {\n this.isAuthenticated = true;\n // @ts-ignore - Base event is always available\n this.emit('authenticated');\n this.onAuthenticated();\n this.startPing()\n }\n }\n\n protected startPing(){\n setInterval(() => {\n if(this.isConnected && this.isAuthenticated){\n this.send({ type: \"PING\"});\n }\n }, 30000)\n }\n\n /**\n * Handle incoming WebSocket message\n */\n protected handleMessage(data: WebSocket.Data): void {\n try {\n const message = JSON.parse(data.toString()) as WebSocketMessage;\n\n // Emit the message event\n // @ts-ignore - Base event is always available\n this.emit('message', message);\n\n // Call subclass handler\n this.onMessage(message);\n } catch (error) {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError(`Failed to parse message: ${error}`));\n }\n }\n\n /**\n * Handle WebSocket error\n */\n protected handleError(error: Error): void {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError(error.message));\n }\n\n /**\n * Handle WebSocket close event\n */\n protected handleClose(code: number, reason: string): void {\n this.isConnected = false;\n this.isAuthenticated = false;\n // @ts-ignore - Base event is always available\n this.emit('close', code, reason);\n // @ts-ignore - Base event is always available\n this.emit('disconnected');\n\n // Attempt to reconnect if not intentional\n if (!this.isIntentionalClose && this.config.autoReconnect) {\n this.attemptReconnect();\n }\n }\n\n /**\n * Attempt to reconnect\n */\n protected attemptReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError('Max reconnect attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n // @ts-ignore - Base event is always available\n this.emit('reconnecting', this.reconnectAttempts);\n\n this.reconnectTimer = setTimeout(() => {\n this.connect();\n }, this.config.reconnectDelay);\n }\n\n /**\n * Override this method to handle authenticated event\n */\n protected onAuthenticated(): void {\n // Override in subclass\n }\n\n /**\n * Override this method to handle messages\n */\n protected abstract onMessage(message: WebSocketMessage): void;\n}\n","import { ValrWebSocketClient, WebSocketClientConfig, WebSocketEvents } from './ValrWebSocketClient';\nimport {WS_ACCOUNT_URL_PATH} from '../utils/constants';\nimport type {\n WebSocketMessage,\n Subscription,\n OrderProcessed,\n OrderStatusUpdate,\n BalanceUpdate,\n WebSocketAccountTrade,\n} from '../types';\n\n/**\n * Account WebSocket events (in addition to base events)\n */\nexport interface AccountWebSocketEvents {\n 'order:processed': (data: OrderProcessed) => void;\n 'order:statusUpdate': (data: OrderStatusUpdate) => void;\n 'balance:update': (data: BalanceUpdate) => void;\n 'trade:new': (data: WebSocketAccountTrade) => void;\n}\n\n/**\n * Combined event types for AccountWebSocket\n */\nexport type AccountWebSocketEventMap = WebSocketEvents & AccountWebSocketEvents;\n\n/**\n * Account WebSocket client for real-time account updates\n *\n * Receives:\n * - Order processing results\n * - Order status updates\n * - Balance changes\n * - Account trades\n *\n * @example\n * ```typescript\n * const wsClient = new AccountWebSocket({\n * apiKey: 'your-api-key',\n * apiSecret: 'your-api-secret',\n * });\n *\n * wsClient.on('connected', () => {\n * console.log('Connected to account WebSocket');\n * });\n *\n * wsClient.on('authenticated', () => {\n * console.log('Authenticated');\n * });\n *\n * wsClient.on('balance:update', (update) => {\n * console.log('Balance updated:', update);\n * });\n *\n * wsClient.on('order:processed', (result) => {\n * console.log('Order processed:', result);\n * });\n *\n * wsClient.connect();\n * ```\n */\nexport class AccountWebSocket extends ValrWebSocketClient<AccountWebSocketEventMap> {\n constructor(config: WebSocketClientConfig) {\n if (!config.apiKey || !config.apiSecret) {\n throw new Error('API key and secret are required for Account WebSocket');\n }\n super(WS_ACCOUNT_URL_PATH, config);\n }\n\n /**\n * Subscribe to specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n subscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'SUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Unsubscribe from specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n unsubscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'UNSUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Handle authenticated event\n */\n protected onAuthenticated(): void {\n // Auto-subscribe to all account events\n this.subscribe([\n { event: 'INSTANT_ORDER_COMPLETED' },\n { event: 'ORDER_PROCESSED' },\n { event: 'ORDER_STATUS_UPDATE' },\n { event: 'BALANCE_UPDATE' },\n { event: 'NEW_ACCOUNT_TRADE' },\n { event: 'OPEN_ORDERS_UPDATE' },\n { event: 'NEW_PENDING_RECEIVE' },\n { event: 'SEND_STATUS_UPDATE' },\n { event: 'FAILED_CANCEL_ORDER' },\n ]);\n }\n\n /**\n * Handle incoming messages\n */\n protected onMessage(message: WebSocketMessage): void {\n switch (message.type) {\n case 'ORDER_PROCESSED':\n this.emit('order:processed', message as OrderProcessed);\n break;\n\n case 'ORDER_STATUS_UPDATE':\n this.emit('order:statusUpdate', message as OrderStatusUpdate);\n break;\n\n case 'BALANCE_UPDATE':\n this.emit('balance:update', message as BalanceUpdate);\n break;\n\n case 'NEW_ACCOUNT_TRADE':\n this.emit('trade:new', message as WebSocketAccountTrade);\n break;\n\n case 'SUBSCRIBED':\n // Successfully subscribed\n break;\n\n case 'UNSUBSCRIBED':\n // Successfully unsubscribed\n break;\n\n default:\n // Unknown message type - still emit via base 'message' event\n break;\n }\n }\n\n}\n","import { ValrWebSocketClient, WebSocketClientConfig, WebSocketEvents } from './ValrWebSocketClient';\nimport {WS_TRADE_URL_PATH} from '../utils/constants';\nimport type {\n WebSocketMessage,\n Subscription,\n OrderBookUpdate,\n MarketSummaryUpdate,\n NewTrade,\n CurrencyPair,\n} from '../types';\n\n/**\n * Trade WebSocket events (in addition to base events)\n */\nexport interface TradeWebSocketEvents {\n 'orderbook:update': (data: OrderBookUpdate) => void;\n 'market:summary': (data: MarketSummaryUpdate) => void;\n 'trade:new': (data: NewTrade) => void;\n}\n\n/**\n * Combined event types for TradeWebSocket\n */\nexport type TradeWebSocketEventMap = WebSocketEvents & TradeWebSocketEvents;\n\n/**\n * Trade WebSocket client for real-time market data\n *\n * Receives:\n * - Order book updates (aggregated and full)\n * - Market summary updates\n * - New trades\n * - Price bucket updates\n *\n * @example\n * ```typescript\n * // Public trade WebSocket (no auth required)\n * const wsClient = new TradeWebSocket();\n *\n * wsClient.on('connected', () => {\n * console.log('Connected to trade WebSocket');\n * wsClient.subscribeToOrderBook(['BTCZAR', 'ETHZAR']);\n * wsClient.subscribeToTrades(['BTCZAR']);\n * });\n *\n * wsClient.on('orderbook:update', (update) => {\n * console.log('Order book update:', update);\n * });\n *\n * wsClient.on('trade:new', (trade) => {\n * console.log('New trade:', trade);\n * });\n *\n * wsClient.connect();\n * ```\n */\nexport class TradeWebSocket extends ValrWebSocketClient<TradeWebSocketEventMap> {\n constructor(config: WebSocketClientConfig = {}) {\n super(WS_TRADE_URL_PATH, config);\n }\n\n /**\n * Subscribe to aggregated order book updates for currency pairs\n *\n * @param pairs - Array of currency pairs (e.g., ['BTCZAR', 'ETHZAR'])\n */\n subscribeToOrderBook(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'AGGREGATED_ORDERBOOK_UPDATE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to full (non-aggregated) order book updates\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToFullOrderBook(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'FULL_ORDERBOOK_UPDATE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to market summary updates\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToMarketSummary(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'MARKET_SUMMARY_UPDATE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to new trades\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToTrades(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'NEW_TRADE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to price bucket updates\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToPriceBuckets(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'NEW_TRADE_BUCKET',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n subscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'SUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Unsubscribe from specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n unsubscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'UNSUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Handle authenticated event (optional for trade WebSocket)\n */\n protected onAuthenticated(): void {\n // Trade WebSocket can be used without authentication\n // Subclass can override this if needed\n }\n\n /**\n * Handle incoming messages\n */\n protected onMessage(message: WebSocketMessage): void {\n switch (message.type) {\n case 'AGGREGATED_ORDERBOOK_UPDATE':\n case 'FULL_ORDERBOOK_UPDATE':\n this.emit('orderbook:update', message as OrderBookUpdate);\n break;\n\n case 'MARKET_SUMMARY_UPDATE':\n this.emit('market:summary', message as MarketSummaryUpdate);\n break;\n\n case 'NEW_TRADE':\n this.emit('trade:new', message as NewTrade);\n break;\n\n case 'SUBSCRIBED':\n // Successfully subscribed\n break;\n\n case 'UNSUBSCRIBED':\n // Successfully unsubscribed\n break;\n\n default:\n // Unknown message type - still emit via base 'message' event\n break;\n }\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/ValrError.ts","../src/utils/constants.ts","../src/utils/http.ts","../src/auth/RequestSigner.ts","../src/api/public.ts","../src/api/account.ts","../src/api/trading.ts","../src/api/wallets.ts","../src/api/futures.ts","../src/api/margin.ts","../src/api/loans.ts","../src/api/stake.ts","../src/api/pay.ts","../src/api/bundles.ts","../src/api/health.ts","../src/client/ValrClient.ts","../src/client/ValrWebSocketClient.ts","../src/client/AccountWebSocket.ts","../src/client/TradeWebSocket.ts"],"names":["axios","createHmac","config","EventEmitter","WebSocket"],"mappings":";;;;;;;;;;;;;;;;AAGO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,KAAA,CAAM;AAAA,EACnC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,UAAA,CAAU,SAAS,CAAA;AAAA,EACjD;AACF;AAKO,IAAM,uBAAA,GAAN,MAAM,wBAAA,SAAgC,SAAA,CAAU;AAAA,EACrD,WAAA,CAAY,UAAkB,uBAAA,EAAyB;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,wBAAA,CAAwB,SAAS,CAAA;AAAA,EAC/D;AACF;AAKO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,SAAA,CAAU;AAAA,EAChD,WAAA,CAAY,UAAkB,qBAAA,EAAuB;AACnD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,mBAAA,CAAmB,SAAS,CAAA;AAAA,EAC1D;AACF;AAKO,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,SAAA,CAAU;AAAA,EAGjD,WAAA,CAAY,SAAiB,MAAA,EAAmC;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,oBAAA,CAAoB,SAAS,CAAA;AAAA,EAC3D;AACF;AAKO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,SAAA,CAAU;AAAA,EAI1C,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAqB,QAAA,EAAoB;AACpE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,aAAA,CAAa,SAAS,CAAA;AAAA,EACpD;AACF;AAKO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,SAAA,CAAU;AAAA,EAChD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,mBAAA,CAAmB,SAAS,CAAA;AAAA,EAC1D;AACF;AAKO,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,SAAA,CAAU;AAAA,EACpD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,uBAAA,CAAuB,SAAS,CAAA;AAAA,EAC9D;AACF;;;AC5EO,IAAM,YAAA,GAAe;AACrB,IAAM,WAAA,GAAc;AAKpB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,iBAAA,GAAoB;AAK1B,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,kBAAA,EAAoB,GAAA;AAAA;AAAA,EAEpB,iBAAA,EAAmB,IAAA;AAAA;AAAA,EAEnB,yBAAA,EAA2B,EAAA;AAAA;AAAA,EAE3B,SAAA,EAAW;AAAA,IACT,WAAA,EAAa,EAAA;AAAA,IACb,aAAA,EAAe,EAAA;AAAA,IACf,cAAA,EAAgB,EAAA;AAAA,IAChB,YAAA,EAAc,GAAA;AAAA,IACd,aAAA,EAAe,GAAA;AAAA,IACf,WAAA,EAAa,GAAA;AAAA,IACb,aAAA,EAAe,GAAA;AAAA,IACf,KAAA,EAAO,CAAA;AAAA,IACP,iBAAA,EAAmB,CAAA;AAAA,IACnB,mBAAA,EAAqB;AAAA;AAEzB;AAKO,IAAM,OAAA,GAAU;AAAA,EACrB,OAAA,EAAS,gBAAA;AAAA,EACT,SAAA,EAAW,kBAAA;AAAA,EACX,SAAA,EAAW,kBAAA;AAAA,EACX,cAAA,EAAgB,uBAAA;AAAA,EAChB,YAAA,EAAc,cAAA;AAAA,EACd,YAAA,EAAc;AAChB;AAKO,IAAM,iBAAA,GAAoB,kBAAA;;;ACnC1B,IAAM,aAAN,MAAiB;AAAA,EAGtB,WAAA,CAAY,MAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgBA,uBAAM,MAAA,CAAO;AAAA,MAChC,OAAA,EAAS,OAAO,OAAA,IAAW,YAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW,GAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,QACP,CAAC,OAAA,CAAQ,YAAY,GAAG,iBAAA;AAAA,QACxB,GAAG,MAAA,CAAO;AAAA;AACZ,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,QAAA,CAAS,GAAA;AAAA,MACvC,CAAC,QAAA,KAAa,QAAA;AAAA,MACd,CAAC,KAAA,KAAU;AACT,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,KAAY,KAAA,CAAM,QAAA;AAGxC,UAAA,IAAI,WAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,YAAY,MAAM,MAAA,EAAQ;AAC9D,YAAA,MAAM,IAAI,kBAAA;AAAA,cACR,MAAM,OAAA,IAAW;AAAA,aACnB;AAAA,UACF;AAGA,UAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,YAAA,MAAM,IAAI,uBAAA;AAAA,cACR,MAAM,OAAA,IAAW;AAAA,aACnB;AAAA,UACF;AAGA,UAAA,IAAI,WAAW,GAAA,EAAK;AAClB,YAAA,MAAM,IAAI,mBAAA;AAAA,cACR,MAAM,OAAA,IAAW,mBAAA;AAAA,cACjB,IAAA,EAAM;AAAA,aACR;AAAA,UACF;AAGA,UAAA,MAAM,IAAI,YAAA;AAAA,YACR,IAAA,EAAM,OAAA,IAAW,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAA;AAAA,YACzD,MAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,MAAM,OAAA,IAAW,wBAAA;AAAA,UACjB,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,GAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CACJ,GAAA,EACA,IAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,IAAA,CAAQ,GAAA,EAAK,MAAM,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,GAAA,EACA,IAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAO,GAAA,EAAK,MAAM,MAAM,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CACJ,GAAA,EACA,IAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAS,GAAA,EAAK,MAAM,MAAM,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,GAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,CAAU,GAAA,EAAK,MAAM,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,KAAa,KAAA,EAAqB;AAC1C,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,GAAA,EAAmB;AAC9B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACF,CAAA;AClIO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBzB,OAAO,YAAY,MAAA,EAAmC;AACpD,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,GAAO,EAAA;AAAA,MACP,YAAA,GAAe;AAAA,KACjB,GAAI,MAAA;AAGJ,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,SAAS,CAAA,EAAG,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,EAAG,YAAY,CAAA,CAAA;AAG9E,IAAA,MAAM,IAAA,GAAOC,iBAAA,CAAW,QAAA,EAAU,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AAGnB,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAA,GAAuB;AAC5B,IAAA,IAAI,GAAA,GAAM,KAAK,GAAA,EAAI;AAGnB,IAAA,OAAO,GAAA,IAAO,KAAK,iBAAA,EAAmB;AACpC,MAAA,GAAA,GAAM,KAAK,GAAA,EAAI;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,iBAAA,GAAoB,GAAA;AACzB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,mBAAA,CAAoB,MAAA,EAAgB,SAAA,EAAyB;AAClE,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,MAAA,CAAO,WAAW,EAAA,EAAI;AACxB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,SAAA,CAAU,WAAW,EAAA,EAAI;AAC3B,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,QAAA,GAAW,cAAA;AACjB,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;AA/Fa,aAAA,CACJ,iBAAA,GAA4B,CAAA;;;ACA9B,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvC,MAAM,aAAA,GAAqC;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,iBAAiB,CAAA;AAClE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAA,GAAiC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,mBAAmB,CAAA;AACpE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,GAAqC;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,uBAAuB,CAAA;AACxE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAA,GAAgD;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwB,kBAAkB,CAAA;AAC3E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,IAAA,EAA6C;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAwB,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AACnF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAA,GAA6C;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAqB,0BAA0B,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,wBAAwB,IAAA,EAA4C;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAmB,CAAA,WAAA,EAAc,IAAI,CAAA,cAAA,CAAgB,CAAA;AACtF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,IAAA,EAAwC;AACzD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAe,CAAA,WAAA,EAAc,IAAI,CAAA,UAAA,CAAY,CAAA;AAC9E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,IAAA,EAAwC;AAC7D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAe,CAAA,WAAA,EAAc,IAAI,CAAA,eAAA,CAAiB,CAAA;AACnF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAA,CAAgB,IAAA,EAAoB,MAAA,EAA+C;AACvF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAa,CAAA,WAAA,EAAc,IAAI,CAAA,OAAA,CAAA,EAAW;AAAA,MACzE;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,MAAA,EAA8D;AAChF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA8B,uBAAA,EAAyB;AAAA,MACtF;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAqB,IAAA,EAAuC;AAChE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAc,CAAA,WAAA,EAAc,IAAI,CAAA,WAAA,CAAa,CAAA;AAC9E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAA,CAAgB,IAAA,EAAoB,MAAA,EAAoD;AAC5F,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAmB,CAAA,WAAA,EAAc,IAAI,CAAA,QAAA,CAAA,EAAY;AAAA,MAChF;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBAAA,CAAoB,IAAA,EAAoB,MAAA,EAAoD;AAChG,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAmB,CAAA,WAAA,EAAc,IAAI,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAC1F;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,GAAyC;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,yBAAyB,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,sBAAsB,IAAA,EAAmD;AAC7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA0B,oCAAA,EAAsC;AAAA,MAC/F,MAAA,EAAQ,EAAE,YAAA,EAAc,IAAA;AAAK,KAC9B,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,GAAmC;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,uBAAuB,CAAA;AACxE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,4BAA4B,IAAA,EAA+C;AAC/E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAsB,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AACrF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACpOO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvC,MAAM,YAAY,MAAA,EAA6C;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAe,sBAAA,EAAwB;AAAA,MACtE;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,sBAAsB,MAAA,EAA2D;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,gCAAA,EAAkC;AAAA,MACpF,QAAQ,MAAA,GAAS;AAAA,QACf,GAAG,MAAA;AAAA,QACH,gBAAA,EAAkB,MAAA,CAAO,gBAAA,EAAkB,IAAA,CAAK,GAAG;AAAA,OACrD,GAAI;AAAA,KACL,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAgB,MAAA,EAA6D;AACjF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAoB,0BAAA,EAA4B;AAAA,MAC/E;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,sBAAA,CAAuB,IAAA,EAAoB,MAAA,EAA6D;AAC5G,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAoB,CAAA,YAAA,EAAe,IAAI,CAAA,aAAA,CAAA,EAAiB;AAAA,MACvF;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,GAAoC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,wBAAwB,CAAA;AACzE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,GAAwC;AAC5C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAkB,yBAAyB,CAAA;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,OAAA,EAAuD;AAC5E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAiB,0BAA0B,OAAO,CAAA;AACnF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,wBAAwB,OAAA,EAAyD;AACrF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,mCAAmC,OAAO,CAAA;AACtG,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,GAAgC;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAc,sBAAsB,CAAA;AACrE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,OAAA,EAA6D;AAC9E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,wBAAwB,OAAO,CAAA;AAC3F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,KAAA,EAA8C;AAC/D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,MAAA,CAA6B,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAC7F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACjIO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAavC,MAAM,gBAAgB,OAAA,EAAoD;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,oBAAoB,OAAO,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBAAkB,OAAA,EAAsD;AAC5E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,oBAAoB,OAAO,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,OAAA,EAAqD;AAC1E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,qBAAqB,OAAO,CAAA;AACjF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAmB,OAAA,EAAuD;AAC9E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,qBAAqB,OAAO,CAAA;AACjF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAoB,OAAA,EAAwD;AAChF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,yBAAyB,OAAO,CAAA;AACrF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,sBAAsB,OAAA,EAA0D;AACpF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,yBAAyB,OAAO,CAAA;AACrF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,OAAA,EAAyD;AAC9E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAyB,oBAAoB,OAAO,CAAA;AACrF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,sBAAsB,OAAA,EAAqE;AAC/F,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAA+B,2BAA2B,OAAO,CAAA;AAClG,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,uBAAA,GAA6D;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA8B,yBAAyB,CAAA;AACxF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,yBAAA,CAA0B,IAAA,EAAoB,OAAA,EAAkD;AACpG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,oCAAA,EAAuC,IAAI,CAAA,SAAA,EAAY,OAAO,CAAA;AAAA,KAChE;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,2BAA2B,IAAA,EAAuD;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,2BAA2B,IAAI,CAAA,QAAA;AAAA,KACjC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,OAAA,EAA2E;AACtG,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,kCAAkC,OAAO,CAAA;AACxG,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,cAAA,CAAe,IAAA,EAAoB,OAAA,EAA2D;AAClG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAA0B,CAAA,WAAA,EAAc,IAAI,UAAU,OAAO,CAAA;AAC9F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,gBAAA,CAAiB,IAAA,EAAoB,OAAA,EAAqD;AAC9F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAoB,CAAA,WAAA,EAAc,IAAI,UAAU,OAAO,CAAA;AACxF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAA,CAAqB,IAAA,EAAoB,OAAA,EAA+C;AAC5F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwB,CAAA,WAAA,EAAc,IAAI,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AAC9F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,cAAA,CAAe,IAAA,EAAoB,OAAA,EAA+C;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwB,CAAA,WAAA,EAAc,IAAI,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAChG,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,0BAAA,CAA2B,IAAA,EAAoB,eAAA,EAA+D;AAClH,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,WAAA,EAAc,IAAI,CAAA,iBAAA,EAAoB,eAAe,CAAA;AAAA,KACvD;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAA,GAAyC;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAiB,iBAAiB,CAAA;AACnE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,gBAAgB,MAAA,EAAgE;AACpF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA8B,oBAAA,EAAsB;AAAA,MACnF,QAAQ,MAAA,GAAS;AAAA,QACf,GAAG,MAAA;AAAA,QACH,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,IAAA,CAAK,GAAG,CAAA;AAAA,QACnC,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,GAC3C,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAC5B,MAAA,CAAO;AAAA,OACb,GAAI;AAAA,KACL,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,OAAA,EAAmD;AAC9E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAA4B,CAAA,mCAAA,EAAsC,OAAO,CAAA,CAAE,CAAA;AAC5G,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mCAAmC,eAAA,EAAmE;AAC1G,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,8CAA8C,eAAe,CAAA;AAAA,KAC/D;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,sBAAsB,OAAA,EAAkD;AAC5E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAA2B,CAAA,kCAAA,EAAqC,OAAO,CAAA,CAAE,CAAA;AAC1G,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kCAAkC,eAAA,EAAkE;AACxG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,6CAA6C,eAAe,CAAA;AAAA,KAC9D;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAY,OAAA,EAAqD;AACrE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,qBAAqB,OAAO,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,OAAA,EAAuD;AACzE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,qBAAqB,OAAO,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAY,OAAA,EAAqD;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAsB,kBAAA,EAAoB;AAAA,MACzE,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,OAAA,EAAuD;AACzE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAsB,kBAAA,EAAoB;AAAA,MACzE,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BAAA,GAA2D;AAC/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAA4B,yBAAyB,CAAA;AACtF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,+BAA+B,IAAA,EAAkD;AACrF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,MAAA,CAA4B,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAC9F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,OAAA,EAAgF;AAC3G,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAA4B,qCAAA,EAAuC;AAAA,MAClG,IAAA,EAAM;AAAA,QACJ,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,cAAc,OAAA,CAAQ;AAAA;AACxB,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAA,GAAgD;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAA4B,YAAY,CAAA;AACzE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,IAAA,EAAkD;AAC7E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,MAAA,CAA4B,CAAA,WAAA,EAAc,IAAI,CAAA,CAAE,CAAA;AACjF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACjcO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBvC,MAAM,uBAAA,CACJ,YAAA,EACA,WAAA,EACyB;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,qBAAqB,YAAY,CAAA,gBAAA,CAAA;AAAA,MACjC,EAAE,MAAA,EAAQ,WAAA,GAAc,EAAE,WAAA,KAAgB,MAAA;AAAU,KACtD;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,wBACJ,MAAA,EACqC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,mCAAA;AAAA,MACA,EAAE,MAAA;AAAO,KACX;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,uBAAA,GAAyD;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,kCACJ,YAAA,EAC+B;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,kCAAkC,YAAY,CAAA;AAAA,KAChD;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,uBAAA,CAAwB,YAAA,EAA4B,WAAA,EAAqD;AAC7G,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,qBAAqB,YAAY,CAAA,SAAA,CAAA;AAAA,MAC/B,EAAE,MAAA,EAAQ,WAAA,GAAc,EAAE,WAAA,KAAgB,MAAA;AAAU,KACxD;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,eAAe,OAAA,EAAqE;AACxF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC/B,CAAA,kBAAA,EAAqB,QAAQ,QAAQ,CAAA,SAAA,CAAA;AAAA,MACrC;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,yBAAA,CACJ,YAAA,EACA,UAAA,EACiC;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,kBAAA,EAAqB,YAAY,CAAA,UAAA,EAAa,UAAU,CAAA;AAAA,KAC1D;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,mBAAA,GAAkD;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,2BACJ,MAAA,EACwC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,oCAAA;AAAA,MACA,EAAE,MAAA;AAAO,KACX;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,cAAA,CACJ,YAAA,EACA,OAAA,EACsB;AACtB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC/B,mBAAmB,YAAY,CAAA,SAAA,CAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,cAAA,CAAe,YAAA,EAA4B,SAAA,EAAyC;AACxF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,gBAAA,EAAmB,YAAY,CAAA,UAAA,EAAa,SAAS,CAAA;AAAA,KACvD;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,gBAAgB,YAAA,EAAoD;AACxE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,mBAAmB,YAAY,CAAA,SAAA;AAAA,KACjC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,iBAAA,CAAkB,YAAA,EAA4B,SAAA,EAAkC;AACpF,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,mBAAmB,YAAY,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,SAAS,YAAA,EAA6C;AAC1D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAY,CAAA,gBAAA,EAAmB,YAAY,CAAA,MAAA,CAAQ,CAAA;AACpF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,wBAAwB,YAAA,EAA2D;AACvF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,mBAAmB,YAAY,CAAA,kBAAA;AAAA,KACjC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,0BAAA,CACJ,YAAA,EACA,iBAAA,EACkC;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,gBAAA,EAAmB,YAAY,CAAA,mBAAA,EAAsB,iBAAiB,CAAA;AAAA,KACxE;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,qBAAqB,YAAA,EAAqD;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,mBAAmB,YAAY,CAAA,SAAA;AAAA,KACjC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,aAAa,OAAA,EAAiE;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC/B,CAAA,gBAAA,EAAmB,QAAQ,QAAQ,CAAA,SAAA,CAAA;AAAA,MACnC;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;AC1ZO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,MAAM,gBAAA,GAA+C;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAuB,oBAAoB,CAAA;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,yBAAA,GAA8D;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA6B,8BAA8B,CAAA;AAC5F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,mBAAmB,IAAA,EAA+C;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAsB,sBAAA,EAAwB;AAAA,MAC7E,MAAA,EAAQ,EAAE,YAAA,EAAc,IAAA;AAAK,KAC9B,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAA2D;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAuB,uBAAA,EAAyB,EAAE,QAAQ,CAAA;AAC3F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAyD;AAC/E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAsB,+BAAA,EAAiC,EAAE,QAAQ,CAAA;AAClG,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,gBAAgB,IAAA,EAA2C;AAC/D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAkB,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,cAAA,CAAe,IAAA,EAAoB,OAAA,EAAuD;AAC9F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAkB,CAAA,oBAAA,EAAuB,IAAI,IAAI,OAAO,CAAA;AACzF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACvCO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAevC,MAAM,aAAA,GAAuC;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAkB,mBAAmB,CAAA;AACtE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,eAAA,GAAyC;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAkB,mBAAmB,CAAA;AACtE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,gBAAA,GAAiD;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAyB,2BAA2B,CAAA;AACrF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,oBAAoB,OAAA,EAA4D;AACpF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAyB,6BAA6B,OAAO,CAAA;AAC9F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,gBAAgB,YAAA,EAAmD;AACvE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAkB,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAE,CAAA;AACxF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,cAAA,CAAe,YAAA,EAA4B,OAAA,EAAuD;AACtG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAkB,CAAA,oBAAA,EAAuB,YAAY,IAAI,OAAO,CAAA;AACjG,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACtHO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBvC,MAAM,QAAA,GAAgC;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,iBAAiB,CAAA;AAClE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,eAAA,GAAuC;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,yBAAyB,CAAA;AAC1E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,YAAA,GAAoC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,gBAAgB,CAAA;AACjE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,WAAW,OAAA,EAA2C;AAC1D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,gBAAA,GAAqD;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA6B,0BAA0B,CAAA;AACxF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,aAAa,OAAA,EAA6C;AAC9D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,oBAAA,EAAsB,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,WAAW,OAAA,EAA+C;AAC9D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,gBAAA,GAAmC;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAW,0BAA0B,CAAA;AACtE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,cAAc,OAAA,EAA8C;AAChE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,kBAAkB,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,iBAAiB,cAAA,EAA4D;AACjF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,eAAe,cAAc,CAAA,QAAA;AAAA,KAC/B;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACnNO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBvC,MAAM,MAAM,OAAA,EAAsC;AAChD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,QAAQ,OAAA,EAAwC;AACpD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,sBAAA,EAAwB,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,YAAY,MAAA,EAAqD;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,sBAAA,EAAwB,EAAE,QAAQ,CAAA;AACtF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,eAAe,MAAA,EAAqD;AACxE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,0BAAA,EAA4B,EAAE,QAAQ,CAAA;AAC1F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,SAAS,MAAA,EAA+C;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,mBAAA,EAAqB,EAAE,QAAQ,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,WAAW,MAAA,EAAkD;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAkB,qBAAA,EAAuB,EAAE,QAAQ,CAAA;AACpF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,WAAW,MAAA,EAAuD;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAuB,qBAAA,EAAuB,EAAE,QAAQ,CAAA;AACzF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;AC/IO,IAAM,SAAN,MAAa;AAAA,EAClB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvC,MAAM,cAAc,OAAA,EAAyD;AAC3E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAsB,WAAW,OAAO,CAAA;AACzE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,aAAA,EAAsC;AACzD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,sBAAA,EAAyB,aAAa,CAAA,QAAA,CAAU,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,uBAAA,CACJ,aAAA,EACA,eAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,sBAAA,EAAyB,aAAa,CAAA,gBAAA,CAAA,EAAoB;AAAA,MAC5E;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,QAAA,EAAgD;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,gBAAA,EAAkB;AAAA,MACpE,MAAA,EAAQ,EAAE,QAAA;AAAS,KACpB,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAA,GAAmC;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,eAAe,CAAA;AACnE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAA,GAAmD;AACvD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAA0B,iBAAiB,CAAA;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,UAAA,EAA6C;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAoB,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,CAAA;AACvF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,aAAA,EAA+C;AACpE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAmB,CAAA,sBAAA,EAAyB,aAAa,CAAA,CAAE,CAAA;AAC5F,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;AChHO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,MAAM,UAAA,GAAgC;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAc,aAAa,CAAA;AAC5D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,UAAU,OAAA,EAAiD;AAC/D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAkB,mBAAmB,OAAO,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACZO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,MAAM,SAAA,GAAiC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAgB,YAAY,CAAA;AAC7D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF;;;ACkDO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkEtB,WAAA,CAAY,MAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,cAAa,GAAI,MAAA;AAG9D,IAAA,IAAK,MAAA,IAAU,CAAC,SAAA,IAAe,CAAC,UAAU,SAAA,EAAY;AACpD,MAAA,MAAM,IAAI,sBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,SAAA,EAAW;AACvB,MAAA,aAAA,CAAc,mBAAA,CAAoB,QAAQ,SAAS,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAGpB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW;AAAA,MACzB,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,KAAK,WAAA,EAAY,CAAE,aAAa,OAAA,CAAQ,GAAA,CAAI,CAACC,OAAAA,KAAW;AAE3D,MAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAA,EAAW;AACjC,QAAA,MAAM,SAAA,GAAY,cAAc,YAAA,EAAa;AAC7C,QAAA,MAAM,MAAA,GAASA,OAAAA,CAAO,MAAA,EAAQ,WAAA,EAAY,IAAK,KAAA;AAC/C,QAAA,IAAI,GAAA,GAAMA,QAAO,GAAA,IAAO,EAAA;AACxB,QAAA,MAAM,OAAOA,OAAAA,CAAO,IAAA,GAAO,KAAK,SAAA,CAAUA,OAAAA,CAAO,IAAI,CAAA,GAAI,EAAA;AAGzD,QAAA,IAAIA,QAAO,MAAA,EAAQ;AAGjB,UAAA,MAAM,aAAuB,EAAC;AAC9B,UAAA,MAAA,CAAO,KAAKA,OAAAA,CAAO,MAAM,EAAE,IAAA,EAAK,CAAE,QAAQ,CAAA,GAAA,KAAO;AAC/C,YAAA,MAAM,KAAA,GAAQA,OAAAA,CAAO,MAAA,CAAO,GAAG,CAAA;AAC/B,YAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAEzC,cAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,YACnC;AAAA,UACF,CAAC,CAAA;AACD,UAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,YAAA,GAAA,GAAM,GAAG,GAAG,CAAA,CAAA,EAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,UACtC;AAIA,UAAAA,QAAO,GAAA,GAAM,GAAA;AACb,UAAA,OAAOA,OAAAA,CAAO,MAAA;AAAA,QAChB;AAEA,QAAA,MAAM,SAAA,GAAY,cAAc,WAAA,CAAY;AAAA,UAC1C,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAA;AAAA,UACA,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,GAAA;AAAA,UACN,IAAA;AAAA,UACA,cAAc,IAAA,CAAK;AAAA,SACpB,CAAA;AAGD,QAAAA,OAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,IAAI,IAAA,CAAK,MAAA;AACvC,QAAAA,OAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA;AACpC,QAAAA,QAAO,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,UAAU,QAAA,EAAS;AACvD,QAAAA,QAAO,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA,GAAIA,OAAAA,CAAO,QAAQ,cAAA,EAAe;AAGrE,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAAA,OAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,cAAc,IAAI,IAAA,CAAK,YAAA;AAAA,QAChD;AAAA,MACF;AAEA,MAAA,OAAOA,OAAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,YAAA,EAA6B;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AACF;ACpMO,IAAe,mBAAA,GAAf,cAA8FC,6BAAA,CAAsB;AAAA,EAWzH,WAAA,CAAY,IAAA,EAAc,MAAA,GAAgC,EAAC,EAAG;AAC5D,IAAA,KAAA,EAAM;AAPR,IAAA,IAAA,CAAU,iBAAA,GAAoB,CAAA;AAE9B,IAAA,IAAA,CAAU,kBAAA,GAAqB,KAAA;AAC/B,IAAA,IAAA,CAAU,WAAA,GAAc,KAAA;AACxB,IAAA,IAAA,CAAU,eAAA,GAAkB,KAAA;AAI1B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,MAAA,EAAQ,OAAO,MAAA,IAAU,EAAA;AAAA,MACzB,SAAA,EAAW,OAAO,SAAA,IAAa,EAAA;AAAA,MAC/B,YAAA,EAAc,OAAO,YAAA,IAAgB,EAAA;AAAA,MACrC,aAAA,EAAe,OAAO,aAAA,IAAiB,IAAA;AAAA,MACvC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,oBAAA,EAAsB,OAAO,oBAAA,IAAwB,QAAA;AAAA,MACrD,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AACA,IAAA,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,IAAI,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,IAAA,CAAK,EAAA,CAAG,UAAA,KAAeC,0BAAA,CAAU,IAAA,IAAQ,IAAA,CAAK,EAAA,CAAG,UAAA,KAAeA,0BAAA,CAAU,UAAA,CAAA,EAAa;AACrG,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,YAAqC,EAAC;AAE5C,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAO,SAAA,EAAW;AAC/C,QAAA,MAAM,SAAA,GAAY,cAAc,YAAA,EAAa;AAC7C,QAAA,MAAM,SAAA,GAAY,cAAc,WAAA,CAAY;AAAA,UAC1C,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,UACvB,SAAA;AAAA,UACA,IAAA,EAAM,KAAA;AAAA,UACN,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAM,EAAA;AAAA,UACN,YAAA,EAAc,KAAK,MAAA,CAAO;AAAA,SAC3B,CAAA;AAED,QAAA,SAAA,CAAU,OAAA,GAAU;AAAA,UAClB,gBAAA,EAAkB,KAAK,MAAA,CAAO,MAAA;AAAA,UAC9B,kBAAA,EAAoB,SAAA;AAAA,UACpB,kBAAA,EAAoB,UAAU,QAAA;AAAS,SACzC;AAEA,QAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,UAAA,SAAA,CAAU,OAAA,CAAQ,uBAAuB,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,QAC3D;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,EAAA,GAAK,IAAIA,0BAAA,CAAU,IAAA,CAAK,KAAK,SAAS,CAAA;AAE3C,MAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,MAAA,EAAQ,MAAM;AACvB,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAyB;AAC9C,QAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MACzB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAiB;AACpC,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,MAAc,MAAA,KAAmB;AACpD,QAAA,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,MAC1C,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,IAAI,mBAAmB,CAAA,mBAAA,EAAsB,KAAK,EAAE,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,MAAA;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,EAAA,EAAI,eAAeA,0BAAA,CAAU,IAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKU,KAAK,OAAA,EAAoB;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAeA,2BAAU,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,mBAAmB,4BAA4B,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAC3E,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKU,UAAA,GAAmB;AAC3B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAEzB,IAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAGrB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAO,SAAA,EAAW;AAC/C,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,MAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AACzB,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEU,SAAA,GAAW;AACjB,IAAA,WAAA,CAAY,MAAM;AACd,MAAA,IAAG,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,eAAA,EAAgB;AAC1C,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAO,CAAA;AAAA,MAC3B;AAAA,IACJ,GAAG,GAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,IAAA,EAA4B;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAI1C,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAG5B,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,IAAI,mBAAmB,CAAA,yBAAA,EAA4B,KAAK,EAAE,CAAC,CAAA;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,YAAY,KAAA,EAAoB;AAExC,IAAA,IAAA,CAAK,KAAK,OAAA,EAAS,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKU,WAAA,CAAY,MAAc,MAAA,EAAsB;AACxD,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAEvB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,MAAM,CAAA;AAE/B,IAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AAGxB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,OAAO,aAAA,EAAe;AACzD,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,GAAyB;AACjC,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAsB;AAE9D,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAI,kBAAA,CAAmB,gCAAgC,CAAC,CAAA;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,IAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,iBAAiB,CAAA;AAEhD,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,GAAwB;AAAA,EAElC;AAMF;;;AC1MO,IAAM,gBAAA,GAAN,cAA+B,mBAAA,CAA8C;AAAA,EAClF,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,OAAO,SAAA,EAAW;AACvC,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AACA,IAAA,KAAA,CAAM,qBAAqB,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,aAAA,EAAqC;AAC7C,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,aAAA,EAAqC;AAC/C,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,GAAwB;AAEhC,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb,EAAE,OAAO,yBAAA,EAA0B;AAAA,MACnC,EAAE,OAAO,iBAAA,EAAkB;AAAA,MAC3B,EAAE,OAAO,qBAAA,EAAsB;AAAA,MAC/B,EAAE,OAAO,gBAAA,EAAiB;AAAA,MAC1B,EAAE,OAAO,mBAAA,EAAoB;AAAA,MAC7B,EAAE,OAAO,oBAAA,EAAqB;AAAA,MAC9B,EAAE,OAAO,qBAAA,EAAsB;AAAA,MAC/B,EAAE,OAAO,oBAAA,EAAqB;AAAA,MAC9B,EAAE,OAAO,qBAAA;AAAsB,KAChC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,OAAA,EAAiC;AACnD,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,OAAyB,CAAA;AACtD,QAAA;AAAA,MAEF,KAAK,qBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,sBAAsB,OAA4B,CAAA;AAC5D,QAAA;AAAA,MAEF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAwB,CAAA;AACpD,QAAA;AAAA,MAEF,KAAK,mBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,aAAa,OAAgC,CAAA;AACvD,QAAA;AAYA;AACJ,EACF;AAEF;;;AC1FO,IAAM,cAAA,GAAN,cAA6B,mBAAA,CAA4C;AAAA,EAC9E,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,KAAA,CAAM,mBAAmB,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAqB,KAAA,EAA6B;AAChD,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb;AAAA,QACE,KAAA,EAAO,6BAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAAyB,KAAA,EAA6B;AACpD,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb;AAAA,QACE,KAAA,EAAO,uBAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAAyB,KAAA,EAA6B;AACpD,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb;AAAA,QACE,KAAA,EAAO,uBAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,KAAA,EAA6B;AAC7C,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb;AAAA,QACE,KAAA,EAAO,WAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwB,KAAA,EAA6B;AACnD,IAAA,IAAA,CAAK,SAAA,CAAU;AAAA,MACb;AAAA,QACE,KAAA,EAAO,kBAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,aAAA,EAAqC;AAC7C,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,aAAA,EAAqC;AAC/C,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,GAAwB;AAAA,EAGlC;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,OAAA,EAAiC;AACnD,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,6BAAA;AAAA,MACL,KAAK,uBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAA0B,CAAA;AACxD,QAAA;AAAA,MAEF,KAAK,uBAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAA8B,CAAA;AAC1D,QAAA;AAAA,MAEF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,aAAa,OAAmB,CAAA;AAC1C,QAAA;AAYA;AACJ,EACF;AAEF","file":"index.js","sourcesContent":["/**\n * Base error class for all VALR API errors\n */\nexport class ValrError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValrError';\n Object.setPrototypeOf(this, ValrError.prototype);\n }\n}\n\n/**\n * Error thrown when API authentication fails\n */\nexport class ValrAuthenticationError extends ValrError {\n constructor(message: string = 'Authentication failed') {\n super(message);\n this.name = 'ValrAuthenticationError';\n Object.setPrototypeOf(this, ValrAuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when API rate limit is exceeded\n */\nexport class ValrRateLimitError extends ValrError {\n constructor(message: string = 'Rate limit exceeded') {\n super(message);\n this.name = 'ValrRateLimitError';\n Object.setPrototypeOf(this, ValrRateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when API request validation fails\n */\nexport class ValrValidationError extends ValrError {\n public readonly errors?: Record<string, string[]>;\n\n constructor(message: string, errors?: Record<string, string[]>) {\n super(message);\n this.name = 'ValrValidationError';\n this.errors = errors;\n Object.setPrototypeOf(this, ValrValidationError.prototype);\n }\n}\n\n/**\n * Error thrown when API request fails due to network or server error\n */\nexport class ValrApiError extends ValrError {\n public readonly statusCode?: number;\n public readonly response?: unknown;\n\n constructor(message: string, statusCode?: number, response?: unknown) {\n super(message);\n this.name = 'ValrApiError';\n this.statusCode = statusCode;\n this.response = response;\n Object.setPrototypeOf(this, ValrApiError.prototype);\n }\n}\n\n/**\n * Error thrown when WebSocket connection fails\n */\nexport class ValrWebSocketError extends ValrError {\n constructor(message: string) {\n super(message);\n this.name = 'ValrWebSocketError';\n Object.setPrototypeOf(this, ValrWebSocketError.prototype);\n }\n}\n\n/**\n * Error thrown when required configuration is missing\n */\nexport class ValrConfigurationError extends ValrError {\n constructor(message: string) {\n super(message);\n this.name = 'ValrConfigurationError';\n Object.setPrototypeOf(this, ValrConfigurationError.prototype);\n }\n}\n","/**\n * VALR API constants\n */\n\n/**\n * Base URL for VALR API\n */\nexport const API_BASE_URL = 'https://api.valr.com';\nexport const WS_BASE_URL = 'wss://api.valr.com';\n\n/**\n * WebSocket URLs\n */\nexport const WS_ACCOUNT_URL_PATH = '/ws/account';\nexport const WS_TRADE_URL_PATH = '/ws/trade';\n\n/**\n * API rate limits\n */\nexport const RATE_LIMITS = {\n /** Global rate limit per API key */\n PER_KEY_PER_MINUTE: 2000,\n /** Global rate limit per IP */\n PER_IP_PER_MINUTE: 1200,\n /** WebSocket new connections per minute */\n WS_CONNECTIONS_PER_MINUTE: 60,\n /** Specific endpoint limits (per second) */\n ENDPOINTS: {\n PUBLIC_TIME: 20,\n PUBLIC_STATUS: 20,\n PUBLIC_BUCKETS: 20,\n BATCH_ORDERS: 400,\n DELETE_ORDERS: 450,\n POST_ORDERS: 400,\n MODIFY_ORDERS: 400,\n LOANS: 1,\n CREATE_SUBACCOUNT: 1,\n SUBACCOUNT_TRANSFER: 20,\n },\n} as const;\n\n/**\n * HTTP request headers\n */\nexport const HEADERS = {\n API_KEY: 'X-VALR-API-KEY',\n SIGNATURE: 'X-VALR-SIGNATURE',\n TIMESTAMP: 'X-VALR-TIMESTAMP',\n SUB_ACCOUNT_ID: 'X-VALR-SUB-ACCOUNT-ID',\n CONTENT_TYPE: 'Content-Type',\n RATE_LIMITED: 'x-valr-ratelimited',\n} as const;\n\n/**\n * API content type\n */\nexport const CONTENT_TYPE_JSON = 'application/json';\n\n/**\n * API version prefixes\n */\nexport const API_VERSION = {\n V1: '/v1',\n V2: '/v2',\n} as const;\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport {\n ValrApiError,\n ValrAuthenticationError,\n ValrRateLimitError,\n ValrValidationError,\n} from '../errors/ValrError';\nimport { API_BASE_URL, CONTENT_TYPE_JSON, HEADERS } from './constants';\n\n/**\n * HTTP client configuration\n */\nexport interface HttpClientConfig {\n baseURL?: string;\n timeout?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * HTTP client wrapper for VALR API\n */\nexport class HttpClient {\n private axiosInstance: AxiosInstance;\n\n constructor(config: HttpClientConfig = {}) {\n this.axiosInstance = axios.create({\n baseURL: config.baseURL || API_BASE_URL,\n timeout: config.timeout || 30000,\n headers: {\n [HEADERS.CONTENT_TYPE]: CONTENT_TYPE_JSON,\n ...config.headers,\n },\n });\n\n // Response interceptor for error handling\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response) {\n const { status, data, headers } = error.response;\n\n // Check for rate limiting\n if (status === 429 || headers[HEADERS.RATE_LIMITED] === 'true') {\n throw new ValrRateLimitError(\n data?.message || 'API rate limit exceeded'\n );\n }\n\n // Check for authentication errors\n if (status === 401 || status === 403) {\n throw new ValrAuthenticationError(\n data?.message || 'Authentication failed'\n );\n }\n\n // Check for validation errors\n if (status === 400) {\n throw new ValrValidationError(\n data?.message || 'Validation failed',\n data?.errors\n );\n }\n\n // Generic API error\n throw new ValrApiError(\n data?.message || `API request failed with status ${status}`,\n status,\n data\n );\n }\n\n // Network or other errors\n throw new ValrApiError(\n error.message || 'Network error occurred',\n undefined,\n error\n );\n }\n );\n }\n\n /**\n * Perform GET request\n */\n async get<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.get<T>(url, config);\n }\n\n /**\n * Perform POST request\n */\n async post<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.post<T>(url, data, config);\n }\n\n /**\n * Perform PUT request\n */\n async put<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.put<T>(url, data, config);\n }\n\n /**\n * Perform PATCH request\n */\n async patch<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.patch<T>(url, data, config);\n }\n\n /**\n * Perform DELETE request\n */\n async delete<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<AxiosResponse<T>> {\n return this.axiosInstance.delete<T>(url, config);\n }\n\n /**\n * Set default header\n */\n setHeader(key: string, value: string): void {\n this.axiosInstance.defaults.headers.common[key] = value;\n }\n\n /**\n * Remove default header\n */\n removeHeader(key: string): void {\n delete this.axiosInstance.defaults.headers.common[key];\n }\n\n /**\n * Get the underlying Axios instance\n */\n getInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","import { createHmac } from 'crypto';\n\n/**\n * Request signing configuration\n */\nexport interface SignRequestParams {\n /** API secret key for HMAC signing */\n apiSecret: string;\n /** Unix timestamp in milliseconds */\n timestamp: number;\n /** HTTP verb (GET, POST, PUT, DELETE, etc.) */\n verb: string;\n /** Request path (including query string, excluding host) */\n path: string;\n /** Request body as string (optional, empty string if no body) */\n body?: string;\n /** Subaccount ID (optional, for subaccount impersonation) */\n subaccountId?: string;\n}\n\n/**\n * Request signer for VALR API authentication\n * Implements HMAC SHA512 signature generation as per VALR API specification\n */\nexport class RequestSigner {\n static lastUsedTimeStamp: number = 0;\n /**\n * Generate HMAC SHA512 signature for VALR API request\n *\n * Signature is computed from concatenation of:\n * timestamp + verb + path + body + subaccountId\n *\n * @param params - Request signing parameters\n * @returns Hex-encoded HMAC SHA512 signature\n *\n * @example\n * ```typescript\n * const signature = RequestSigner.signRequest({\n * apiSecret: 'your-api-secret',\n * timestamp: Date.now(),\n * verb: 'GET',\n * path: '/v1/account/balances',\n * });\n * ```\n */\n static signRequest(params: SignRequestParams): string {\n const {\n apiSecret,\n timestamp,\n verb,\n path,\n body = '',\n subaccountId = '',\n } = params;\n\n // Concatenate all parameters in the required order\n const payload = `${timestamp}${verb.toUpperCase()}${path}${body}${subaccountId}`;\n\n // Create HMAC SHA512 hash\n const hmac = createHmac('sha512', apiSecret);\n hmac.update(payload);\n\n // Return hex-encoded signature\n return hmac.digest('hex');\n }\n\n /**\n * Get current timestamp in milliseconds\n * Guarantees unique timestamps by waiting for the next millisecond if necessary\n *\n * @returns Unix timestamp in milliseconds (guaranteed unique and monotonically increasing)\n */\n static getTimestamp(): number {\n let now = Date.now();\n\n // Spin-lock: wait until we get a timestamp greater than the last used one\n while (now <= this.lastUsedTimeStamp) {\n now = Date.now();\n }\n\n this.lastUsedTimeStamp = now;\n return now;\n }\n\n /**\n * Validate API credentials\n *\n * @param apiKey - API key\n * @param apiSecret - API secret\n * @throws Error if credentials are invalid\n */\n static validateCredentials(apiKey: string, apiSecret: string): void {\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('Invalid API key: must be a non-empty string');\n }\n\n if (!apiSecret || typeof apiSecret !== 'string') {\n throw new Error('Invalid API secret: must be a non-empty string');\n }\n\n // VALR API keys and secrets are 64 characters long\n if (apiKey.length !== 64) {\n throw new Error('Invalid API key: must be 64 characters long');\n }\n\n if (apiSecret.length !== 64) {\n throw new Error('Invalid API secret: must be 64 characters long');\n }\n\n // Validate hex format (only alphanumeric characters)\n const hexRegex = /^[a-f0-9]+$/i;\n if (!hexRegex.test(apiKey)) {\n throw new Error('Invalid API key: must be hexadecimal');\n }\n\n if (!hexRegex.test(apiSecret)) {\n throw new Error('Invalid API secret: must be hexadecimal');\n }\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ServerTime,\n ValrStatus,\n Currency,\n CurrencyPairInfo,\n MarketSummary,\n OrderBook,\n Trade,\n CurrencyPairOrderTypes,\n PriceBucket,\n FuturesInfo,\n FundingRateHistory,\n LoanInfo,\n LeverageOption,\n TradeHistoryParams,\n PriceBucketsParams,\n OrderTypesParams,\n CurrencyPair,\n PairType,\n} from '../types';\n\n/**\n * Public API methods (no authentication required)\n */\nexport class PublicAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get server time\n * GET /v1/public/time\n *\n * @returns Server time with Unix epoch and ISO timestamp\n */\n async getServerTime(): Promise<ServerTime> {\n const response = await this.http.get<ServerTime>('/v1/public/time');\n return response.data;\n }\n\n /**\n * Get VALR API status\n * GET /v1/public/status\n *\n * @returns Current API status\n */\n async getStatus(): Promise<ValrStatus> {\n const response = await this.http.get<ValrStatus>('/v1/public/status');\n return response.data;\n }\n\n /**\n * Get list of currencies supported by VALR\n * GET /v1/public/currencies\n *\n * @returns Array of currency information\n */\n async getCurrencies(): Promise<Currency[]> {\n const response = await this.http.get<Currency[]>('/v1/public/currencies');\n return response.data;\n }\n\n /**\n * Get list of all currency pairs\n * GET /v1/public/pairs\n *\n * @returns Array of currency pair information\n */\n async getCurrencyPairs(): Promise<CurrencyPairInfo[]> {\n const response = await this.http.get<CurrencyPairInfo[]>('/v1/public/pairs');\n return response.data;\n }\n\n /**\n * Get currency pairs by type (SPOT or FUTURES)\n * GET /v1/public/pairs/:type\n *\n * @param type - Pair type (SPOT or FUTURES)\n * @returns Array of currency pair information\n */\n async getCurrencyPairsByType(type: PairType): Promise<CurrencyPairInfo[]> {\n const response = await this.http.get<CurrencyPairInfo[]>(`/v1/public/pairs/${type}`);\n return response.data;\n }\n\n /**\n * Get market summary for all pairs\n * GET /v1/public/marketsummary\n *\n * @returns Array of market summaries\n */\n async getMarketSummary(): Promise<MarketSummary[]> {\n const response = await this.http.get<MarketSummary[]>('/v1/public/marketsummary');\n return response.data;\n }\n\n /**\n * Get market summary for a specific currency pair\n * GET /v1/public/:currencyPair/marketsummary\n *\n * @param pair - Currency pair (e.g., 'BTCZAR', 'ETHUSDC')\n * @returns Market summary for the pair\n */\n async getMarketSummaryForPair(pair: CurrencyPair): Promise<MarketSummary> {\n const response = await this.http.get<MarketSummary>(`/v1/public/${pair}/marketsummary`);\n return response.data;\n }\n\n /**\n * Get aggregated order book for a currency pair\n * GET /v1/public/:currencyPair/orderbook\n *\n * @param pair - Currency pair\n * @returns Aggregated order book\n */\n async getOrderBook(pair: CurrencyPair): Promise<OrderBook> {\n const response = await this.http.get<OrderBook>(`/v1/public/${pair}/orderbook`);\n return response.data;\n }\n\n /**\n * Get full (non-aggregated) order book for a currency pair\n * GET /v1/public/:currencyPair/orderbook/full\n *\n * @param pair - Currency pair\n * @returns Full order book with individual orders\n */\n async getFullOrderBook(pair: CurrencyPair): Promise<OrderBook> {\n const response = await this.http.get<OrderBook>(`/v1/public/${pair}/orderbook/full`);\n return response.data;\n }\n\n /**\n * Get recent trades for a currency pair\n * GET /v1/public/:currencyPair/trades\n *\n * @param pair - Currency pair\n * @param params - Query parameters (skip, limit, startTime, endTime, beforeId)\n * @returns Array of trades\n */\n async getTradeHistory(pair: CurrencyPair, params?: TradeHistoryParams): Promise<Trade[]> {\n const response = await this.http.get<Trade[]>(`/v1/public/${pair}/trades`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get supported order types for all currency pairs\n * GET /v1/public/ordertypes\n *\n * @param params - Query parameters (includeInactivePairs)\n * @returns Array of currency pairs with their supported order types\n */\n async getOrderTypes(params?: OrderTypesParams): Promise<CurrencyPairOrderTypes[]> {\n const response = await this.http.get<CurrencyPairOrderTypes[]>('/v1/public/ordertypes', {\n params,\n });\n return response.data;\n }\n\n /**\n * Get supported order types for a specific currency pair\n * GET /v1/public/:currencyPair/ordertypes\n *\n * @param pair - Currency pair\n * @returns Array of supported order type strings\n */\n async getOrderTypesForPair(pair: CurrencyPair): Promise<string[]> {\n const response = await this.http.get<string[]>(`/v1/public/${pair}/ordertypes`);\n return response.data;\n }\n\n /**\n * Get OHLC price buckets for a currency pair\n * GET /v1/public/:currencyPair/buckets\n *\n * @param pair - Currency pair\n * @param params - Query parameters (periodSeconds, startTime, endTime, skip, limit, includeEmpty)\n * @returns Array of price buckets (OHLC data)\n */\n async getPriceBuckets(pair: CurrencyPair, params: PriceBucketsParams): Promise<PriceBucket[]> {\n const response = await this.http.get<PriceBucket[]>(`/v1/public/${pair}/buckets`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get mark price buckets for a futures currency pair\n * GET /v1/public/:currencyPair/markprice/buckets\n *\n * @param pair - Currency pair (futures)\n * @param params - Query parameters (periodSeconds, startTime, endTime, skip, limit, includeEmpty)\n * @returns Array of mark price buckets\n */\n async getMarkPriceBuckets(pair: CurrencyPair, params: PriceBucketsParams): Promise<PriceBucket[]> {\n const response = await this.http.get<PriceBucket[]>(`/v1/public/${pair}/markprice/buckets`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get futures contracts information\n * GET /v1/public/futures/info\n *\n * @returns Array of futures contract information\n */\n async getFuturesInfo(): Promise<FuturesInfo[]> {\n const response = await this.http.get<FuturesInfo[]>('/v1/public/futures/info');\n return response.data;\n }\n\n /**\n * Get funding rate history for a futures pair\n * GET /v1/public/futures/funding/history\n *\n * @param pair - Futures currency pair\n * @returns Array of funding rate history\n */\n async getFundingRateHistory(pair: CurrencyPair): Promise<FundingRateHistory[]> {\n const response = await this.http.get<FundingRateHistory[]>('/v1/public/futures/funding/history', {\n params: { currencyPair: pair },\n });\n return response.data;\n }\n\n /**\n * Get loan information for all currencies\n * GET /v1/public/loans/info\n *\n * @returns Array of loan information\n */\n async getLoanInfo(): Promise<LoanInfo[]> {\n const response = await this.http.get<LoanInfo[]>('/v1/public/loans/info');\n return response.data;\n }\n\n /**\n * Get available leverage options for a currency pair\n * GET /v1/public/risklimit/:currencypair\n *\n * @param pair - Currency pair\n * @returns Array of leverage options with risk limits\n */\n async getAvailableLeverageOptions(pair: CurrencyPair): Promise<LeverageOption[]> {\n const response = await this.http.get<LeverageOption[]>(`/v1/public/risklimit/${pair}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n Balance,\n Transaction,\n AccountTrade,\n TradeFee,\n Subaccount,\n ApiKey,\n BalancesParams,\n TransactionHistoryParams,\n TradeHistoryParams as AccountTradeHistoryParams,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateSubaccountRequest,\n TransferRequest,\n CurrencyPair,\n} from '../types';\n\n/**\n * Account API methods (requires authentication)\n */\nexport class AccountAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get account balances for all currencies\n * GET /v1/account/balances\n *\n * @param params - Query parameters (excludeZeroBalances)\n * @returns Array of currency balances\n */\n async getBalances(params?: BalancesParams): Promise<Balance[]> {\n const response = await this.http.get<Balance[]>('/v1/account/balances', {\n params,\n });\n return response.data;\n }\n\n /**\n * Get transaction history\n * GET /v1/account/transactionhistory\n *\n * @param params - Query parameters (skip, limit, beforeId, transactionTypes, currency, startTime, endTime)\n * @returns Array of transactions\n */\n async getTransactionHistory(params?: TransactionHistoryParams): Promise<Transaction[]> {\n const response = await this.http.get<Transaction[]>('/v1/account/transactionhistory', {\n params: params ? {\n ...params,\n transactionTypes: params.transactionTypes?.join(','),\n } : undefined,\n });\n return response.data;\n }\n\n /**\n * Get trade history for all currency pairs\n * GET /v1/account/tradehistory\n *\n * @param params - Query parameters (skip, limit)\n * @returns Array of account trades\n */\n async getTradeHistory(params?: AccountTradeHistoryParams): Promise<AccountTrade[]> {\n const response = await this.http.get<AccountTrade[]>('/v1/account/tradehistory', {\n params,\n });\n return response.data;\n }\n\n /**\n * Get trade history for a specific currency pair\n * GET /v1/account/:currencyPair/tradehistory\n *\n * @param pair - Currency pair\n * @param params - Query parameters (skip, limit)\n * @returns Array of account trades for the pair\n */\n async getTradeHistoryForPair(pair: CurrencyPair, params?: AccountTradeHistoryParams): Promise<AccountTrade[]> {\n const response = await this.http.get<AccountTrade[]>(`/v1/account/${pair}/tradehistory`, {\n params,\n });\n return response.data;\n }\n\n /**\n * Get trading fees for all currency pairs\n * GET /v1/account/fees/trade\n *\n * @returns Array of trading fees per currency pair\n */\n async getTradeFees(): Promise<TradeFee[]> {\n const response = await this.http.get<TradeFee[]>('/v1/account/fees/trade');\n return response.data;\n }\n\n /**\n * Get list of subaccounts\n * GET /v1/account/subaccounts\n *\n * @returns Array of subaccounts\n */\n async getSubaccounts(): Promise<Subaccount[]> {\n const response = await this.http.get<Subaccount[]>('/v1/account/subaccounts');\n return response.data;\n }\n\n /**\n * Create a new subaccount\n * POST /v1/account/subaccount\n *\n * @param request - Subaccount creation request\n * @returns Created subaccount\n */\n async createSubaccount(request: CreateSubaccountRequest): Promise<Subaccount> {\n const response = await this.http.post<Subaccount>('/v1/account/subaccount', request);\n return response.data;\n }\n\n /**\n * Transfer funds between primary account and subaccounts\n * POST /v1/account/subaccount/transfer\n *\n * @param request - Transfer request\n * @returns Transfer confirmation\n */\n async transferBetweenAccounts(request: TransferRequest): Promise<{ success: boolean }> {\n const response = await this.http.post<{ success: boolean }>('/v1/account/subaccount/transfer', request);\n return response.data;\n }\n\n /**\n * Get list of API keys\n * GET /v1/account/api-keys\n *\n * @returns Array of API keys\n */\n async getApiKeys(): Promise<ApiKey[]> {\n const response = await this.http.get<ApiKey[]>('/v1/account/api-keys');\n return response.data;\n }\n\n /**\n * Create a new API key\n * POST /v1/account/api-keys\n *\n * @param request - API key creation request\n * @returns Created API key with secret (SAVE THE SECRET - only returned once!)\n */\n async createApiKey(request: CreateApiKeyRequest): Promise<CreateApiKeyResponse> {\n const response = await this.http.post<CreateApiKeyResponse>('/v1/account/api-keys', request);\n return response.data;\n }\n\n /**\n * Delete an API key\n * DELETE /v1/account/api-keys/:keyId\n *\n * @param keyId - API key ID to delete\n * @returns Deletion confirmation\n */\n async deleteApiKey(keyId: string): Promise<{ success: boolean }> {\n const response = await this.http.delete<{ success: boolean }>(`/v1/account/api-keys/${keyId}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n LimitOrderRequest,\n LimitOrderRequestV2,\n MarketOrderRequest,\n MarketOrderRequestV2,\n StopLimitOrderRequest,\n StopLimitOrderRequestV2,\n SimpleQuoteRequest,\n SimpleQuoteResponse,\n SimpleOrderRequest,\n OrderResponse,\n BatchOrderRequest,\n BatchOrderResponse,\n OrderStatusSummary,\n OpenOrder,\n ConditionalOrderRequest,\n ConditionalOrderResponse,\n ConditionalOrderStatus,\n ModifyConditionalOrderRequest,\n ModifyOrderRequest,\n ModifyOrderRequestV2,\n CancelOrderRequest,\n CancelOrderRequestV2,\n OrderHistoryParams,\n HistoricalOrderSummary,\n HistoricalOrderDetail,\n CurrencyPair,\n OrderId,\n CustomerOrderId,\n} from '../types';\n\n/**\n * Trading API methods (requires authentication with trade permission)\n */\nexport class TradingAPI {\n constructor(private http: HttpClient) {}\n\n // ============================================================================\n // Order Placement\n // ============================================================================\n\n /**\n * Place a limit order (v1)\n * POST /v1/orders/limit\n *\n * @param request - Limit order request\n * @returns Order response with order ID\n */\n async placeLimitOrder(request: LimitOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v1/orders/limit', request);\n return response.data;\n }\n\n /**\n * Place a limit order (v2) - supports baseAmount or quoteAmount\n * POST /v2/orders/limit\n *\n * @param request - Limit order request (v2)\n * @returns Order response with order ID\n */\n async placeLimitOrderV2(request: LimitOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v2/orders/limit', request);\n return response.data;\n }\n\n /**\n * Place a market order (v1)\n * POST /v1/orders/market\n *\n * @param request - Market order request\n * @returns Order response with order ID\n */\n async placeMarketOrder(request: MarketOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v1/orders/market', request);\n return response.data;\n }\n\n /**\n * Place a market order (v2)\n * POST /v2/orders/market\n *\n * @param request - Market order request (v2)\n * @returns Order response with order ID\n */\n async placeMarketOrderV2(request: MarketOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v2/orders/market', request);\n return response.data;\n }\n\n /**\n * Place a stop-limit order (v1)\n * POST /v1/orders/stop/limit\n *\n * @param request - Stop-limit order request\n * @returns Order response with order ID\n */\n async placeStopLimitOrder(request: StopLimitOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v1/orders/stop/limit', request);\n return response.data;\n }\n\n /**\n * Place a stop-limit order (v2)\n * POST /v2/orders/stop/limit\n *\n * @param request - Stop-limit order request (v2)\n * @returns Order response with order ID\n */\n async placeStopLimitOrderV2(request: StopLimitOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>('/v2/orders/stop/limit', request);\n return response.data;\n }\n\n /**\n * Place batch orders (up to 10 orders in a single request)\n * POST /v1/batch/orders\n *\n * @param request - Batch order request\n * @returns Array of order responses\n */\n async placeBatchOrders(request: BatchOrderRequest): Promise<BatchOrderResponse> {\n const response = await this.http.post<BatchOrderResponse>('/v1/batch/orders', request);\n return response.data;\n }\n\n // ============================================================================\n // Conditional Orders\n // ============================================================================\n\n /**\n * Place a conditional order (stop-loss or take-profit)\n * POST /v1/orders/conditionals\n *\n * @param request - Conditional order request\n * @returns Conditional order response\n */\n async placeConditionalOrder(request: ConditionalOrderRequest): Promise<ConditionalOrderResponse> {\n const response = await this.http.post<ConditionalOrderResponse>('/v1/orders/conditionals', request);\n return response.data;\n }\n\n /**\n * Get all conditional orders\n * GET /v1/orders/conditionals\n *\n * @returns Array of conditional orders\n */\n async getAllConditionalOrders(): Promise<ConditionalOrderStatus[]> {\n const response = await this.http.get<ConditionalOrderStatus[]>('/v1/orders/conditionals');\n return response.data;\n }\n\n /**\n * Get conditional order status by ID\n * GET /v1/orders/conditionals/conditional/:currencyPair/orderid/:orderId\n *\n * @param pair - Currency pair\n * @param orderId - Conditional order ID\n * @returns Conditional order status\n */\n async getConditionalOrderStatus(pair: CurrencyPair, orderId: string): Promise<ConditionalOrderStatus> {\n const response = await this.http.get<ConditionalOrderStatus>(\n `/v1/orders/conditionals/conditional/${pair}/orderid/${orderId}`\n );\n return response.data;\n }\n\n /**\n * Get conditional order history for a currency pair\n * GET /v1/orders/conditionals/:currencyPair/history\n *\n * @param pair - Currency pair\n * @returns Array of historical conditional orders\n */\n async getConditionalOrderHistory(pair: CurrencyPair): Promise<ConditionalOrderStatus[]> {\n const response = await this.http.get<ConditionalOrderStatus[]>(\n `/v1/orders/conditionals/${pair}/history`\n );\n return response.data;\n }\n\n /**\n * Modify a conditional order\n * PUT /v1/orders/conditionals/modify\n *\n * @param request - Conditional order modification request\n * @returns Updated conditional order\n */\n async modifyConditionalOrder(request: ModifyConditionalOrderRequest): Promise<ConditionalOrderResponse> {\n const response = await this.http.put<ConditionalOrderResponse>('/v1/orders/conditionals/modify', request);\n return response.data;\n }\n\n // ============================================================================\n // Simple Buy/Sell\n // ============================================================================\n\n /**\n * Get a quote for simple buy/sell\n * POST /v1/simple/:currencyPair/quote\n *\n * @param pair - Currency pair\n * @param request - Quote request\n * @returns Quote with ID (valid for 5 seconds)\n */\n async getSimpleQuote(pair: CurrencyPair, request: SimpleQuoteRequest): Promise<SimpleQuoteResponse> {\n const response = await this.http.post<SimpleQuoteResponse>(`/v1/simple/${pair}/quote`, request);\n return response.data;\n }\n\n /**\n * Place a simple buy/sell order using a quote\n * POST /v1/simple/:currencyPair/order\n *\n * @param pair - Currency pair\n * @param request - Simple order request with quote ID\n * @returns Order response\n */\n async placeSimpleOrder(pair: CurrencyPair, request: SimpleOrderRequest): Promise<OrderResponse> {\n const response = await this.http.post<OrderResponse>(`/v1/simple/${pair}/order`, request);\n return response.data;\n }\n\n /**\n * Get simple order status\n * GET /v1/simple/:currencyPair/order/:orderId\n *\n * @param pair - Currency pair\n * @param orderId - Order ID\n * @returns Order status\n */\n async getSimpleOrderStatus(pair: CurrencyPair, orderId: OrderId): Promise<OrderStatusSummary> {\n const response = await this.http.get<OrderStatusSummary>(`/v1/simple/${pair}/order/${orderId}`);\n return response.data;\n }\n\n // ============================================================================\n // Order Status Queries\n // ============================================================================\n\n /**\n * Get order status by order ID\n * GET /v1/orders/:currencyPair/orderid/:orderId\n *\n * @param pair - Currency pair\n * @param orderId - Order ID\n * @returns Order status summary\n */\n async getOrderStatus(pair: CurrencyPair, orderId: OrderId): Promise<OrderStatusSummary> {\n const response = await this.http.get<OrderStatusSummary>(`/v1/orders/${pair}/orderid/${orderId}`);\n return response.data;\n }\n\n /**\n * Get order status by customer order ID\n * GET /v1/orders/:currencyPair/customerorderid/:customerOrderId\n *\n * @param pair - Currency pair\n * @param customerOrderId - Customer order ID\n * @returns Order status summary\n */\n async getOrderStatusByCustomerId(pair: CurrencyPair, customerOrderId: CustomerOrderId): Promise<OrderStatusSummary> {\n const response = await this.http.get<OrderStatusSummary>(\n `/v1/orders/${pair}/customerorderid/${customerOrderId}`\n );\n return response.data;\n }\n\n /**\n * Get all open orders\n * GET /v1/orders/open\n *\n * @returns Array of open orders\n */\n async getAllOpenOrders(): Promise<OpenOrder[]> {\n const response = await this.http.get<OpenOrder[]>('/v1/orders/open');\n return response.data;\n }\n\n // ============================================================================\n // Order History\n // ============================================================================\n\n /**\n * Get order history\n * GET /v1/orders/history\n *\n * @param params - Query parameters (skip, limit, statuses, currencyPair, startTime, endTime)\n * @returns Array of historical order summaries\n */\n async getOrderHistory(params?: OrderHistoryParams): Promise<HistoricalOrderSummary[]> {\n const response = await this.http.get<HistoricalOrderSummary[]>('/v1/orders/history', {\n params: params ? {\n ...params,\n statuses: params.statuses?.join(','),\n currencyPair: Array.isArray(params.currencyPair)\n ? params.currencyPair.join(',')\n : params.currencyPair,\n } : undefined,\n });\n return response.data;\n }\n\n /**\n * Get order history summary by order ID\n * GET /v1/orders/history/summary/orderid/:orderId\n *\n * @param orderId - Order ID\n * @returns Order history summary\n */\n async getOrderHistorySummary(orderId: OrderId): Promise<HistoricalOrderSummary> {\n const response = await this.http.get<HistoricalOrderSummary>(`/v1/orders/history/summary/orderid/${orderId}`);\n return response.data;\n }\n\n /**\n * Get order history summary by customer order ID\n * GET /v1/orders/history/summary/customerorderid/:customerOrderId\n *\n * @param customerOrderId - Customer order ID\n * @returns Order history summary\n */\n async getOrderHistorySummaryByCustomerId(customerOrderId: CustomerOrderId): Promise<HistoricalOrderSummary> {\n const response = await this.http.get<HistoricalOrderSummary>(\n `/v1/orders/history/summary/customerorderid/${customerOrderId}`\n );\n return response.data;\n }\n\n /**\n * Get order history detail by order ID (includes all trades)\n * GET /v1/orders/history/detail/orderid/:orderId\n *\n * @param orderId - Order ID\n * @returns Order history detail with trades\n */\n async getOrderHistoryDetail(orderId: OrderId): Promise<HistoricalOrderDetail> {\n const response = await this.http.get<HistoricalOrderDetail>(`/v1/orders/history/detail/orderid/${orderId}`);\n return response.data;\n }\n\n /**\n * Get order history detail by customer order ID\n * GET /v1/orders/history/detail/customerorderid/:customerOrderId\n *\n * @param customerOrderId - Customer order ID\n * @returns Order history detail with trades\n */\n async getOrderHistoryDetailByCustomerId(customerOrderId: CustomerOrderId): Promise<HistoricalOrderDetail> {\n const response = await this.http.get<HistoricalOrderDetail>(\n `/v1/orders/history/detail/customerorderid/${customerOrderId}`\n );\n return response.data;\n }\n\n // ============================================================================\n // Order Modification\n // ============================================================================\n\n /**\n * Modify an existing order (v1)\n * PUT /v1/orders/modify\n *\n * @param request - Modify order request\n * @returns Updated order response\n */\n async modifyOrder(request: ModifyOrderRequest): Promise<OrderResponse> {\n const response = await this.http.put<OrderResponse>('/v1/orders/modify', request);\n return response.data;\n }\n\n /**\n * Modify an existing order (v2)\n * PUT /v2/orders/modify\n *\n * @param request - Modify order request (v2)\n * @returns Updated order response\n */\n async modifyOrderV2(request: ModifyOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.put<OrderResponse>('/v2/orders/modify', request);\n return response.data;\n }\n\n // ============================================================================\n // Order Cancellation\n // ============================================================================\n\n /**\n * Cancel a single order (v1)\n * DELETE /v1/orders/order\n *\n * @param request - Cancel order request\n * @returns Cancellation confirmation\n */\n async cancelOrder(request: CancelOrderRequest): Promise<OrderResponse> {\n const response = await this.http.delete<OrderResponse>('/v1/orders/order', {\n data: request,\n });\n return response.data;\n }\n\n /**\n * Cancel a single order (v2)\n * DELETE /v2/orders/order\n *\n * @param request - Cancel order request (v2)\n * @returns Cancellation confirmation\n */\n async cancelOrderV2(request: CancelOrderRequestV2): Promise<OrderResponse> {\n const response = await this.http.delete<OrderResponse>('/v2/orders/order', {\n data: request,\n });\n return response.data;\n }\n\n /**\n * Cancel all conditional orders\n * DELETE /v1/orders/conditionals\n *\n * @returns Cancellation confirmation\n */\n async cancelAllConditionalOrders(): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>('/v1/orders/conditionals');\n return response.data;\n }\n\n /**\n * Cancel all conditional orders for a currency pair\n * DELETE /v1/orders/conditionals/:currencypair\n *\n * @param pair - Currency pair\n * @returns Cancellation confirmation\n */\n async cancelConditionalOrdersForPair(pair: CurrencyPair): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>(`/v1/orders/conditionals/${pair}`);\n return response.data;\n }\n\n /**\n * Cancel a specific conditional order\n * DELETE /v1/orders/conditionals/conditional\n *\n * @param request - Contains orderId and currencyPair\n * @returns Cancellation confirmation\n */\n async cancelConditionalOrder(request: { orderId: string; pair: CurrencyPair }): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>('/v1/orders/conditionals/conditional', {\n data: {\n orderId: request.orderId,\n currencyPair: request.pair,\n },\n });\n return response.data;\n }\n\n /**\n * Cancel all orders for all currency pairs\n * DELETE /v1/orders\n *\n * @returns Cancellation confirmation\n */\n async cancelAllOrders(): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>('/v1/orders');\n return response.data;\n }\n\n /**\n * Cancel all orders for a specific currency pair\n * DELETE /v1/orders/:currencyPair\n *\n * @param pair - Currency pair\n * @returns Cancellation confirmation\n */\n async cancelAllOrdersForPair(pair: CurrencyPair): Promise<{ message: string }> {\n const response = await this.http.delete<{ message: string }>(`/v1/orders/${pair}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n DepositAddress,\n CryptoDepositHistoryParams,\n CryptoDepositHistoryItem,\n WhitelistedAddress,\n WithdrawalConfigInfo,\n CryptoWithdrawalRequest,\n CryptoWithdrawalResponse,\n CryptoWithdrawalStatus,\n CryptoWithdrawalHistoryParams,\n CryptoWithdrawalHistoryItem,\n ServiceProvider,\n Bank,\n BankAccount,\n LinkBankAccountRequest,\n FiatDepositReference,\n AutoBuyDepositReference,\n FiatWithdrawalRequest,\n FiatWithdrawalResponse,\n CurrencyCode,\n} from '../types';\n\n/**\n * Wallets API methods (requires authentication)\n *\n * Provides methods for managing crypto and fiat wallets,\n * including deposits, withdrawals, and account management.\n */\nexport class WalletsAPI {\n constructor(private http: HttpClient) {}\n\n // ===== Crypto Wallet Methods =====\n\n /**\n * Get deposit address for a currency\n *\n * @param currencyCode - Currency code\n * @param networkType - Optional network type\n * @returns Promise resolving to deposit address\n *\n * @example\n * ```typescript\n * const address = await client.wallets.getCryptoDepositAddress('BTC');\n * console.log('Deposit to:', address.address);\n * ```\n */\n async getCryptoDepositAddress(\n currencyCode: CurrencyCode,\n networkType?: string\n ): Promise<DepositAddress> {\n const response = await this.http.get<DepositAddress>(\n `/v1/wallet/crypto/${currencyCode}/deposit/address`,\n { params: networkType ? { networkType } : undefined }\n );\n return response.data;\n }\n\n /**\n * Get crypto deposit history\n *\n * @param params - Optional query parameters for filtering\n * @returns Promise resolving to array of deposit history items\n *\n * @example\n * ```typescript\n * const deposits = await client.wallets.getCryptoDepositHistory({\n * skip: 0,\n * limit: 100,\n * currency: 'BTC',\n * startTime: '2025-01-01T00:00:00Z',\n * endTime: '2025-01-31T23:59:59Z'\n * });\n * ```\n */\n async getCryptoDepositHistory(\n params?: CryptoDepositHistoryParams\n ): Promise<CryptoDepositHistoryItem[]> {\n const response = await this.http.get<CryptoDepositHistoryItem[]>(\n '/v1/wallet/crypto/deposit/history',\n { params }\n );\n return response.data;\n }\n\n /**\n * Get whitelisted withdrawal address book\n *\n * @returns Promise resolving to array of whitelisted addresses\n *\n * @example\n * ```typescript\n * const addresses = await client.wallets.getWhitelistedAddresses();\n * ```\n */\n async getWhitelistedAddresses(): Promise<WhitelistedAddress[]> {\n const response = await this.http.get<WhitelistedAddress[]>(\n '/v1/wallet/crypto/address-book'\n );\n return response.data;\n }\n\n /**\n * Get whitelisted withdrawal addresses for a specific currency\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to array of whitelisted addresses for that currency\n *\n * @example\n * ```typescript\n * const btcAddresses = await client.wallets.getWhitelistedAddressesByCurrency('BTC');\n * ```\n */\n async getWhitelistedAddressesByCurrency(\n currencyCode: CurrencyCode\n ): Promise<WhitelistedAddress[]> {\n const response = await this.http.get<WhitelistedAddress[]>(\n `/v1/wallet/crypto/address-book/${currencyCode}`\n );\n return response.data;\n }\n\n /**\n * Get withdrawal configuration info for a currency\n *\n * Returns withdrawal limits and fees.\n *\n * @param currencyCode - Currency code\n * @param networkType - Optional network type\n * @returns Promise resolving to withdrawal config info\n *\n * @example\n * ```typescript\n * const config = await client.wallets.getCryptoWithdrawalInfo('ETH');\n * console.log('Fee:', config.withdrawalFee);\n * ```\n */\n async getCryptoWithdrawalInfo(currencyCode: CurrencyCode, networkType?: string): Promise<WithdrawalConfigInfo> {\n const response = await this.http.get<WithdrawalConfigInfo>(\n `/v1/wallet/crypto/${currencyCode}/withdraw`,\n { params: networkType ? { networkType } : undefined }\n );\n return response.data;\n }\n\n /**\n * Withdraw cryptocurrency\n *\n * @param request - Withdrawal request parameters\n * @returns Promise resolving to withdrawal response\n *\n * @example\n * ```typescript\n * const withdrawal = await client.wallets.withdrawCrypto({\n * currency: 'BTC',\n * amount: '0.1',\n * address: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n * });\n * ```\n */\n async withdrawCrypto(request: CryptoWithdrawalRequest): Promise<CryptoWithdrawalResponse> {\n const response = await this.http.post<CryptoWithdrawalResponse>(\n `/v1/wallet/crypto/${request.currency}/withdraw`,\n request\n );\n return response.data;\n }\n\n /**\n * Get withdrawal status\n *\n * @param currencyCode - Currency code\n * @param withdrawId - Withdrawal ID\n * @returns Promise resolving to withdrawal status\n *\n * @example\n * ```typescript\n * const status = await client.wallets.getCryptoWithdrawalStatus('BTC', 'withdraw-id-123');\n * console.log('Status:', status.status);\n * ```\n */\n async getCryptoWithdrawalStatus(\n currencyCode: CurrencyCode,\n withdrawId: string\n ): Promise<CryptoWithdrawalStatus> {\n const response = await this.http.get<CryptoWithdrawalStatus>(\n `/v1/wallet/crypto/${currencyCode}/withdraw/${withdrawId}`\n );\n return response.data;\n }\n\n /**\n * Get supported service providers\n *\n * Returns list of supported crypto service providers.\n *\n * @returns Promise resolving to array of service providers\n *\n * @example\n * ```typescript\n * const providers = await client.wallets.getServiceProviders();\n * ```\n */\n async getServiceProviders(): Promise<ServiceProvider[]> {\n const response = await this.http.get<ServiceProvider[]>(\n '/v1/wallet/crypto/service-providers'\n );\n return response.data;\n }\n\n /**\n * Get crypto withdrawal history\n *\n * @param params - Optional query parameters\n * @returns Promise resolving to array of withdrawal history items\n *\n * @example\n * ```typescript\n * const history = await client.wallets.getCryptoWithdrawalHistory({ skip: 0, limit: 100 });\n * ```\n */\n async getCryptoWithdrawalHistory(\n params?: CryptoWithdrawalHistoryParams\n ): Promise<CryptoWithdrawalHistoryItem[]> {\n const response = await this.http.get<CryptoWithdrawalHistoryItem[]>(\n '/v1/wallet/crypto/withdraw/history',\n { params }\n );\n return response.data;\n }\n\n // ===== Fiat Wallet Methods =====\n\n /**\n * Add/link a bank account\n *\n * @param currencyCode - Currency code (e.g., 'ZAR')\n * @param request - Bank account details\n * @returns Promise resolving to created bank account\n *\n * @example\n * ```typescript\n * const account = await client.wallets.addBankAccount('ZAR', {\n * bank: 'FNB',\n * accountHolder: 'John Doe',\n * accountNumber: '62792461544',\n * branchCode: '250655',\n * accountType: 'Current/Cheque'\n * });\n * ```\n */\n async addBankAccount(\n currencyCode: CurrencyCode,\n request: LinkBankAccountRequest\n ): Promise<BankAccount> {\n const response = await this.http.post<BankAccount>(\n `/v1/wallet/fiat/${currencyCode}/accounts`,\n request\n );\n return response.data;\n }\n\n /**\n * Get bank account details\n *\n * @param currencyCode - Currency code\n * @param accountId - Bank account ID\n * @returns Promise resolving to bank account details\n *\n * @example\n * ```typescript\n * const account = await client.wallets.getBankAccount('ZAR', 'account-id-123');\n * ```\n */\n async getBankAccount(currencyCode: CurrencyCode, accountId: string): Promise<BankAccount> {\n const response = await this.http.get<BankAccount>(\n `/v1/wallet/fiat/${currencyCode}/accounts/${accountId}`\n );\n return response.data;\n }\n\n /**\n * Get all linked bank accounts\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to array of bank accounts\n *\n * @example\n * ```typescript\n * const accounts = await client.wallets.getBankAccounts('ZAR');\n * ```\n */\n async getBankAccounts(currencyCode: CurrencyCode): Promise<BankAccount[]> {\n const response = await this.http.get<BankAccount[]>(\n `/v1/wallet/fiat/${currencyCode}/accounts`\n );\n return response.data;\n }\n\n /**\n * Delete a bank account\n *\n * @param currencyCode - Currency code\n * @param accountId - Bank account ID\n * @returns Promise that resolves when account is deleted\n *\n * @example\n * ```typescript\n * await client.wallets.deleteBankAccount('ZAR', 'account-id-123');\n * ```\n */\n async deleteBankAccount(currencyCode: CurrencyCode, accountId: string): Promise<void> {\n await this.http.delete(`/v1/wallet/fiat/${currencyCode}/accounts/${accountId}`);\n }\n\n /**\n * Get list of supported banks for a currency\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to array of banks\n *\n * @example\n * ```typescript\n * const banks = await client.wallets.getBanks('ZAR');\n * banks.forEach(bank => {\n * console.log(`${bank.displayName} (${bank.code})`);\n * });\n * ```\n */\n async getBanks(currencyCode: CurrencyCode): Promise<Bank[]> {\n const response = await this.http.get<Bank[]>(`/v1/wallet/fiat/${currencyCode}/banks`);\n return response.data;\n }\n\n /**\n * Get fiat deposit reference\n *\n * Returns your unique deposit reference for depositing fiat currency.\n *\n * @param currencyCode - Currency code\n * @returns Promise resolving to deposit reference\n *\n * @example\n * ```typescript\n * const ref = await client.wallets.getFiatDepositReference('ZAR');\n * console.log('Use reference:', ref.reference);\n * ```\n */\n async getFiatDepositReference(currencyCode: CurrencyCode): Promise<FiatDepositReference> {\n const response = await this.http.get<FiatDepositReference>(\n `/v1/wallet/fiat/${currencyCode}/deposit/reference`\n );\n return response.data;\n }\n\n /**\n * Get auto-buy deposit reference\n *\n * Returns a deposit reference that will automatically convert fiat to crypto.\n *\n * @param currencyCode - Fiat currency code (e.g., 'ZAR')\n * @param buyCurrencySymbol - Crypto currency to auto-buy (e.g., 'BTC')\n * @returns Promise resolving to auto-buy deposit reference\n *\n * @example\n * ```typescript\n * const ref = await client.wallets.getAutoBuyDepositReference('ZAR', 'BTC');\n * console.log('Deposit ZAR with this reference to auto-buy BTC:', ref.reference);\n * ```\n */\n async getAutoBuyDepositReference(\n currencyCode: CurrencyCode,\n buyCurrencySymbol: CurrencyCode\n ): Promise<AutoBuyDepositReference> {\n const response = await this.http.get<AutoBuyDepositReference>(\n `/v1/wallet/fiat/${currencyCode}/deposit/reference/${buyCurrencySymbol}`\n );\n return response.data;\n }\n\n /**\n * Get supported auto-buy currencies\n *\n * Returns which crypto currencies can be auto-bought with the specified fiat currency.\n *\n * @param currencyCode - Fiat currency code\n * @returns Promise resolving to array of supported currency codes\n *\n * @example\n * ```typescript\n * const currencies = await client.wallets.getAutoBuyCurrencies('ZAR');\n * currencies.forEach(code => {\n * console.log(`Supports auto-buy for: ${code}`);\n * });\n * ```\n */\n async getAutoBuyCurrencies(currencyCode: CurrencyCode): Promise<CurrencyCode[]> {\n const response = await this.http.get<CurrencyCode[]>(\n `/v1/wallet/fiat/${currencyCode}/auto-buy`\n );\n return response.data;\n }\n\n /**\n * Withdraw fiat currency\n *\n * @param request - Withdrawal request parameters\n * @returns Promise resolving to withdrawal response\n *\n * @example\n * ```typescript\n * const withdrawal = await client.wallets.withdrawFiat({\n * currency: 'ZAR',\n * amount: '1000',\n * linkedBankAccountId: 'account-id-123',\n * fast: true\n * });\n * ```\n */\n async withdrawFiat(request: FiatWithdrawalRequest): Promise<FiatWithdrawalResponse> {\n const response = await this.http.post<FiatWithdrawalResponse>(\n `/v1/wallet/fiat/${request.currency}/withdraw`,\n request\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n FuturesPosition,\n ClosedPositionSummary,\n ClosedPosition,\n FundingPayment,\n LeverageInfo,\n UpdateLeverageRequest,\n CurrencyPair,\n PositionHistoryParams,\n FundingHistoryParams,\n} from '../types';\n\n/**\n * Futures API methods (requires authentication)\n */\nexport class FuturesAPI {\n constructor(private http: HttpClient) {}\n\n async getOpenPositions(): Promise<FuturesPosition[]> {\n const response = await this.http.get<FuturesPosition[]>('/v1/positions/open');\n return response.data;\n }\n\n async getClosedPositionsSummary(): Promise<ClosedPositionSummary[]> {\n const response = await this.http.get<ClosedPositionSummary[]>('/v1/positions/closed/summary');\n return response.data;\n }\n\n async getClosedPositions(pair: CurrencyPair): Promise<ClosedPosition[]> {\n const response = await this.http.get<ClosedPosition[]>('/v1/positions/closed', {\n params: { currencyPair: pair },\n });\n return response.data;\n }\n\n async getPositionHistory(params: PositionHistoryParams): Promise<FuturesPosition[]> {\n const response = await this.http.get<FuturesPosition[]>('/v1/positions/history', { params });\n return response.data;\n }\n\n async getFundingHistory(params: FundingHistoryParams): Promise<FundingPayment[]> {\n const response = await this.http.get<FundingPayment[]>('/v1/positions/funding/history', { params });\n return response.data;\n }\n\n async getLeverageInfo(pair: CurrencyPair): Promise<LeverageInfo> {\n const response = await this.http.get<LeverageInfo>(`/v1/margin/leverage/${pair}`);\n return response.data;\n }\n\n async updateLeverage(pair: CurrencyPair, request: UpdateLeverageRequest): Promise<LeverageInfo> {\n const response = await this.http.put<LeverageInfo>(`/v1/margin/leverage/${pair}`, request);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n MarginInfoV1,\n MarginInfoV2,\n AccountMarginStatus,\n EnableMarginRequest,\n LeverageInfo,\n UpdateLeverageRequest,\n CurrencyPair,\n} from '../types';\n\n/**\n * Margin API methods (requires authentication)\n *\n * Provides methods for managing margin trading, leverage, and account status.\n */\nexport class MarginAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get margin information (V1)\n *\n * Returns detailed margin account information including collateral and borrowing.\n *\n * @returns Promise resolving to margin information\n *\n * @example\n * ```typescript\n * const marginInfo = await client.margin.getMarginInfo();\n * console.log('Available margin:', marginInfo.availableInReference);\n * ```\n */\n async getMarginInfo(): Promise<MarginInfoV1> {\n const response = await this.http.get<MarginInfoV1>('/v1/margin/status');\n return response.data;\n }\n\n /**\n * Get margin information (V2)\n *\n * Returns detailed margin account information with additional fields.\n *\n * @returns Promise resolving to margin information\n *\n * @example\n * ```typescript\n * const marginInfo = await client.margin.getMarginInfoV2();\n * console.log('Trade reserved:', marginInfo.tradeReservedInReference);\n * ```\n */\n async getMarginInfoV2(): Promise<MarginInfoV2> {\n const response = await this.http.get<MarginInfoV2>('/v2/margin/status');\n return response.data;\n }\n\n /**\n * Get account margin status\n *\n * Returns whether margin and futures trading are enabled for the account.\n *\n * @returns Promise resolving to account margin status\n *\n * @example\n * ```typescript\n * const status = await client.margin.getAccountStatus();\n * console.log('Margin enabled:', status.marginEnabled);\n * console.log('In liquidation:', status.inLiquidation);\n * ```\n */\n async getAccountStatus(): Promise<AccountMarginStatus> {\n const response = await this.http.get<AccountMarginStatus>('/v1/margin/account/status');\n return response.data;\n }\n\n /**\n * Enable or disable margin/futures trading\n *\n * @param request - Enable/disable request\n * @returns Promise resolving to updated account status\n *\n * @example\n * ```typescript\n * // Enable margin trading\n * await client.margin.updateAccountStatus({\n * accountStatusFieldName: 'MARGIN_ENABLED',\n * enabled: true\n * });\n *\n * // Enable futures trading\n * await client.margin.updateAccountStatus({\n * accountStatusFieldName: 'FUTURES_ENABLED',\n * enabled: true\n * });\n * ```\n */\n async updateAccountStatus(request: EnableMarginRequest): Promise<AccountMarginStatus> {\n const response = await this.http.put<AccountMarginStatus>('/v1/margin/account/status', request);\n return response.data;\n }\n\n /**\n * Get leverage information for a currency pair\n *\n * @param currencyPair - Currency pair (e.g., 'BTCUSDTPERP')\n * @returns Promise resolving to leverage information\n *\n * @example\n * ```typescript\n * const leverage = await client.margin.getLeverageInfo('BTCUSDTPERP');\n * console.log('Current leverage:', leverage.leverageMultiple);\n * console.log('Risk limit:', leverage.riskLimit);\n * ```\n */\n async getLeverageInfo(currencyPair: CurrencyPair): Promise<LeverageInfo> {\n const response = await this.http.get<LeverageInfo>(`/v1/margin/leverage/${currencyPair}`);\n return response.data;\n }\n\n /**\n * Update leverage for a currency pair\n *\n * @param currencyPair - Currency pair (e.g., 'BTCUSDTPERP')\n * @param request - Update leverage request\n * @returns Promise resolving to updated leverage information\n *\n * @example\n * ```typescript\n * const updated = await client.margin.updateLeverage('BTCUSDTPERP', {\n * leverageMultiple: 10\n * });\n * console.log('New leverage:', updated.leverageMultiple);\n * ```\n */\n async updateLeverage(currencyPair: CurrencyPair, request: UpdateLeverageRequest): Promise<LeverageInfo> {\n const response = await this.http.put<LeverageInfo>(`/v1/margin/leverage/${currencyPair}`, request);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n LoanRate,\n OpenLoan,\n CreateLoanRequest,\n LoanCreditHistoryItem,\n IncreaseLoanRequest,\n ChangeLoanRateRequest,\n RequestUnlockRequest,\n BorrowHistoryItem,\n CurrencyCode,\n} from '../types';\n\n/**\n * Loans API methods (requires authentication)\n *\n * VALR's lending platform allows users to lend crypto and earn interest.\n * Interest rates are determined through an hourly auction system.\n */\nexport class LoansAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Get current loan rates for all currencies\n *\n * Returns interest rate information including:\n * - Previous funding rate from the most recent interest auction\n * - Estimated rate for the next funding period\n * - Estimated borrow rate for the next funding round\n *\n * @returns Promise resolving to array of loan rates\n *\n * @example\n * ```typescript\n * const rates = await client.loans.getRates();\n * rates.forEach(rate => {\n * console.log(`${rate.currency}: ${rate.estimatedNextRate}`);\n * });\n * ```\n */\n async getRates(): Promise<LoanRate[]> {\n const response = await this.http.get<LoanRate[]>('/v1/loans/rates');\n return response.data;\n }\n\n /**\n * Get historical loan rates\n *\n * @returns Promise resolving to array of historical loan rates\n *\n * @example\n * ```typescript\n * const history = await client.loans.getRatesHistory();\n * ```\n */\n async getRatesHistory(): Promise<LoanRate[]> {\n const response = await this.http.get<LoanRate[]>('/v1/loans/rates/history');\n return response.data;\n }\n\n /**\n * Get all open loans\n *\n * @returns Promise resolving to array of open loans\n *\n * @example\n * ```typescript\n * const openLoans = await client.loans.getOpenLoans();\n * openLoans.forEach(loan => {\n * console.log(`${loan.currency}: ${loan.totalAmount} at ${loan.hourlyRate}/hr`);\n * });\n * ```\n */\n async getOpenLoans(): Promise<OpenLoan[]> {\n const response = await this.http.get<OpenLoan[]>('/v1/loans/open');\n return response.data;\n }\n\n /**\n * Create a new loan\n *\n * Opens a new lending position at the specified hourly rate.\n *\n * @param request - Loan creation parameters\n * @returns Promise that resolves when loan is created\n *\n * @example\n * ```typescript\n * await client.loans.createLoan({\n * currencySymbol: 'USDC',\n * hourlyRate: '0.00001255',\n * amount: '100'\n * });\n * ```\n */\n async createLoan(request: CreateLoanRequest): Promise<void> {\n await this.http.post('/v1/loans', request);\n }\n\n /**\n * Get loan credit history\n *\n * Returns history of interest entries as calculated during margin interest auction runs.\n *\n * @returns Promise resolving to array of credit history items\n *\n * @example\n * ```typescript\n * const history = await client.loans.getCreditHistory();\n * history.forEach(item => {\n * console.log(`${item.currency}: earned ${item.interestAmount}`);\n * });\n * ```\n */\n async getCreditHistory(): Promise<LoanCreditHistoryItem[]> {\n const response = await this.http.get<LoanCreditHistoryItem[]>('/v1/loans/credit-history');\n return response.data;\n }\n\n /**\n * Increase loan amount\n *\n * Increases the total amount of an existing loan.\n *\n * @param request - Increase loan parameters\n * @returns Promise that resolves when loan is increased\n *\n * @example\n * ```typescript\n * await client.loans.increaseLoan({\n * currencySymbol: 'USDC',\n * increaseLoanAmountBy: '20',\n * loanId: '1289055810346737664'\n * });\n * ```\n */\n async increaseLoan(request: IncreaseLoanRequest): Promise<void> {\n await this.http.put('/v1/loans/increase', request);\n }\n\n /**\n * Change loan rate\n *\n * Updates the hourly interest rate for an existing loan.\n *\n * @param request - Change rate parameters\n * @returns Promise that resolves when rate is changed\n *\n * @example\n * ```typescript\n * await client.loans.changeRate({\n * currencySymbol: 'USDC',\n * hourlyRate: '0.0000126',\n * loanId: '1289055810346737664'\n * });\n * ```\n */\n async changeRate(request: ChangeLoanRateRequest): Promise<void> {\n await this.http.put('/v1/loans/rate', request);\n }\n\n /**\n * Get loan update history\n *\n * Returns history of loan modifications (rate changes, amount increases, etc).\n *\n * @returns Promise resolving to array of loan updates\n *\n * @example\n * ```typescript\n * const updates = await client.loans.getUpdateHistory();\n * ```\n */\n async getUpdateHistory(): Promise<any[]> {\n const response = await this.http.get<any[]>('/v1/loans/update-history');\n return response.data;\n }\n\n /**\n * Request to unlock loan funds\n *\n * Requests to unlock a portion of a loan to make it available for withdrawal.\n *\n * @param request - Unlock request parameters\n * @returns Promise that resolves when unlock is requested\n *\n * @example\n * ```typescript\n * await client.loans.requestUnlock({\n * currencySymbol: 'USDC',\n * unlockAmount: '50',\n * loanId: '1289055810346737664'\n * });\n * ```\n */\n async requestUnlock(request: RequestUnlockRequest): Promise<void> {\n await this.http.put('/v1/loans/unlock', request);\n }\n\n /**\n * Cancel unlock request\n *\n * Cancels a pending unlock request for loan funds.\n *\n * @returns Promise that resolves when unlock request is cancelled\n *\n * @example\n * ```typescript\n * await client.loans.cancelUnlock();\n * ```\n */\n async cancelUnlock(): Promise<void> {\n await this.http.delete('/v1/loans/unlock');\n }\n\n /**\n * Get borrow history for a specific currency\n *\n * @param currencySymbol - Currency symbol to get borrow history for\n * @returns Promise resolving to array of borrow history items\n *\n * @example\n * ```typescript\n * const history = await client.loans.getBorrowHistory('USDC');\n * ```\n */\n async getBorrowHistory(currencySymbol: CurrencyCode): Promise<BorrowHistoryItem[]> {\n const response = await this.http.get<BorrowHistoryItem[]>(\n `/v1/borrows/${currencySymbol}/history`\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n StakeRequest,\n UnstakeRequest,\n EarnBalance,\n EarnRate,\n EarnReward,\n EarnHistoryItem,\n EarnBalancesParams,\n EarnRatesParams,\n EarnRewardsParams,\n EarnHistoryParams,\n} from '../types';\n\n/**\n * Staking API methods - Staking and Lending (requires authentication)\n *\n * VALR offers two types of earning opportunities:\n * - STAKE: Lock crypto to earn rewards\n * - LEND: Lend crypto to earn interest\n */\nexport class StakeAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Stake/Lock cryptocurrency to earn rewards\n *\n * @param request - Stake request with currency, amount, and earn type\n * @returns Promise that resolves when stake is successful\n *\n * @example\n * ```typescript\n * await client.stake.stake({\n * currencySymbol: 'ETH',\n * amount: '1.5',\n * earnType: 'STAKE'\n * });\n * ```\n */\n async stake(request: StakeRequest): Promise<void> {\n await this.http.post('/v1/staking/stake', request);\n }\n\n /**\n * Unstake/Unlock cryptocurrency\n *\n * @param request - Unstake request with currency, amount, and earn type\n * @returns Promise that resolves when unstake is successful\n *\n * @example\n * ```typescript\n * await client.stake.unstake({\n * currencySymbol: 'ETH',\n * amount: '1.5',\n * earnType: 'STAKE'\n * });\n * ```\n */\n async unstake(request: UnstakeRequest): Promise<void> {\n await this.http.post('/v1/staking/un-stake', request);\n }\n\n /**\n * Get earn balances for a specific earn type\n *\n * @param params - Optional parameters (earnType filter)\n * @returns Promise resolving to array of earn balances\n *\n * @example\n * ```typescript\n * // Get staking balances\n * const stakingBalances = await client.stake.getBalances({ earnType: 'STAKE' });\n *\n * // Get lending balances\n * const lendingBalances = await client.stake.getBalances({ earnType: 'LEND' });\n * ```\n */\n async getBalances(params?: EarnBalancesParams): Promise<EarnBalance[]> {\n const response = await this.http.get<EarnBalance[]>('/v1/staking/balances', { params });\n return response.data;\n }\n\n /**\n * Get all earn balances\n *\n * @param params - Optional parameters (earnType filter)\n * @returns Promise resolving to array of all earn balances\n *\n * @example\n * ```typescript\n * const allBalances = await client.stake.getAllBalances({ earnType: 'LEND' });\n * ```\n */\n async getAllBalances(params?: EarnBalancesParams): Promise<EarnBalance[]> {\n const response = await this.http.get<EarnBalance[]>('/v1/staking/balances/all', { params });\n return response.data;\n }\n\n /**\n * Get current earning rates for available currencies\n *\n * @param params - Optional parameters (earnType filter)\n * @returns Promise resolving to array of earn rates\n *\n * @example\n * ```typescript\n * // Get staking rates\n * const stakingRates = await client.stake.getRates({ earnType: 'STAKE' });\n *\n * // Get lending rates\n * const lendingRates = await client.stake.getRates({ earnType: 'LEND' });\n * ```\n */\n async getRates(params?: EarnRatesParams): Promise<EarnRate[]> {\n const response = await this.http.get<EarnRate[]>('/v1/staking/rates', { params });\n return response.data;\n }\n\n /**\n * Get earn rewards history for a specific currency\n *\n * @param params - Query parameters including currency symbol\n * @returns Promise resolving to array of earn rewards\n *\n * @example\n * ```typescript\n * const rewards = await client.stake.getRewards({\n * currencySymbol: 'ETH',\n * earnType: 'LEND',\n * skip: 0,\n * limit: 100\n * });\n * ```\n */\n async getRewards(params: EarnRewardsParams): Promise<EarnReward[]> {\n const response = await this.http.get<EarnReward[]>('/v1/staking/rewards', { params });\n return response.data;\n }\n\n /**\n * Get earn transaction history (stakes and unstakes)\n *\n * @param params - Query parameters including currency symbol\n * @returns Promise resolving to array of earn history items\n *\n * @example\n * ```typescript\n * const history = await client.stake.getHistory({\n * currencySymbol: 'ETH',\n * earnType: 'STAKE',\n * skip: 0,\n * limit: 100\n * });\n * ```\n */\n async getHistory(params: EarnHistoryParams): Promise<EarnHistoryItem[]> {\n const response = await this.http.get<EarnHistoryItem[]>('/v1/staking/history', { params });\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n CreatePaymentRequest,\n PaymentResponse,\n PaymentStatus,\n PaymentDetails,\n PaymentHistoryItem,\n PaymentLimits,\n PayIdResponse,\n CurrencyCode,\n} from '../types';\n\n/**\n * Pay API methods (requires authentication)\n * P2P payments within VALR\n */\nexport class PayAPI {\n constructor(private http: HttpClient) {}\n\n /**\n * Create a new P2P payment\n * POST /v1/pay\n *\n * @param request - Payment request (must specify one of: recipientEmail, recipientCellNumber, or recipientPayId)\n * @returns Payment response with identifier and transaction ID\n */\n async createPayment(request: CreatePaymentRequest): Promise<PaymentResponse> {\n const response = await this.http.post<PaymentResponse>('/v1/pay', request);\n return response.data;\n }\n\n /**\n * Reverse a payment completely\n * PUT /v1/pay/transactionid/:transactionId/reverse\n *\n * @param transactionId - Transaction ID to reverse\n * @returns Reversal confirmation\n */\n async reversePayment(transactionId: string): Promise<void> {\n await this.http.put(`/v1/pay/transactionid/${transactionId}/reverse`);\n }\n\n /**\n * Partially reverse a payment\n * PUT /v1/pay/transactionid/:transactionId/partial-reverse\n *\n * @param transactionId - Transaction ID to partially reverse\n * @param amountToReverse - Amount to reverse\n * @returns Partial reversal confirmation\n */\n async partiallyReversePayment(\n transactionId: string,\n amountToReverse: string\n ): Promise<void> {\n await this.http.put(`/v1/pay/transactionid/${transactionId}/partial-reverse`, {\n amountToReverse,\n });\n }\n\n /**\n * Get payment limits for a currency\n * GET /v1/pay/limits\n *\n * @param currency - Currency code (e.g., \"BTC\", \"ZAR\")\n * @returns Payment limits for the specified currency\n */\n async getPaymentLimits(currency: CurrencyCode): Promise<PaymentLimits> {\n const response = await this.http.get<PaymentLimits>('/v1/pay/limits', {\n params: { currency },\n });\n return response.data;\n }\n\n /**\n * Get your Pay ID (unique identifier for receiving payments)\n * GET /v1/pay/payid\n *\n * @returns Your Pay ID\n */\n async getPayId(): Promise<PayIdResponse> {\n const response = await this.http.get<PayIdResponse>('/v1/pay/payid');\n return response.data;\n }\n\n /**\n * Get payment history (sent and received payments)\n * GET /v1/pay/history\n *\n * @returns Array of payment history items\n */\n async getPaymentHistory(): Promise<PaymentHistoryItem[]> {\n const response = await this.http.get<PaymentHistoryItem[]>('/v1/pay/history');\n return response.data;\n }\n\n /**\n * Get payment details by identifier\n * GET /v1/pay/identifier/:identifier\n *\n * @param identifier - Payment identifier\n * @returns Payment details\n */\n async getPaymentByIdentifier(identifier: string): Promise<PaymentDetails> {\n const response = await this.http.get<PaymentDetails>(`/v1/pay/identifier/${identifier}`);\n return response.data;\n }\n\n /**\n * Get payment status by transaction ID\n * GET /v1/pay/transactionid/:transactionId\n *\n * @param transactionId - Transaction ID\n * @returns Payment status\n */\n async getPaymentStatus(transactionId: string): Promise<PaymentStatus> {\n const response = await this.http.get<PaymentStatus>(`/v1/pay/transactionid/${transactionId}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { Bundle, BuyBundleRequest, BundleOrder } from '../types';\n\n/**\n * Bundles API methods (requires authentication)\n */\nexport class BundlesAPI {\n constructor(private http: HttpClient) {}\n\n async getBundles(): Promise<Bundle[]> {\n const response = await this.http.get<Bundle[]>('/v1/bundles');\n return response.data;\n }\n\n async buyBundle(request: BuyBundleRequest): Promise<BundleOrder> {\n const response = await this.http.post<BundleOrder>('/v1/bundles/buy', request);\n return response.data;\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ValrStatus } from '../types';\n\n/**\n * Health API methods\n */\nexport class HealthAPI {\n constructor(private http: HttpClient) {}\n\n async getHealth(): Promise<ValrStatus> {\n const response = await this.http.get<ValrStatus>('/v1/health');\n return response.data;\n }\n}\n","import { HttpClient } from '../utils/http';\nimport { RequestSigner } from '../auth/RequestSigner';\nimport { ValrConfigurationError } from '../errors/ValrError';\nimport { HEADERS } from '../utils/constants';\nimport { PublicAPI } from '../api/public';\nimport { AccountAPI } from '../api/account';\nimport { TradingAPI } from '../api/trading';\nimport { WalletsAPI } from '../api/wallets';\nimport { FuturesAPI } from '../api/futures';\nimport { MarginAPI } from '../api/margin';\nimport { LoansAPI } from '../api/loans';\nimport { StakeAPI } from '../api/stake';\nimport { PayAPI } from '../api/pay';\nimport { BundlesAPI } from '../api/bundles';\nimport { HealthAPI } from '../api/health';\n\n/**\n * Configuration for ValrClient\n */\nexport interface ValrClientConfig {\n /**\n * API key (required for authenticated endpoints)\n */\n apiKey?: string;\n\n /**\n * API secret (required for authenticated endpoints)\n */\n apiSecret?: string;\n\n /**\n * Base URL for API (defaults to https://api.valr.com)\n */\n baseURL?: string;\n\n /**\n * Request timeout in milliseconds (defaults to 30000)\n */\n timeout?: number;\n\n /**\n * Subaccount ID for impersonating a subaccount (optional)\n */\n subaccountId?: string;\n}\n\n/**\n * Main VALR API client\n *\n * @example\n * ```typescript\n * // For public endpoints only (no authentication)\n * const client = new ValrClient();\n * const time = await client.public.getServerTime();\n *\n * // For authenticated endpoints\n * const client = new ValrClient({\n * apiKey: 'your-api-key',\n * apiSecret: 'your-api-secret',\n * });\n * const balances = await client.account.getBalances();\n * ```\n */\nexport class ValrClient {\n private http: HttpClient;\n private apiKey?: string;\n private apiSecret?: string;\n private subaccountId?: string;\n\n /**\n * Public API methods (no authentication required)\n */\n public readonly public: PublicAPI;\n\n /**\n * Account API methods (requires authentication)\n */\n public readonly account: AccountAPI;\n\n /**\n * Trading API methods (requires authentication with trade permission)\n */\n public readonly trading: TradingAPI;\n\n /**\n * Wallets API methods (requires authentication)\n */\n public readonly wallets: WalletsAPI;\n\n /**\n * Futures API methods (requires authentication)\n */\n public readonly futures: FuturesAPI;\n\n /**\n * Margin API methods (requires authentication)\n */\n public readonly margin: MarginAPI;\n\n /**\n * Loans API methods (requires authentication)\n */\n public readonly loans: LoansAPI;\n\n /**\n * Staking/Earn API methods (requires authentication)\n */\n public readonly stake: StakeAPI;\n\n /**\n * Pay API methods (requires authentication)\n */\n public readonly pay: PayAPI;\n\n /**\n * Bundles API methods (requires authentication)\n */\n public readonly bundles: BundlesAPI;\n\n /**\n * Health API methods\n */\n public readonly health: HealthAPI;\n\n /**\n * Create a new VALR API client\n *\n * @param config - Client configuration\n */\n constructor(config: ValrClientConfig = {}) {\n const { apiKey, apiSecret, baseURL, timeout, subaccountId } = config;\n\n // Validate credentials if provided\n if ((apiKey && !apiSecret) || (!apiKey && apiSecret)) {\n throw new ValrConfigurationError(\n 'Both apiKey and apiSecret must be provided together'\n );\n }\n\n if (apiKey && apiSecret) {\n RequestSigner.validateCredentials(apiKey, apiSecret);\n }\n\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.subaccountId = subaccountId;\n\n // Initialize HTTP client\n this.http = new HttpClient({\n baseURL,\n timeout,\n });\n\n // Add request interceptor for authentication\n this.http.getInstance().interceptors.request.use((config) => {\n // Only add auth headers for authenticated requests\n if (this.apiKey && this.apiSecret) {\n const timestamp = RequestSigner.getTimestamp();\n const method = config.method?.toUpperCase() || 'GET';\n let url = config.url || '';\n const body = config.data ? JSON.stringify(config.data) : '';\n\n // Include query parameters in the signature path\n if (config.params) {\n // Build query string WITHOUT encoding to match what Axios sends\n // and what VALR expects in the signature\n const queryParts: string[] = [];\n Object.keys(config.params).sort().forEach(key => {\n const value = config.params[key];\n if (value !== undefined && value !== null) {\n // Don't URL encode - use raw values\n queryParts.push(`${key}=${value}`);\n }\n });\n if (queryParts.length > 0) {\n url = `${url}?${queryParts.join('&')}`;\n }\n\n // Update config.url with the query string and clear params\n // so Axios uses our exact URL instead of building its own query string\n config.url = url;\n delete config.params;\n }\n\n const signature = RequestSigner.signRequest({\n apiSecret: this.apiSecret,\n timestamp,\n verb: method,\n path: url,\n body,\n subaccountId: this.subaccountId,\n });\n\n // Add authentication headers\n config.headers[HEADERS.API_KEY] = this.apiKey;\n config.headers[HEADERS.SIGNATURE] = signature;\n config.headers[HEADERS.TIMESTAMP] = timestamp.toString();\n config.headers[HEADERS.CONTENT_TYPE] = config.headers.getContentType();\n\n // Add subaccount header if provided\n if (this.subaccountId) {\n config.headers[HEADERS.SUB_ACCOUNT_ID] = this.subaccountId;\n }\n }\n\n return config;\n });\n\n // Initialize API groups\n this.public = new PublicAPI(this.http);\n this.account = new AccountAPI(this.http);\n this.trading = new TradingAPI(this.http);\n this.wallets = new WalletsAPI(this.http);\n this.futures = new FuturesAPI(this.http);\n this.margin = new MarginAPI(this.http);\n this.loans = new LoansAPI(this.http);\n this.stake = new StakeAPI(this.http);\n this.pay = new PayAPI(this.http);\n this.bundles = new BundlesAPI(this.http);\n this.health = new HealthAPI(this.http);\n }\n\n /**\n * Update subaccount ID for impersonation\n *\n * @param subaccountId - Subaccount ID (or undefined to clear)\n */\n setSubaccountId(subaccountId?: string): void {\n this.subaccountId = subaccountId;\n }\n\n /**\n * Get current subaccount ID\n *\n * @returns Current subaccount ID or undefined\n */\n getSubaccountId(): string | undefined {\n return this.subaccountId;\n }\n}\n","import WebSocket from 'ws';\nimport EventEmitter from 'eventemitter3';\nimport { RequestSigner } from '../auth/RequestSigner';\nimport { ValrWebSocketError } from '../errors/ValrError';\nimport type { WebSocketMessage } from '../types';\nimport {WS_BASE_URL} from \"../utils/constants\";\n\n/**\n * WebSocket client configuration\n */\nexport interface WebSocketClientConfig {\n /** API key (required for authenticated endpoints) */\n apiKey?: string;\n /** API secret (required for authenticated endpoints) */\n apiSecret?: string;\n /** Subaccount ID for impersonation */\n subaccountId?: string;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Reconnect delay in milliseconds (default: 5000) */\n reconnectDelay?: number;\n /** Maximum reconnect attempts (default: Infinity) */\n maxReconnectAttempts?: number;\n /** Base URL for WS (defaults to wss://api.valr.com) */\n baseURL?: string;\n}\n\n/**\n * WebSocket event types\n */\nexport interface WebSocketEvents {\n connected: () => void;\n authenticated: () => void;\n message: (message: WebSocketMessage) => void;\n error: (error: Error) => void;\n close: (code: number, reason: string) => void;\n disconnected: () => void;\n reconnecting: (attempt: number) => void;\n}\n\n/**\n * Base WebSocket client for VALR API\n */\nexport abstract class ValrWebSocketClient<TEvents extends WebSocketEvents = WebSocketEvents> extends EventEmitter<TEvents> {\n protected ws?: WebSocket;\n protected url: string;\n protected path: string;\n protected config: Required<WebSocketClientConfig>;\n protected reconnectAttempts = 0;\n protected reconnectTimer?: NodeJS.Timeout;\n protected isIntentionalClose = false;\n protected isConnected = false;\n protected isAuthenticated = false;\n\n constructor(path: string, config: WebSocketClientConfig = {}) {\n super();\n this.config = {\n apiKey: config.apiKey || '',\n apiSecret: config.apiSecret || '',\n subaccountId: config.subaccountId || '',\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay || 5000,\n maxReconnectAttempts: config.maxReconnectAttempts || Infinity,\n baseURL: config.baseURL || WS_BASE_URL\n };\n this.url = `${this.config.baseURL}${path}`;\n this.path = path;\n }\n\n /**\n * Connect to WebSocket\n */\n connect(): void {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n return; // Already connected or connecting\n }\n\n this.isIntentionalClose = false;\n\n try {\n // Build WebSocket options with authentication headers if credentials provided\n const wsOptions: WebSocket.ClientOptions = {};\n\n if (this.config.apiKey && this.config.apiSecret) {\n const timestamp = RequestSigner.getTimestamp();\n const signature = RequestSigner.signRequest({\n apiSecret: this.config.apiSecret,\n timestamp,\n verb: 'GET',\n path: this.path,\n body: '',\n subaccountId: this.config.subaccountId,\n });\n\n wsOptions.headers = {\n 'X-VALR-API-KEY': this.config.apiKey,\n 'X-VALR-SIGNATURE': signature,\n 'X-VALR-TIMESTAMP': timestamp.toString(),\n };\n\n if (this.config.subaccountId) {\n wsOptions.headers['X-VALR-SUB-ACCOUNT-ID'] = this.config.subaccountId;\n }\n }\n\n this.ws = new WebSocket(this.url, wsOptions);\n\n this.ws.on('open', () => {\n this.handleOpen();\n });\n\n this.ws.on('message', (data: WebSocket.Data) => {\n this.handleMessage(data);\n });\n\n this.ws.on('error', (error: Error) => {\n this.handleError(error);\n });\n\n this.ws.on('close', (code: number, reason: Buffer) => {\n this.handleClose(code, reason.toString());\n });\n } catch (error) {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError(`Failed to connect: ${error}`));\n }\n }\n\n /**\n * Disconnect from WebSocket\n */\n disconnect(): void {\n this.isIntentionalClose = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = undefined;\n }\n }\n\n /**\n * Check if connected\n */\n isOpen(): boolean {\n return this.isConnected && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Send a message to WebSocket\n */\n protected send(message: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new ValrWebSocketError('WebSocket is not connected');\n }\n\n const data = typeof message === 'string' ? message : JSON.stringify(message);\n this.ws.send(data);\n }\n\n /**\n * Handle WebSocket open event\n */\n protected handleOpen(): void {\n this.isConnected = true;\n this.reconnectAttempts = 0;\n // @ts-ignore - Base event is always available\n this.emit('connected');\n\n // If credentials were provided, authentication happened via headers during handshake\n if (this.config.apiKey && this.config.apiSecret) {\n this.isAuthenticated = true;\n // @ts-ignore - Base event is always available\n this.emit('authenticated');\n this.onAuthenticated();\n this.startPing()\n }\n }\n\n protected startPing(){\n setInterval(() => {\n if(this.isConnected && this.isAuthenticated){\n this.send({ type: \"PING\"});\n }\n }, 30000)\n }\n\n /**\n * Handle incoming WebSocket message\n */\n protected handleMessage(data: WebSocket.Data): void {\n try {\n const message = JSON.parse(data.toString()) as WebSocketMessage;\n\n // Emit the message event\n // @ts-ignore - Base event is always available\n this.emit('message', message);\n\n // Call subclass handler\n this.onMessage(message);\n } catch (error) {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError(`Failed to parse message: ${error}`));\n }\n }\n\n /**\n * Handle WebSocket error\n */\n protected handleError(error: Error): void {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError(error.message));\n }\n\n /**\n * Handle WebSocket close event\n */\n protected handleClose(code: number, reason: string): void {\n this.isConnected = false;\n this.isAuthenticated = false;\n // @ts-ignore - Base event is always available\n this.emit('close', code, reason);\n // @ts-ignore - Base event is always available\n this.emit('disconnected');\n\n // Attempt to reconnect if not intentional\n if (!this.isIntentionalClose && this.config.autoReconnect) {\n this.attemptReconnect();\n }\n }\n\n /**\n * Attempt to reconnect\n */\n protected attemptReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n // @ts-ignore - Base event is always available\n this.emit('error', new ValrWebSocketError('Max reconnect attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n // @ts-ignore - Base event is always available\n this.emit('reconnecting', this.reconnectAttempts);\n\n this.reconnectTimer = setTimeout(() => {\n this.connect();\n }, this.config.reconnectDelay);\n }\n\n /**\n * Override this method to handle authenticated event\n */\n protected onAuthenticated(): void {\n // Override in subclass\n }\n\n /**\n * Override this method to handle messages\n */\n protected abstract onMessage(message: WebSocketMessage): void;\n}\n","import { ValrWebSocketClient, WebSocketClientConfig, WebSocketEvents } from './ValrWebSocketClient';\nimport {WS_ACCOUNT_URL_PATH} from '../utils/constants';\nimport type {\n WebSocketMessage,\n Subscription,\n OrderProcessed,\n OrderStatusUpdate,\n BalanceUpdate,\n WebSocketAccountTrade,\n} from '../types';\n\n/**\n * Account WebSocket events (in addition to base events)\n */\nexport interface AccountWebSocketEvents {\n 'order:processed': (data: OrderProcessed) => void;\n 'order:statusUpdate': (data: OrderStatusUpdate) => void;\n 'balance:update': (data: BalanceUpdate) => void;\n 'trade:new': (data: WebSocketAccountTrade) => void;\n}\n\n/**\n * Combined event types for AccountWebSocket\n */\nexport type AccountWebSocketEventMap = WebSocketEvents & AccountWebSocketEvents;\n\n/**\n * Account WebSocket client for real-time account updates\n *\n * Receives:\n * - Order processing results\n * - Order status updates\n * - Balance changes\n * - Account trades\n *\n * @example\n * ```typescript\n * const wsClient = new AccountWebSocket({\n * apiKey: 'your-api-key',\n * apiSecret: 'your-api-secret',\n * });\n *\n * wsClient.on('connected', () => {\n * console.log('Connected to account WebSocket');\n * });\n *\n * wsClient.on('authenticated', () => {\n * console.log('Authenticated');\n * });\n *\n * wsClient.on('balance:update', (update) => {\n * console.log('Balance updated:', update);\n * });\n *\n * wsClient.on('order:processed', (result) => {\n * console.log('Order processed:', result);\n * });\n *\n * wsClient.connect();\n * ```\n */\nexport class AccountWebSocket extends ValrWebSocketClient<AccountWebSocketEventMap> {\n constructor(config: WebSocketClientConfig) {\n if (!config.apiKey || !config.apiSecret) {\n throw new Error('API key and secret are required for Account WebSocket');\n }\n super(WS_ACCOUNT_URL_PATH, config);\n }\n\n /**\n * Subscribe to specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n subscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'SUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Unsubscribe from specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n unsubscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'UNSUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Handle authenticated event\n */\n protected onAuthenticated(): void {\n // Auto-subscribe to all account events\n this.subscribe([\n { event: 'INSTANT_ORDER_COMPLETED' },\n { event: 'ORDER_PROCESSED' },\n { event: 'ORDER_STATUS_UPDATE' },\n { event: 'BALANCE_UPDATE' },\n { event: 'NEW_ACCOUNT_TRADE' },\n { event: 'OPEN_ORDERS_UPDATE' },\n { event: 'NEW_PENDING_RECEIVE' },\n { event: 'SEND_STATUS_UPDATE' },\n { event: 'FAILED_CANCEL_ORDER' },\n ]);\n }\n\n /**\n * Handle incoming messages\n */\n protected onMessage(message: WebSocketMessage): void {\n switch (message.type) {\n case 'ORDER_PROCESSED':\n this.emit('order:processed', message as OrderProcessed);\n break;\n\n case 'ORDER_STATUS_UPDATE':\n this.emit('order:statusUpdate', message as OrderStatusUpdate);\n break;\n\n case 'BALANCE_UPDATE':\n this.emit('balance:update', message as BalanceUpdate);\n break;\n\n case 'NEW_ACCOUNT_TRADE':\n this.emit('trade:new', message as WebSocketAccountTrade);\n break;\n\n case 'SUBSCRIBED':\n // Successfully subscribed\n break;\n\n case 'UNSUBSCRIBED':\n // Successfully unsubscribed\n break;\n\n default:\n // Unknown message type - still emit via base 'message' event\n break;\n }\n }\n\n}\n","import { ValrWebSocketClient, WebSocketClientConfig, WebSocketEvents } from './ValrWebSocketClient';\nimport {WS_TRADE_URL_PATH} from '../utils/constants';\nimport type {\n WebSocketMessage,\n Subscription,\n OrderBookUpdate,\n MarketSummaryUpdate,\n NewTrade,\n CurrencyPair,\n} from '../types';\n\n/**\n * Trade WebSocket events (in addition to base events)\n */\nexport interface TradeWebSocketEvents {\n 'orderbook:update': (data: OrderBookUpdate) => void;\n 'market:summary': (data: MarketSummaryUpdate) => void;\n 'trade:new': (data: NewTrade) => void;\n}\n\n/**\n * Combined event types for TradeWebSocket\n */\nexport type TradeWebSocketEventMap = WebSocketEvents & TradeWebSocketEvents;\n\n/**\n * Trade WebSocket client for real-time market data\n *\n * Receives:\n * - Order book updates (aggregated and full)\n * - Market summary updates\n * - New trades\n * - Price bucket updates\n *\n * @example\n * ```typescript\n * // Public trade WebSocket (no auth required)\n * const wsClient = new TradeWebSocket();\n *\n * wsClient.on('connected', () => {\n * console.log('Connected to trade WebSocket');\n * wsClient.subscribeToOrderBook(['BTCZAR', 'ETHZAR']);\n * wsClient.subscribeToTrades(['BTCZAR']);\n * });\n *\n * wsClient.on('orderbook:update', (update) => {\n * console.log('Order book update:', update);\n * });\n *\n * wsClient.on('trade:new', (trade) => {\n * console.log('New trade:', trade);\n * });\n *\n * wsClient.connect();\n * ```\n */\nexport class TradeWebSocket extends ValrWebSocketClient<TradeWebSocketEventMap> {\n constructor(config: WebSocketClientConfig = {}) {\n super(WS_TRADE_URL_PATH, config);\n }\n\n /**\n * Subscribe to aggregated order book updates for currency pairs\n *\n * @param pairs - Array of currency pairs (e.g., ['BTCZAR', 'ETHZAR'])\n */\n subscribeToOrderBook(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'AGGREGATED_ORDERBOOK_UPDATE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to full (non-aggregated) order book updates\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToFullOrderBook(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'FULL_ORDERBOOK_UPDATE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to market summary updates\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToMarketSummary(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'MARKET_SUMMARY_UPDATE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to new trades\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToTrades(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'NEW_TRADE',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to price bucket updates\n *\n * @param pairs - Array of currency pairs\n */\n subscribeToPriceBuckets(pairs: CurrencyPair[]): void {\n this.subscribe([\n {\n event: 'NEW_TRADE_BUCKET',\n pairs,\n },\n ]);\n }\n\n /**\n * Subscribe to specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n subscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'SUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Unsubscribe from specific events\n *\n * @param subscriptions - Array of subscription objects\n */\n unsubscribe(subscriptions: Subscription[]): void {\n this.send({\n type: 'UNSUBSCRIBE',\n subscriptions,\n });\n }\n\n /**\n * Handle authenticated event (optional for trade WebSocket)\n */\n protected onAuthenticated(): void {\n // Trade WebSocket can be used without authentication\n // Subclass can override this if needed\n }\n\n /**\n * Handle incoming messages\n */\n protected onMessage(message: WebSocketMessage): void {\n switch (message.type) {\n case 'AGGREGATED_ORDERBOOK_UPDATE':\n case 'FULL_ORDERBOOK_UPDATE':\n this.emit('orderbook:update', message as OrderBookUpdate);\n break;\n\n case 'MARKET_SUMMARY_UPDATE':\n this.emit('market:summary', message as MarketSummaryUpdate);\n break;\n\n case 'NEW_TRADE':\n this.emit('trade:new', message as NewTrade);\n break;\n\n case 'SUBSCRIBED':\n // Successfully subscribed\n break;\n\n case 'UNSUBSCRIBED':\n // Successfully unsubscribed\n break;\n\n default:\n // Unknown message type - still emit via base 'message' event\n break;\n }\n }\n\n}\n"]}
|