@machinemetrics/mm-erp-sdk 0.1.5-beta.0 → 0.1.6-beta.0
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/README.md +1 -1
- package/dist/{config-2l5vnNkA.js → config-CWRevSxh.js} +6 -6
- package/dist/{config-2l5vnNkA.js.map → config-CWRevSxh.js.map} +1 -1
- package/dist/{connector-factory-CQ8e7Tae.js → connector-factory-76kTjfE8.js} +12 -3
- package/dist/connector-factory-76kTjfE8.js.map +1 -0
- package/dist/{hashed-cache-manager-Ci59eC75.js → hashed-cache-manager-DW2y4SFu.js} +5 -4
- package/dist/{hashed-cache-manager-Ci59eC75.js.map → hashed-cache-manager-DW2y4SFu.js.map} +1 -1
- package/dist/{index-CXbOvFyf.js → index-DdqBliMK.js} +7 -7
- package/dist/{index-CXbOvFyf.js.map → index-DdqBliMK.js.map} +1 -1
- package/dist/index.d.ts +16 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/{logger-QG73MndU.js → logger-nJCE--ZL.js} +51 -45
- package/dist/{logger-QG73MndU.js.map → logger-nJCE--ZL.js.map} +1 -1
- package/dist/mm-erp-sdk.js +14220 -135
- package/dist/mm-erp-sdk.js.map +1 -1
- package/dist/services/data-sync-service/index.d.ts +1 -1
- package/dist/services/data-sync-service/index.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.d.ts +2 -0
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +42 -41
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.js +11 -5
- package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.d.ts +2 -0
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +39 -40
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.js +4 -3
- package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.js +15 -5
- package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
- package/dist/services/erp-api-services/index.d.ts +5 -1
- package/dist/services/erp-api-services/index.d.ts.map +1 -1
- package/dist/services/mm-api-service/index.d.ts +3 -2
- package/dist/services/mm-api-service/index.d.ts.map +1 -1
- package/dist/services/mm-api-service/mm-api-service.d.ts +20 -0
- package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
- package/dist/services/psql-erp-service/configuration.d.ts +10 -0
- package/dist/services/psql-erp-service/configuration.d.ts.map +1 -0
- package/dist/services/psql-erp-service/index.d.ts +19 -0
- package/dist/services/psql-erp-service/index.d.ts.map +1 -0
- package/dist/services/psql-erp-service/internal/psql-config.d.ts +28 -0
- package/dist/services/psql-erp-service/internal/psql-config.d.ts.map +1 -0
- package/dist/services/psql-erp-service/internal/psql-labor-ticket-operations.d.ts +40 -0
- package/dist/services/psql-erp-service/internal/psql-labor-ticket-operations.d.ts.map +1 -0
- package/dist/services/psql-erp-service/internal/types/psql-types.d.ts +15 -0
- package/dist/services/psql-erp-service/internal/types/psql-types.d.ts.map +1 -0
- package/dist/services/psql-erp-service/psql-helpers.d.ts +32 -0
- package/dist/services/psql-erp-service/psql-helpers.d.ts.map +1 -0
- package/dist/services/psql-erp-service/psql-service.d.ts +49 -0
- package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -0
- package/dist/utils/connector-factory.d.ts.map +1 -1
- package/dist/utils/connector-log/log-deduper.d.ts +56 -0
- package/dist/utils/connector-log/log-deduper.d.ts.map +1 -0
- package/dist/utils/connector-log/mm-connector-logger-example.d.ts +1 -0
- package/dist/utils/connector-log/mm-connector-logger-example.d.ts.map +1 -0
- package/dist/utils/connector-log/mm-connector-logger.d.ts +74 -0
- package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -0
- package/dist/utils/error-utils.d.ts +2 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/index.d.ts +10 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/index.d.ts +2 -1
- package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/index.ts +43 -7
- package/src/services/data-sync-service/index.ts +1 -4
- package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +19 -7
- package/src/services/data-sync-service/jobs/from-erp.ts +12 -5
- package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +15 -5
- package/src/services/data-sync-service/jobs/run-migrations.ts +5 -2
- package/src/services/data-sync-service/jobs/to-erp.ts +17 -5
- package/src/services/erp-api-services/index.ts +9 -1
- package/src/services/mm-api-service/index.ts +1 -1
- package/src/services/mm-api-service/mm-api-service.ts +28 -0
- package/src/services/psql-erp-service/configuration.ts +9 -0
- package/src/services/psql-erp-service/index.ts +28 -0
- package/src/services/psql-erp-service/internal/psql-config.ts +13 -0
- package/src/services/psql-erp-service/internal/psql-labor-ticket-operations.ts +58 -0
- package/src/services/psql-erp-service/internal/types/psql-types.ts +17 -0
- package/src/services/psql-erp-service/psql-helpers.ts +90 -0
- package/src/services/psql-erp-service/psql-service.ts +215 -0
- package/src/utils/application-initializer.ts +1 -1
- package/src/utils/connector-factory.ts +14 -3
- package/src/utils/connector-log/log-deduper.ts +284 -0
- package/src/utils/connector-log/mm-connector-logger-example.ts +97 -0
- package/src/utils/connector-log/mm-connector-logger.ts +177 -0
- package/src/utils/error-utils.ts +18 -0
- package/src/utils/index.ts +11 -4
- package/src/utils/standard-process-drivers/index.ts +2 -4
- package/dist/connector-factory-CQ8e7Tae.js.map +0 -1
package/dist/mm-erp-sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mm-erp-sdk.js","sources":["../src/types/erp-types.ts","../src/services/erp-api-services/rest/get-query-params.ts","../src/services/mm-api-service/types/receive-types.ts","../src/utils/http-client.ts","../src/services/mm-api-service/token-mgr.ts","../src/services/erp-api-services/errors.ts","../src/services/mm-api-service/mm-api-service.ts","../src/services/mm-api-service/types/send-types.ts","../src/utils/uniqueRows.ts","../src/utils/removeExtraneousFields.ts","../src/utils/removeIdFieldFromPayload.ts","../src/utils/trimObjectValues.ts","../src/utils/cleanup-numbers.ts","../src/utils/data-transformation.ts","../src/utils/timezone.ts","../src/utils/time-utils.ts","../src/services/caching-service/record-tracking-manager.ts","../src/services/caching-service/batch-cache-manager.ts","../src/utils/mm-labor-ticket-helpers.ts","../src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts","../src/services/mm-api-service/types/entity-transformer.ts","../src/utils/standard-process-drivers/error-processor.ts","../src/utils/standard-process-drivers/mm-entity-processor.ts","../src/utils/standard-process-drivers/standard-process-drivers.ts","../src/services/erp-api-services/rest/rest-api-service.ts","../src/utils/erp-type-from-entity.ts","../src/utils/application-initializer.ts","../src/services/erp-api-services/graphql/graphql-service.ts","../src/services/erp-api-services/oauth-client.ts","../src/services/data-sync-service/data-sync-service.ts","../src/services/sql-server-erp-service/internal/sql-server-config.ts","../src/services/sql-server-erp-service/sql-server-service.ts","../src/services/sql-server-erp-service/internal/sql-transaction-manager.ts","../src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts","../src/services/sql-server-erp-service/sql-server-helpers.ts"],"sourcesContent":["// TO DO: This will change once the SDK is refactored into its own repo\nexport enum ERPType {\n INVALID = \"INVALID\",\n D365 = \"D365\",\n JOB_BOSS = \"JOB_BOSS\",\n PROFITKEY = \"PROFITKEY\",\n PROSHOP = \"PROSHOP\",\n SYTELINE = \"SYTELINE\",\n TEMPLATE = \"TEMPLATE\",\n GLOBALSHOP = \"GLOBALSHOP\",\n}\n\nexport enum ERPObjType {\n RESOURCES,\n PARTS,\n PART_OPERATION,\n WORK_ORDERS,\n WORK_ORDER_OPERATIONS,\n PERSONS,\n REASONS,\n LABOR_TICKETS,\n // TO DO: TIMESHEETS support\n}\n\nexport interface ERPPagination {\n count: number;\n limit: number;\n nextPage: string | undefined;\n previousPage: string | undefined;\n offset?: number;\n}\n\nexport interface ERPResponse {\n data: Record<string, string>[];\n paging: ERPPagination;\n}\n\nexport type ERPObject = Record<string, string>;\n","/**\n * Types and utilities for handling GET query parameters and responses\n */\n\nexport enum Operator {\n eq = \"eq\",\n lt = \"lt\",\n lte = \"lte\",\n gt = \"gt\",\n gte = \"gte\",\n}\n\nexport type LogicalCondition = {\n field: string;\n value: string;\n operator: Operator;\n};\n\nexport type InCondition = { field: string; value: Array<string> };\n\n/**\n * QueryParams is specifically used for the get API, defining pagination and filters\n */\nexport interface QueryParams {\n limit?: number;\n nextPage?: string;\n previousPage?: string;\n filter?: {\n in?: InCondition[];\n and?: LogicalCondition[];\n or?: LogicalCondition[];\n };\n}\n\nexport interface Pagination {\n count: number;\n limit: number;\n nextPage?: string;\n previousPage?: string;\n}\n\nexport interface PaginatedAPIResponse<T> {\n data: T[];\n paging: Pagination;\n}\n\n/**\n * Builds a logical condition string from an array of conditions\n * @param conditions Array of logical conditions\n * @param operator The logical operator to use ('and' or 'or')\n * @returns A string representation of the logical conditions\n */\nexport const buildLogicalCondition = (\n conditions: LogicalCondition[],\n operator: \"and\" | \"or\"\n): string => {\n return conditions\n .map(\n (condition) =>\n `${condition.field} ${condition.operator} '${condition.value}'`\n )\n .join(` ${operator} `);\n};\n","//#region MMReceiveLaborTicket\n/**\n * Represents a labor ticket as received from the MM API /erp/v1/labor-tickets/export/updates\n */\nexport class MMReceiveLaborTicket {\n constructor(data: Partial<MMReceiveLaborTicket>) {\n Object.assign(this, data);\n }\n\n // Returns the closed date if it is a valid date, otherwise returns null\n get workOrderOperationClosedDate(): string | null {\n const closedDate = this.workOrderOperation?.closedDate;\n return typeof closedDate === \"string\" &&\n closedDate !== \"\" &&\n !isNaN(Date.parse(closedDate))\n ? closedDate\n : null;\n }\n\n set workOrderOperationClosedDate(value: string | null) {\n if (this.workOrderOperation) {\n this.workOrderOperation.closedDate = value;\n }\n }\n\n // Returns 1 if the work order operation is closed (has a valid closed date), 0 otherwise\n get workOrderOpIsClosed(): number {\n return this.workOrderOperationClosedDate !== null ? 1 : 0;\n }\n\n /*Descriptions from machinemetrics.atlassian.net/wiki/spaces/DEVE/pages/842661901/MM+ERP+Schema+Descriptions*/\n\n badParts!: number; // The number of parts produced that do not meet quality standards\n clockIn!: string | null; // The timestamp when the work on this ticket started\n clockOut!: string | null; // The timestamp when the work on this ticket ended\n comment!: string | null;\n createdAt!: string | null;\n goodParts!: number; // The number of parts produced that meet quality standards\n laborTicketId!: string; // The unique identifier for the labor ticket in the ERP\n laborTicketRef!: string; // The unique identifier for the labor ticket in MM\n lot!: string; // Refers to a material batch. If not available in the ERP, default to an empty string\n personId!: string; // The person who did the work\n reasons?: MMReceiveLaborTicketReason[];\n resourceId!: string; // The physical resource that did the work\n sequenceNumber!: number; // Which sequence this operation is for in the order, associates back to a part_operation with the part_number from the work_order, and sequence_number from the op\n split!: string; // Batch number if order split for staggered delivery. If not available in the ERP, default to an empty string\n state!: string; // The current state of the labor ticket (e.g., \"CLOSED/OPEN\")\n type!: string; // If the labor is production, setup, or indirect\n syncedAt!: string | null;\n updatedAt!: string | null;\n workOrderId!: string; // The order this labor ticket corresponds to\n workOrderOperation?: MMReceiveLaborTicketWorkOrderOperation;\n sub!: string; // Batch number for parts that had to be rerun. If not available in the ERP, default to an empty string\n transactionDate!: string | null;\n}\n\n/**\n * Represents a reason in the MMApiReceiveLaborTicket object as received from MM\n */\nexport interface MMReceiveLaborTicketReason {\n reason: {\n annotationTypeRef: string | null;\n category: string; // Parent group if applicable (optional)\n code: string; // The functional name of the label\n companyId: string;\n createdAt: string;\n description: string;\n entityType: string; // Whether it represents machine downtime or rejected parts context (downtime/quality)\n reasonId: string; // Unique identifier in the ERP\n reasonRef: number;\n rejectReasonRef: number;\n updatedAt: string | null;\n };\n}\n\n/**\n * Represents a work order operation in the MMApiReceiveLaborTicket object, incomplete when\n * pulling updated labor tickets from MM\n */\nexport interface MMReceiveLaborTicketWorkOrderOperation {\n closedDate: string | null; // non-null and a valid date if the work order operation is closed\n}\n//#endregion MMReceiveLaborTicket\n\n//#region MMReceiveTimesheet\n\n// MLW TODO\n\n// #endregion MMReceiveTimesheet\n","import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport logger from \"../services/reporting-service/logger\";\n\nexport class HTTPError extends Error {\n constructor(\n message: string,\n public status: number,\n public code?: string,\n public data?: unknown\n ) {\n super(message);\n this.name = \"HTTPError\";\n }\n}\n\nexport type HTTPMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface HTTPRequestConfig {\n method: HTTPMethod;\n url: string;\n headers?: Record<string, string>;\n data?: unknown;\n params?: Record<string, string>;\n}\n\nexport interface HTTPResponse<T = unknown> {\n data: T;\n status: number;\n headers: Record<string, string>;\n}\n\nexport interface HTTPClient {\n request<T = unknown>(config: HTTPRequestConfig): Promise<HTTPResponse<T>>;\n handleError(error: unknown): HTTPError;\n destroy(): Promise<void>;\n}\n\nexport interface HTTPClientConfig {\n baseUrl: string;\n retryAttempts: number;\n}\n\n/**\n * This is a factory class for creating HTTPClient instances, at least for now\n * just a wrapper around AxiosClient\n */\nexport class HTTPClientFactory {\n static getInstance(config: HTTPClientConfig): HTTPClient {\n return new AxiosClient(config.baseUrl, config.retryAttempts);\n }\n}\n\nclass AxiosClient implements HTTPClient {\n private client: AxiosInstance | null = null;\n private retryAttempts: number;\n private isDestroyed: boolean = false;\n private inFlightControllers: Set<AbortController> = new Set();\n private pendingTimeouts: Set<ReturnType<typeof setTimeout>> = new Set();\n private pendingSleepResolvers: Set<() => void> = new Set();\n\n /**\n * Note regarding baseURL, from https://github.com/axios/axios\n * `baseURL` will be prepended to `url` unless `url` is absolute and option `allowAbsoluteUrls` is set to true (the default).\n * It can be convenient to set `baseURL` for an instance of axios to pass relative URLs to methods of that instance.\n */\n constructor(baseUrl: string, retryAttempts: number) {\n this.client = axios.create({\n baseURL: baseUrl,\n timeout: 30000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n this.retryAttempts = retryAttempts;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n if (this.isDestroyed) {\n resolve();\n return;\n }\n const timeout = setTimeout(() => {\n this.pendingTimeouts.delete(timeout);\n this.pendingSleepResolvers.delete(resolve);\n resolve();\n }, ms);\n this.pendingTimeouts.add(timeout);\n this.pendingSleepResolvers.add(resolve);\n });\n }\n\n async request<T = unknown>(\n config: HTTPRequestConfig\n ): Promise<HTTPResponse<T>> {\n if (this.isDestroyed || !this.client) {\n throw new HTTPError(\"HTTP client has been destroyed\", 500);\n }\n\n const controller = new AbortController();\n this.inFlightControllers.add(controller);\n\n const axiosConfig: AxiosRequestConfig = {\n method: config.method,\n url: config.url,\n headers: config.headers,\n data: config.data,\n params: config.params,\n signal: controller.signal,\n };\n\n logger.info(\"HTTP request starting\", { \n url: config.url, \n method: config.method, \n baseURL: this.client.defaults.baseURL,\n retryAttempts: this.retryAttempts \n });\n \n // Extra console.log for debugging\n console.log(\"=== FULL URL DEBUG ===\");\n console.log(\"baseURL:\", this.client.defaults.baseURL);\n console.log(\"relative url:\", config.url);\n console.log(\"full constructed URL:\", (this.client.defaults.baseURL || \"\") + config.url);\n console.log(\"method:\", config.method);\n\n let lastError: unknown;\n try {\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n logger.info(`HTTP request attempt ${attempt + 1}/${this.retryAttempts + 1}`);\n const response = await this.client.request<T>(axiosConfig);\n logger.info(\"HTTP request succeeded\", { status: response.status });\n return {\n data: response.data,\n status: response.status,\n headers: response.headers as Record<string, string>,\n };\n } catch (error) {\n lastError = error;\n\n const isAxiosErr = error instanceof AxiosError;\n const code = isAxiosErr ? error.code : undefined;\n const status = isAxiosErr ? error.response?.status : undefined;\n const errorConstructor = error instanceof Error ? error.constructor.name : undefined;\n const message = error instanceof Error ? error.message : String(error);\n \n logger.info(`HTTP request attempt ${attempt + 1} failed`, {\n errorType: typeof error,\n errorConstructor,\n isAxiosError: isAxiosErr,\n message,\n code,\n status,\n });\n\n // Don't retry on 4xx errors (client errors)\n if (\n error instanceof AxiosError &&\n error.response?.status &&\n error.response.status >= 400 &&\n error.response.status < 500\n ) {\n logger.info(\"Not retrying due to 4xx client error\");\n break;\n }\n\n // Don't retry canceled/aborted requests\n if (error instanceof AxiosError && error.code === \"ERR_CANCELED\") {\n break;\n }\n\n // If this was the last attempt, don't wait\n if (attempt < this.retryAttempts) {\n const waitTime = Math.pow(2, attempt) * 1000;\n logger.info(`Waiting ${waitTime}ms before retry`);\n await this.sleep(waitTime);\n if (this.isDestroyed) {\n throw new HTTPError(\"HTTP client has been destroyed\", 500);\n }\n }\n }\n }\n } finally {\n this.inFlightControllers.delete(controller);\n }\n logger.info(\"HTTP request failed after all retries, throwing error\");\n throw this.handleError(lastError, config);\n }\n\n handleError(error: unknown, requestConfig?: HTTPRequestConfig): HTTPError {\n if (error instanceof AxiosError) {\n // Build a more descriptive error message that includes the URL and method\n const baseUrl = this.client?.defaults.baseURL || \"\";\n const fullUrl = requestConfig\n ? `${baseUrl}${requestConfig.url}`\n : \"Unknown URL\";\n const method = requestConfig?.method || \"Unknown method\";\n\n const errorMessage = `${error.message} (${method} ${fullUrl})`;\n\n return new HTTPError(\n errorMessage,\n error.response?.status || 500,\n error.code,\n error.response?.data\n );\n }\n return new HTTPError(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n 500\n );\n }\n\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n // Abort any in-flight requests\n for (const c of this.inFlightControllers) {\n try { c.abort(); } catch { /* ignore: abort may throw in some environments */ }\n }\n this.inFlightControllers.clear();\n\n // Cancel any pending retry waits\n for (const t of this.pendingTimeouts) {\n clearTimeout(t);\n }\n this.pendingTimeouts.clear();\n for (const resolve of this.pendingSleepResolvers) {\n try { resolve(); } catch { /* ignore: resolver threw; cleanup proceeds */ }\n }\n this.pendingSleepResolvers.clear();\n\n // Drop axios instance reference\n this.client = null;\n }\n}\n","import {\n getCachedMMToken,\n setCachedMMToken,\n} from \"../../utils/local-data-store/jobs-shared-data\";\nimport { HTTPClient, HTTPClientFactory } from \"../../utils/http-client\";\nimport { CoreConfiguration } from \"../data-sync-service/configuration-manager\";\nimport { logger } from \"../reporting-service\";\n\n/**\n * Manages the MM API token with caching and expiration checking\n * Tokens are cached across jobs and job instances in local-data-store/jobs-shared-data.ts\n * @jest-environment node\n */\nexport class MMTokenManager {\n private token: string;\n private tokenExpiration: Date | null;\n private baseUrl: string;\n private api: HTTPClient;\n\n constructor() {\n const cached = getCachedMMToken();\n this.token = cached?.token || \"\";\n this.tokenExpiration = cached?.expiration\n ? new Date(cached.expiration)\n : null;\n const config = CoreConfiguration.inst();\n console.log(\"=== MMTOKEN MANAGER DEBUG ===\");\n console.log(\"config.mmApiBaseUrl:\", config.mmApiBaseUrl);\n console.log(\"config object keys:\", Object.keys(config));\n this.baseUrl = config.mmApiBaseUrl;\n console.log(\"this.baseUrl set to:\", this.baseUrl);\n console.log(\"=== END MMTOKEN MANAGER DEBUG ===\");\n this.api = HTTPClientFactory.getInstance({\n baseUrl: this.baseUrl,\n retryAttempts: config.mmApiRetryAttempts,\n });\n }\n\n /**\n * Checks if the current token is expired or will expire within the next minute\n * @returns boolean indicating if token needs refresh\n */\n private isTokenExpired(): boolean {\n if (!this.tokenExpiration) return true;\n\n // Add 1 minute buffer to ensure we refresh before actual expiration\n const bufferTimeMS = 60_000;\n const isExpired =\n this.tokenExpiration.getTime() - bufferTimeMS <= Date.now();\n if (isExpired) {\n logger.info(\"isTokenExpired: the api token from MM has expired\");\n }\n return isExpired;\n }\n\n /**\n * Safely extracts expiration time from JWT token\n * @param token JWT token string\n * @returns Date object representing token expiration, or null if cannot be determined\n */\n private getTokenExpiration(token: string): Date | null {\n try {\n // Split token into parts\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n console.warn(\"Invalid JWT format: token does not have 3 parts\");\n return null;\n }\n\n // Decode payload (second part)\n const payload = Buffer.from(parts[1], \"base64\").toString(\"utf-8\");\n const decodedPayload = JSON.parse(payload);\n\n // Check if exp claim exists\n if (typeof decodedPayload.exp !== \"number\") {\n console.warn(\"JWT does not contain expiration time (exp claim)\");\n return null;\n }\n\n // Convert Unix timestamp (seconds) to Date\n return new Date(decodedPayload.exp * 1000);\n } catch (error) {\n console.warn(\"Error parsing JWT token:\", error);\n return null;\n }\n }\n\n /**\n * Gets a valid token, either from cache or by requesting a new one\n * @returns Promise resolving to a valid token string\n */\n public async getToken(): Promise<string> {\n if (this.token && !this.isTokenExpired()) {\n return this.token;\n }\n\n const config = CoreConfiguration.inst();\n const serviceToken = config.mmApiAuthToken;\n const tokenResponse = await this.api.request<string>({\n url: \"/user-token\",\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${serviceToken}`,\n },\n });\n\n this.token = tokenResponse.data;\n this.tokenExpiration = this.getTokenExpiration(this.token);\n\n // Cache the new token and its expiration\n setCachedMMToken({\n token: this.token,\n expiration: this.tokenExpiration?.getTime() || null,\n });\n\n logger.info(\"getToken: the api token from MM has been refreshed\");\n return this.token;\n }\n\n /**\n * Invalidates the current token, forcing a fresh fetch on next getToken() call\n */\n public invalidateToken(): void {\n this.token = \"\";\n this.tokenExpiration = null;\n setCachedMMToken({ token: \"\", expiration: null });\n }\n}\n","import { AxiosError } from \"axios\";\nimport logger from \"../reporting-service/logger\";\nimport { GraphQLServerError } from \"./graphql/types\";\nimport { HTTPError } from \"../../utils/http-client\";\n\n/**\n * Represents GraphQL specific errors (validation, missing fields, etc.)\n */\nexport class GraphQLError extends Error {\n constructor(\n message: string,\n public errors: GraphQLServerError[]\n ) {\n super(message);\n this.name = \"GraphQLError\";\n }\n}\n\n/**\n * Centralized error handling for API requests.\n * Transforms various error types into standardized HTTPError or GraphQLError.\n */\nexport class ErrorHandler {\n /**\n * Transforms any error into a standardized HTTPError or GraphQLError and throws it.\n * Never returns - always throws an error.\n *\n * @throws {HTTPError|GraphQLError} Standardized error with appropriate details\n */\n static handle(error: unknown): never {\n // Handle HTTPError (already processed by http-client)\n if (error instanceof HTTPError) {\n // For GraphQL responses with errors in the data\n if (\n error.data &&\n typeof error.data === \"object\" &&\n \"errors\" in error.data\n ) {\n const graphqlError = new GraphQLError(\n \"GraphQL Error\",\n (error.data as { errors: GraphQLServerError[] }).errors\n );\n\n // Log the error\n logger.error(\"Error>>GraphQL\", {\n message: graphqlError.message,\n errors: graphqlError.errors,\n });\n\n throw graphqlError;\n }\n\n // Log HTTP error with generic response data\n logger.error(\"Error>>HTTP\", {\n status: error.status,\n message: error.message,\n code: error.code,\n data: error.data,\n });\n\n throw error; // Re-throw the original HTTPError\n }\n\n // Handle raw AxiosError (direct usage, not through http-client)\n if (error instanceof AxiosError) {\n // For GraphQL responses with errors\n if (error.response?.data?.errors) {\n const graphqlError = new GraphQLError(\n \"GraphQL Error\",\n error.response.data.errors as GraphQLServerError[]\n );\n\n // Log the error\n logger.error(\"Error>>GraphQL\", {\n message: graphqlError.message,\n errors: graphqlError.errors,\n });\n\n throw graphqlError;\n }\n\n // For HTTP errors - create HTTPError and log with response data\n const httpError = new HTTPError(\n error.message,\n error.response?.status || 500,\n error.code,\n error.response?.data\n );\n\n // Log HTTP error with generic response data\n logger.error(\"Error>>HTTP\", {\n status: httpError.status,\n message: httpError.message,\n code: httpError.code,\n data: httpError.data,\n });\n\n throw httpError;\n }\n\n // For other errors\n const httpError = new HTTPError(\n error instanceof Error ? error.message : \"An unknown error occurred\",\n 500\n );\n\n // Log the error\n logger.error(\"Error>>Unknown\", {\n message: httpError.message,\n status: httpError.status,\n });\n\n throw httpError;\n }\n}\n","import logger from \"../reporting-service/logger\";\nimport { ERPObjType, ERPType } from \"../../types/erp-types\";\nimport { MMReceiveLaborTicket } from \"./types/receive-types\";\nimport { MMTokenManager } from \"./token-mgr\";\nimport * as MM_SEND_TYPES from \"./types/send-types\";\nimport {\n HTTPClient,\n HTTPMethod,\n HTTPRequestConfig,\n HTTPClientFactory,\n} from \"../../utils/http-client\";\nimport { Checkpoint } from \"./types/checkpoint\";\nimport { CoreConfiguration } from \"../data-sync-service/configuration-manager\";\nimport { ErrorHandler } from \"../erp-api-services/errors\";\nimport {\n MMApiBaseResponse,\n MMGraphQLResourceResponse,\n MMMachineGroupsResponse,\n} from \"./types/mm-response-interfaces\";\n\nconst MAPPING = \"MAPPING\";\nconst CHECKPOINTS = \"CHECKPOINTS\";\nconst MACHINE_GROUPS = \"MACHINE_GROUPS\";\nconst GRAPHQL = \"GRAPHQL\";\n\nenum UrlBase {\n ErpApiSvcBase = \"ErpApiSvcBase\",\n ApiBase = \"ApiBase\",\n}\n\n/**\n * Class to manage interactions with the MM Mapping Service\n * Integrates an MM Token Manager to handle the API token.\n */\nexport class MMApiClient {\n tokenMgr: MMTokenManager;\n api: HTTPClient;\n\n private baseUrls: Record<UrlBase, string>;\n\n resourceURLs = {\n [ERPObjType.RESOURCES]: \"/erp/v1/resources\",\n [ERPObjType.PARTS]: \"/erp/v1/parts\",\n [ERPObjType.PART_OPERATION]: \"/erp/v1/part-operations\",\n [ERPObjType.WORK_ORDERS]: \"/erp/v1/production-orders\",\n [ERPObjType.WORK_ORDER_OPERATIONS]: \"/erp/v1/production-order-operations\",\n [ERPObjType.PERSONS]: \"/erp/v1/persons\",\n [ERPObjType.REASONS]: \"/erp/v1/reasons\",\n [ERPObjType.LABOR_TICKETS]: \"/erp/v1/labor-tickets\",\n [MAPPING]: \"/erp/v1/mapping\",\n [CHECKPOINTS]: \"/erp/v1/checkpoints\",\n [MACHINE_GROUPS]: \"/machine-groups\",\n [GRAPHQL]: \"/proxy/graphql\",\n };\n\n constructor() {\n this.tokenMgr = new MMTokenManager();\n this.baseUrls = {\n [UrlBase.ErpApiSvcBase]: CoreConfiguration.inst().mmERPSvcApiBaseUrl,\n [UrlBase.ApiBase]: CoreConfiguration.inst().mmApiBaseUrl,\n };\n this.api = HTTPClientFactory.getInstance({\n baseUrl: '',\n retryAttempts: CoreConfiguration.inst().mmApiRetryAttempts,\n });\n }\n\n //#region Private Methods\n private async executeWithAuthRetry<T>(\n operation: (token: string) => Promise<T>,\n options: { token?: string } = {}\n ): Promise<T> {\n let token = options.token || (await this.tokenMgr.getToken());\n\n try {\n return await operation(token);\n } catch (error: unknown) {\n // Type guard to check if error has status property\n const hasStatus = (err: unknown): err is { status: number } => {\n return typeof err === \"object\" && err !== null && \"status\" in err;\n };\n\n // Check if this looks like an auth error - only retry on explicit auth status codes\n const isAuthError =\n hasStatus(error) && (error.status === 401 || error.status === 403);\n\n if (isAuthError && !options.token) {\n // Only retry if we used cached token\n logger.info(\"Retrying request with fresh token due to auth error\");\n this.tokenMgr.invalidateToken();\n token = await this.tokenMgr.getToken();\n return await operation(token); // Single retry\n }\n\n throw error; // Re-throw if not auth error or already retried\n }\n }\n\n /**\n * Fetch data from the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n * Flags:\n */\n private async getData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n queryParams: { [key: string]: string } = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...queryParams,\n ...(baseUrl === UrlBase.ErpApiSvcBase ? { raw: \"true\" } : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const result = await this.api.request<object>({\n url: fullUrl,\n method: \"GET\" as HTTPMethod,\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n });\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Send data to the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n * Flags:\n * - 'raw' = true and 'dedupe' = true will be set for MM's ERP API url\n */\n private async postData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n data: object = {},\n queryParams: { [key: string]: string } = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...queryParams,\n ...(baseUrl === UrlBase.ErpApiSvcBase\n ? { dedupe: \"true\", raw: \"true\" }\n : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const request: HTTPRequestConfig = {\n url: fullUrl,\n method: \"POST\",\n data: JSON.stringify(data),\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n };\n\n const result = await this.api.request<object>(request);\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Delete data from the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n */\n private async deleteData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n data: object = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...(baseUrl === UrlBase.ErpApiSvcBase ? { raw: \"true\" } : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const result = await this.api.request<object>({\n url: fullUrl,\n method: \"DELETE\",\n data,\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n });\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Patch data to the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n */\n private async patchData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n data: object = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...(baseUrl === UrlBase.ErpApiSvcBase ? { raw: \"true\" } : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const request: HTTPRequestConfig = {\n url: fullUrl,\n method: \"PATCH\",\n data,\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n };\n\n const result = await this.api.request<object>(request);\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n private async graphqlRequest(\n operationName: string,\n query: string\n ): Promise<MMApiBaseResponse> {\n try {\n return await this.postData(\n this.resourceURLs[GRAPHQL],\n { operationName, query },\n {},\n {\n baseUrl: UrlBase.ApiBase,\n token: CoreConfiguration.inst().mmApiAuthToken,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Fetch a checkpoint for a specific system, table, and checkpoint type\n * @param checkpoint The checkpoint to fetch\n * @returns Promise with the checkpoint data\n */\n private async fetchCheckpoint(\n checkpoint: Checkpoint\n ): Promise<MMApiBaseResponse> {\n const { system, table, checkpointType } = checkpoint;\n return this.getData(this.resourceURLs[CHECKPOINTS], {\n system,\n table,\n checkpointType,\n });\n }\n\n //#endregion private methods\n\n //#region Public Methods\n /**\n * Send resources to the MM API\n * @param resources Array of resources to send\n * @returns Promise with the API response\n */\n async sendResourcesToMM(\n resources: MM_SEND_TYPES.MMSendResource[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.RESOURCES], {\n data: resources.map((resource) => resource.toRESTApiObject()),\n });\n }\n\n /**\n * Send parts to the MM API\n * @param parts Array of parts to send\n * @returns Promise with the API response\n */\n async sendPartsToMM(\n parts: MM_SEND_TYPES.MMSendPart[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.PARTS], {\n data: parts.map((part) => part.toRESTApiObject()),\n });\n }\n\n /**\n * Send part operations to the MM API\n * @param operations Array of part operations to send\n * @returns Promise with the API response\n */\n async sendPartOperationsToMM(\n operations: MM_SEND_TYPES.MMSendPartOperation[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.PART_OPERATION], {\n data: operations.map((operation) => operation.toRESTApiObject()),\n });\n }\n\n /**\n * Send work orders to the MM API\n * @param workOrders Array of work orders to send\n * @returns Promise with the API response\n */\n async sendWorkOrdersToMM(\n workOrders: MM_SEND_TYPES.MMSendWorkOrder[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.WORK_ORDERS], {\n data: workOrders.map((workOrder) => workOrder.toRESTApiObject()),\n });\n }\n\n /**\n * Send work order operations to the MM API\n * @param workOrderOperations Array of work order operations to send\n * @returns Promise with the API response\n */\n async sendWorkOrderOperationsToMM(\n workOrderOperations: MM_SEND_TYPES.MMSendWorkOrderOperation[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(\n this.resourceURLs[ERPObjType.WORK_ORDER_OPERATIONS],\n {\n data: workOrderOperations.map((operation) =>\n operation.toRESTApiObject()\n ),\n }\n );\n }\n\n /**\n * Send persons to the MM API\n * @param persons Array of persons to send\n * @returns Promise with the API response\n */\n async sendPersonsToMM(\n persons: MM_SEND_TYPES.MMSendPerson[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.PERSONS], {\n data: persons.map((person) => person.toRESTApiObject()),\n });\n }\n\n /**\n * Send reasons to the MM API\n * @param reasons Array of reasons to send\n * @returns Promise with the API response\n */\n async sendReasonsToMM(\n reasons: MM_SEND_TYPES.MMSendReason[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.REASONS], {\n data: reasons.map((reason) => reason.toRESTApiObject()),\n });\n }\n\n /**\n * Send labor tickets to the MM API\n * @param laborTickets Array of labor tickets to send\n * @returns Promise with the API response\n */\n async sendLaborTicketsToMM(\n laborTickets: MM_SEND_TYPES.MMSendLaborTicket[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.LABOR_TICKETS], {\n data: laborTickets.map((ticket) => ticket.toRESTApiObject()),\n });\n }\n\n /**\n * Delete labor tickets from the MM API\n * @param laborTickets Array of labor ticket records to delete\n * @returns Promise with the API response\n */\n async deleteLaborTickets(\n laborTickets: Record<string, string>[]\n ): Promise<MMApiBaseResponse> {\n logger.debug(\"deleteLaborTickets:\", { laborTickets });\n return await this.deleteData(this.resourceURLs[ERPObjType.LABOR_TICKETS], {\n laborTickets,\n });\n }\n\n /**\n * Fetch transformed labor tickets from the MM API\n * @returns Promise with the transformed labor tickets\n */\n async fetchTransformedLaborTickets(): Promise<MMApiBaseResponse> {\n return await this.getData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/export`\n );\n }\n\n /**\n * Fetch labor ticket updates from the MM API\n * @param query Query parameters for filtering updates\n * @returns Promise with an array of labor ticket updates\n */\n async fetchLaborTicketUpdates(\n query: Record<string, string>\n ): Promise<MMReceiveLaborTicket[]> {\n const updates = (await this.getData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/export/updates`,\n query\n )) as { data: MMReceiveLaborTicket[] };\n return updates.data.map((ticket) => new MMReceiveLaborTicket(ticket));\n }\n\n /**\n * Fetch a checkpoint for a specific system, table, and checkpoint type\n * @param checkpoint The checkpoint to fetch\n * @returns Promise with the checkpoint data\n */\n async getCheckpoint(checkpoint: Checkpoint): Promise<MMApiBaseResponse> {\n return await this.fetchCheckpoint(checkpoint);\n }\n\n /**\n * Save a checkpoint to the MM API\n * @param checkpoint The checkpoint to save\n * @returns Promise with the API response\n */\n async saveCheckpoint(checkpoint: Checkpoint): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[CHECKPOINTS], checkpoint);\n }\n\n /**\n * Initialize a checkpoint for a specific system, table, and checkpoint type\n * @param checkpoint The checkpoint to initialize\n * @returns Promise with the checkpoint data\n */\n async initializeCheckpoint(checkpoint: Checkpoint): Promise<void> {\n const currentCheckpoint = await this.fetchCheckpoint(checkpoint);\n\n logger.info(\"currentCheckpoint:\", { currentCheckpoint });\n logger.info(\"currentCheckpoint keys:\", {\n keys: Object.keys(currentCheckpoint || {}),\n });\n\n // Check if we have a meaningful checkpoint response\n // The API returns either:\n // - Empty: just { httpStatus: 200 }\n // - With data: { timestamp: \"2025-08-08T18:53:14.295Z\", httpStatus: 200 }\n const checkpointResponse = currentCheckpoint as any;\n const hasCheckpointData =\n checkpointResponse && checkpointResponse.timestamp;\n\n if (!hasCheckpointData) {\n logger.info(\"No checkpoint data found, initializing checkpoint\");\n const saveCheckpoint = await this.saveCheckpoint(checkpoint);\n logger.info(\"saveCheckpoint:\", { saveCheckpoint });\n } else {\n logger.info(\"Existing checkpoint found:\", {\n timestamp: checkpointResponse.timestamp,\n });\n }\n }\n\n /**\n * Send data to MM API based on the object type\n * @param type The type of ERP object to send\n * @param objects Array of objects to send\n * @returns Promise with the API response including affected rows count\n */\n public async sendDataToMMByType(\n type: ERPObjType,\n objects: MM_SEND_TYPES.IToRESTApiObject[]\n ): Promise<MMApiBaseResponse> {\n switch (type) {\n case ERPObjType.PERSONS:\n return await this.sendPersonsToMM(\n objects as MM_SEND_TYPES.MMSendPerson[]\n );\n case ERPObjType.RESOURCES:\n return await this.sendResourcesToMM(\n objects as MM_SEND_TYPES.MMSendResource[]\n );\n case ERPObjType.PARTS:\n return await this.sendPartsToMM(objects as MM_SEND_TYPES.MMSendPart[]);\n case ERPObjType.PART_OPERATION:\n return await this.sendPartOperationsToMM(\n objects as MM_SEND_TYPES.MMSendPartOperation[]\n );\n case ERPObjType.WORK_ORDERS:\n return await this.sendWorkOrdersToMM(\n objects as MM_SEND_TYPES.MMSendWorkOrder[]\n );\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return await this.sendWorkOrderOperationsToMM(\n objects as MM_SEND_TYPES.MMSendWorkOrderOperation[]\n );\n case ERPObjType.REASONS:\n return await this.sendReasonsToMM(\n objects as MM_SEND_TYPES.MMSendReason[]\n );\n case ERPObjType.LABOR_TICKETS:\n return await this.sendLaborTicketsToMM(\n objects as MM_SEND_TYPES.MMSendLaborTicket[]\n );\n default:\n throw new Error(`Unsupported type: ${ERPObjType[type]}`);\n }\n }\n\n /**\n * Update the labor ticket ERP ID by laborTicketRef\n * @param laborTicketRef The MM API labor ticket unique ID\n * @param erpObjectId The ERP labor ticket ID to update\n * @returns The updated labor ticket\n */\n async updateLaborTicketIdByRef(\n laborTicketRef: string,\n laborTicketId: string\n ): Promise<MMApiBaseResponse> {\n return await this.patchData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/${laborTicketRef}`,\n { laborTicketId }\n );\n }\n\n /**\n * Add failed labor ticket refs to the MM API\n * @param failedTicketRefs The failed labor ticket references\n * @returns The response from the MM API\n */\n async addFailedLaborTicketRefs(\n system: ERPType,\n failedTicketRefs: string[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/failed`,\n { failedTicketRefs },\n { system }\n );\n }\n\n async fetchFailedLaborTickets(\n system: ERPType\n ): Promise<MMReceiveLaborTicket[]> {\n const failedTickets = (await this.getData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/failed`,\n { system }\n )) as { erpLaborTickets: MMReceiveLaborTicket[] };\n return failedTickets.erpLaborTickets.map(\n (ticket) => new MMReceiveLaborTicket(ticket)\n );\n }\n\n async deleteFailedLaborTicketIds(\n system: ERPType,\n laborTicketRefs: string[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/failed/remove`,\n { laborTicketRefs },\n { system }\n );\n }\n\n /**\n * Fetch machine groups from the MM API\n * @returns Promise with the machine groups data\n */\n async fetchMachineGroups(): Promise<MMMachineGroupsResponse> {\n return (await this.getData(\n this.resourceURLs[MACHINE_GROUPS],\n {},\n { baseUrl: UrlBase.ApiBase }\n )) as unknown as MMMachineGroupsResponse;\n }\n\n /**\n * Fetch resources using GraphQL\n * @returns Promise with the resources data\n */\n async fetchResourcesFromGraphQL(): Promise<MMGraphQLResourceResponse> {\n return (await this.graphqlRequest(\n \"getErpResources\",\n \"query getErpResources { machineResource: erpResources { machineRef machineGroupId resourceId }}\"\n )) as unknown as MMGraphQLResourceResponse;\n }\n\n /**\n * Cleanup all HTTP connections and resources\n * Call this when the service is no longer needed\n */\n async destroy(): Promise<void> {\n await this.api.destroy();\n // Note: MMTokenManager doesn't currently need explicit cleanup\n // but if it ever acquires resources that need cleanup, add it here\n }\n\n //#endregion public methods\n}\n","/**\n * These represent types of objects that can be sent to the MM API\n * Note that each class also implements a static method to convert from a plain\n * object to a REST API object: e.g.\n * MMSendPerson::fromPlainObject(data: Record<string, string | null>): MMSendPerson\n */\n\nexport interface IToRESTApiObject {\n toRESTApiObject(): Record<string, string | null>;\n}\n\n/**\n * Interface for static factory methods that can reconstruct typed objects\n * from plain data, without validation.\n */\n\nexport class MMSendPerson implements IToRESTApiObject {\n constructor(\n public personId: string,\n public firstName: string,\n public lastName: string,\n public isActive: boolean\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n personId: this.personId,\n firstName: this.firstName,\n lastName: this.lastName,\n isActive: this.isActive ? \"1\" : \"0\",\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendPerson {\n return new MMSendPerson(\n data.personId || \"\",\n data.firstName || \"\",\n data.lastName || \"\",\n data.isActive === \"1\"\n );\n }\n}\n\nexport class MMSendResource implements IToRESTApiObject {\n constructor(\n public resourceId: string, // Unique identifier that the ERP uses to describe a resource\n public name: string, // A colloquial name for the resource, sometimes also just the resource_id\n public isResourceGroup: boolean, // Whether or not this record represents an individual machine/piece of hardware, or a group/type of machines\n public description: string, // Text description of the resource (optional)\n public type: string, // The type of resource (optional)\n public productionBurdenRateHourly: number, // The cost associated with running this machine in production/hour (optional)\n public setupBurdenRateHourly: number // The cost associated with running this machine in setup/hour (optional)\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n resourceId: this.resourceId,\n name: this.name,\n isResourceGroup: this.isResourceGroup ? \"1\" : \"0\",\n description: this.description,\n type: this.type,\n productionBurdenRateHourly: this.productionBurdenRateHourly.toString(),\n setupBurdenRateHourly: this.setupBurdenRateHourly.toString(),\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendResource {\n return new MMSendResource(\n data.resourceId || \"\",\n data.name || \"\",\n data.isResourceGroup === \"1\",\n data.description || \"\",\n data.type || \"\",\n parseFloat(data.productionBurdenRateHourly || \"0\"),\n parseFloat(data.setupBurdenRateHourly || \"0\")\n );\n }\n}\n\nexport class MMSendPart implements IToRESTApiObject {\n constructor(\n public partNumber: string,\n public partRevision: string,\n public method: string\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n partNumber: this.partNumber,\n partRevision: this.partRevision,\n method: this.method,\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendPart {\n return new MMSendPart(\n data.partNumber || \"\",\n data.partRevision || \"\",\n data.method || \"\"\n );\n }\n}\n\nexport class MMSendPartOperation implements IToRESTApiObject {\n constructor(\n public partNumber: string,\n public partRevision: string,\n public method: string,\n public sequenceNumber: string,\n public resourceId: string,\n public cycleTimeMs: number,\n public setupTimeMs: number,\n public description: string,\n public quantityPerPart: number\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n partNumber: this.partNumber,\n partRevision: this.partRevision,\n method: this.method,\n sequenceNumber: this.sequenceNumber,\n resourceId: this.resourceId,\n cycleTimeMs: this.cycleTimeMs.toString(),\n setupTimeMs: this.setupTimeMs.toString(),\n description: this.description,\n quantityPerPart: this.quantityPerPart.toString(),\n };\n }\n\n static fromPlainObject(\n data: Record<string, string | null>\n ): MMSendPartOperation {\n return new MMSendPartOperation(\n data.partNumber || \"\",\n data.partRevision || \"\",\n data.method || \"\",\n data.sequenceNumber || \"\",\n data.resourceId || \"\",\n parseInt(data.cycleTimeMs || \"0\"),\n parseInt(data.setupTimeMs || \"0\"),\n data.description || \"\",\n parseFloat(data.quantityPerPart || \"1\")\n );\n }\n}\n\nexport class MMSendWorkOrder implements IToRESTApiObject {\n constructor(\n public workOrderId: string,\n public lot: string,\n public split: string,\n public sub: string,\n public status: string,\n public dueDate: string | null,\n public description: string,\n public scheduledStartDate: string | null,\n public scheduledEndDate: string | null,\n public closedDate: string | null,\n public quantityRequired: number,\n public partNumber: string,\n public partRevision: string,\n public method: string\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n workOrderId: this.workOrderId,\n lot: this.lot,\n split: this.split,\n sub: this.sub,\n status: this.status,\n dueDate: this.dueDate,\n description: this.description,\n scheduledStartDate: this.scheduledStartDate,\n scheduledEndDate: this.scheduledEndDate,\n closedDate: this.closedDate,\n quantityRequired: this.quantityRequired.toString(),\n partNumber: this.partNumber,\n partRevision: this.partRevision,\n method: this.method,\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendWorkOrder {\n return new MMSendWorkOrder(\n data.workOrderId || \"\",\n data.lot || \"\",\n data.split || \"\",\n data.sub || \"\",\n data.status || \"\",\n data.dueDate ?? null,\n data.description || \"\",\n data.scheduledStartDate ?? null,\n data.scheduledEndDate ?? null,\n data.closedDate ?? null,\n parseFloat(data.quantityRequired || \"0\"),\n data.partNumber || \"\",\n data.partRevision || \"\",\n data.method || \"\"\n );\n }\n}\n\nexport class MMSendWorkOrderOperation implements IToRESTApiObject {\n constructor(\n public workOrderId: string,\n public lot: string,\n public split: string,\n public sub: string,\n public sequenceNumber: string,\n public resourceId: string,\n public startQuantity: number,\n public finishQuantity: number,\n public expectedRejectRate: number,\n public scheduledStartDate: string | null,\n public scheduledFinishDate: string | null,\n public closedDate: string | null,\n public cycleTimeMs: number,\n public setupTimeMs: number,\n public productionburdenRateHourly: number,\n public setupburdenRatehourly: number,\n public operationType: string,\n public quantityPerPart: number,\n public status: string\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n workOrderId: this.workOrderId,\n lot: this.lot,\n split: this.split,\n sub: this.sub,\n sequenceNumber: this.sequenceNumber,\n resourceId: this.resourceId,\n startQuantity: this.startQuantity.toString(),\n finishQuantity: this.finishQuantity.toString(),\n expectedRejectRate: this.expectedRejectRate.toString(),\n scheduledStartDate: this.scheduledStartDate,\n scheduledFinishDate: this.scheduledFinishDate,\n closedDate: this.closedDate,\n cycleTimeMs: this.cycleTimeMs.toString(),\n setupTimeMs: this.setupTimeMs.toString(),\n productionburdenRateHourly: this.productionburdenRateHourly.toString(),\n setupburdenRatehourly: this.setupburdenRatehourly.toString(),\n operationType: this.operationType,\n quantityPerPart: this.quantityPerPart.toString(),\n status: this.status,\n };\n }\n\n static fromPlainObject(\n data: Record<string, string | null>\n ): MMSendWorkOrderOperation {\n return new MMSendWorkOrderOperation(\n data.workOrderId || \"\",\n data.lot || \"\",\n data.split || \"\",\n data.sub || \"\",\n data.sequenceNumber || \"\",\n data.resourceId || \"\",\n parseFloat(data.startQuantity || \"0\"),\n parseFloat(data.finishQuantity || \"0\"),\n parseFloat(data.expectedRejectRate || \"0\"),\n data.scheduledStartDate ?? null,\n data.scheduledFinishDate ?? null,\n data.closedDate ?? null,\n parseInt(data.cycleTimeMs || \"0\"),\n parseInt(data.setupTimeMs || \"0\"),\n parseFloat(data.productionburdenRateHourly || \"0\"),\n parseFloat(data.setupburdenRatehourly || \"0\"),\n data.operationType || \"\",\n parseFloat(data.quantityPerPart || \"1\"),\n data.status || \"\"\n );\n }\n}\n\nexport class MMSendReason implements IToRESTApiObject {\n constructor(\n public reasonId: string,\n public category: string,\n public code: string,\n public description: string,\n public entityType: string\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n reasonId: this.reasonId,\n category: this.category,\n code: this.code,\n description: this.description,\n entityType: this.entityType,\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendReason {\n return new MMSendReason(\n data.reasonId || \"\",\n data.category || \"\",\n data.code || \"\",\n data.description || \"\",\n data.entityType || \"\"\n );\n }\n}\n\nexport class MMSendLaborTicket implements IToRESTApiObject {\n constructor(\n public workOrderId: string,\n public lot: string,\n public split: string,\n public sub: string,\n public sequenceNumber: string,\n public resourceId: string,\n public personId: string,\n public laborTicketId: string,\n public transactionDate: string | null,\n public clockIn: string | null,\n public clockOut: string | null,\n public goodParts: number,\n public badParts: number,\n public type: string,\n public comment: string,\n public state: string\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n workOrderId: this.workOrderId,\n lot: this.lot,\n split: this.split,\n sub: this.sub,\n sequenceNumber: this.sequenceNumber,\n resourceId: this.resourceId,\n personId: this.personId,\n laborTicketId: this.laborTicketId,\n transactionDate: this.transactionDate,\n clockIn: this.clockIn,\n clockOut: this.clockOut,\n goodParts: this.goodParts.toString(),\n badParts: this.badParts.toString(),\n type: this.type,\n comment: this.comment,\n state: this.state,\n };\n }\n\n static fromPlainObject(\n data: Record<string, string | null>\n ): MMSendLaborTicket {\n return new MMSendLaborTicket(\n data.workOrderId || \"\",\n data.lot || \"\",\n data.split || \"\",\n data.sub || \"\",\n data.sequenceNumber || \"\",\n data.resourceId || \"\",\n data.personId || \"\",\n data.laborTicketId || \"\",\n data.transactionDate ?? null,\n data.clockIn ?? null,\n data.clockOut ?? null,\n parseInt(data.goodParts || \"0\"),\n parseInt(data.badParts || \"0\"),\n data.type || \"\",\n data.comment || \"\",\n data.state || \"\"\n );\n }\n}\n\n/**\n * Flattened interface for Work Order related entities that maintains referential integrity\n * by processing parts, part operations, work orders, and work order operations together\n */\nexport interface MMSendWorkOrderBatch {\n parts: MMSendPart[];\n partOperations: MMSendPartOperation[];\n workOrders: MMSendWorkOrder[];\n workOrderOperations: MMSendWorkOrderOperation[];\n}\n","/**\n * Extracts unique rows from data based on specified fields and sorts by up to two fields\n * @param data Array of data objects\n * @param fields Array of field names to use as a unique keys\n * @param sortFields Optional array of field names to sort by (up to two fields)\n * @returns Array of unique objects based on the specified fields, or an empty array if data is empty\n */\nexport function getUniqueRows<T extends Record<string, unknown>>(\n data: T[],\n fields: (keyof T)[],\n sortFields?: (keyof T)[]\n): T[] {\n const createCompositeKey = (item: T): string => {\n return fields.map((field) => String(item[field])).join(\"|\");\n };\n\n const uniqueKeys = new Set<string>();\n const uniqueRows: T[] = [];\n\n data.forEach((item) => {\n const key = createCompositeKey(item);\n if (!uniqueKeys.has(key)) {\n uniqueKeys.add(key);\n uniqueRows.push(item);\n }\n });\n\n if (sortFields && sortFields.length > 0) {\n uniqueRows.sort((a, b) => {\n for (let i = 0; i < sortFields.length; i++) {\n const field = sortFields[i];\n if (a[field] < b[field]) return -1;\n if (a[field] > b[field]) return 1;\n }\n return 0;\n });\n }\n\n return uniqueRows || [];\n}\n","import { ERPObject } from \"../types/erp-types\";\n\n/**\n * Retain only the fields listed in retainFields[] in the payload\n */\nexport const removeExtraneousFields = (\n recordset: ERPObject[],\n retainFields: string[]\n): ERPObject[] => {\n const data: ERPObject[] =\n recordset.map((row) => {\n const transformedRow: ERPObject = {};\n Object.keys(row).forEach((key) => {\n if (retainFields.includes(key)) {\n transformedRow[key] = row[key]?.toString() || \"\";\n }\n });\n return transformedRow;\n }) || [];\n\n return data;\n};\n","import { ERPObject } from \"../types/erp-types\";\n\n/**\n * Remove all fields listed in idField[] the from the payload\n */\nexport const getPayloadWithoutIDField = (\n recordset: ERPObject[],\n idField: string[]\n): ERPObject[] => {\n const data: ERPObject[] =\n recordset.map((row) => {\n const transformedRow: ERPObject = {};\n Object.keys(row).forEach((key) => {\n if (!idField.includes(key)) {\n transformedRow[key] = row[key]?.toString() || \"\";\n }\n });\n return transformedRow;\n }) || [];\n\n return data;\n};\n","/**\n * Trims all string values in an object while preserving the object's structure\n */\nexport const trimObjectValues = <T extends object>(obj: T): T => {\n return Object.keys(obj).reduce((acc, key) => {\n const value = obj[key as keyof T];\n acc[key as keyof T] = (\n typeof value === \"string\" ? value.trim() : value\n ) as T[keyof T];\n return acc;\n }, {} as T);\n};\n","export const cleanupNumbers = (data: string) => {\n // eslint-disable-next-line no-useless-escape\n data = data.toString().replace(/[^0-9\\.]+/g, \"\");\n return data;\n};\n","/**\n * Add a new field to the data from an external source by matching on the same field name\n * @param data The data to add the new field to\n * @param externalSource The external source to get the new field from\n * @param externalSourceFieldName The field in both data and external source to match on\n * @param newFieldName The name of the new field to add\n * @param defaultValue The default value to use if there is no match\n */\nexport const addNewFieldFromExternalSource = (\n data: Record<string, string>[],\n externalSource: Record<string, string>[],\n externalSourceFieldName: string,\n newFieldName: string,\n defaultValue: string = \"-\"\n): Record<string, string>[] => {\n return data.map((current) => {\n const cacheEntry = externalSource.find(\n (existing) =>\n existing[externalSourceFieldName] === current[externalSourceFieldName]\n );\n const newFieldValue = cacheEntry?.[newFieldName] || defaultValue;\n\n return {\n ...current,\n [newFieldName]: newFieldValue,\n };\n });\n};\n\n/**\n * Add a new field to the data from an external source by matching on different field names\n * @param data The data to add the new field to\n * @param externalSource The external source to get the new field from\n * @param lookupField The field in the external source to match on\n * @param currentField The field in the current data to match on\n * @param newFieldName The name of the new field to add\n * @param defaultValue The default value to use if there is no match\n */\nexport const addNewFieldFromLookupField = (\n data: Record<string, string>[],\n externalSource: Record<string, string>[],\n lookupField: string,\n currentField: string,\n newFieldName: string,\n defaultValue: string = \"-\"\n): Record<string, string>[] => {\n return data.map((current) => {\n const cacheEntry = externalSource.find(\n (existing) => existing[lookupField] === current[currentField]\n );\n const newFieldValue = cacheEntry?.[currentField] || defaultValue;\n\n return {\n ...current,\n [newFieldName]: newFieldValue,\n };\n });\n};\n","import { CoreConfiguration } from \"../services/data-sync-service/configuration-manager\";\nimport { HTTPClientFactory } from \"./http-client\";\n\n/**\n * Gets the timezone offset in hours for the company's timezone\n * @returns Promise<number> The timezone offset in hours\n * @throws Error if unable to fetch timezone information\n */\nexport const getTimezoneOffset = async (): Promise<number> => {\n try {\n // Get the timezone from configuration\n const config = CoreConfiguration.inst();\n const apiUrl = config.mmApiBaseUrl;\n const authToken = config.mmApiAuthToken;\n\n if (!apiUrl || !authToken) {\n throw new Error(\"Missing required configuration for timezone fetch\");\n }\n\n // Create HTTP client\n const client = HTTPClientFactory.getInstance({\n baseUrl: apiUrl,\n retryAttempts: config.mmApiRetryAttempts,\n });\n\n // Fetch user/company information from the API\n const response = await client.request<{ company: { timezone: string } }>({\n url: \"/accounts/current\",\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${authToken}`,\n },\n });\n\n const userInfo = response.data;\n if (!userInfo?.company?.timezone) {\n throw new Error(\"Unable to retrieve company timezone from API\");\n }\n\n // Calculate the timezone offset\n const date = new Date();\n const utcDate = new Date(date.toLocaleString(\"en-US\", { timeZone: \"UTC\" }));\n const tzDate = new Date(\n date.toLocaleString(\"en-US\", { timeZone: userInfo.company.timezone })\n );\n\n // Return offset in hours\n return (tzDate.getTime() - utcDate.getTime()) / 3600000;\n } catch (error) {\n throw new Error(\n `Failed to get timezone offset: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n};\n\n/**\n * Converts a UTC/Zulu time to local time based on the provided timezone offset\n * @param zuluTime The UTC/Zulu time to convert\n * @param timezoneOffset The timezone offset in hours\n * @returns The converted local time, or undefined if input is null/undefined\n */\nexport const convertToLocalTime = (\n zuluTime: string | Date | null | undefined,\n timezoneOffset: number\n): Date | undefined => {\n if (!zuluTime) return undefined;\n const date = new Date(zuluTime);\n return new Date(date.getTime() + timezoneOffset * 60 * 60 * 1000);\n};\n\n/**\n * Formats a date with the timezone offset in ISO format with offset\n * @param date The date string in format YYYY-MM-DD HH:mm:ss or YYYY-MM-DDTHH:mm:ss\n * @param timezoneOffset The timezone offset in hours\n * @returns The formatted date string in format: YYYY-MM-DDTHH:mm:ss+/-HH:MM\n */\nexport const formatDateWithTZOffset = (\n date: string | null | undefined,\n timezoneOffset: number\n): string | undefined => {\n if (!date) return undefined;\n\n // Replace space with T if present\n const isoDate = date.replace(\" \", \"T\");\n\n // Calculate offset components\n const sign = timezoneOffset >= 0 ? \"+\" : \"-\";\n const absOffset = Math.abs(timezoneOffset);\n const hours = Math.floor(absOffset).toString().padStart(2, \"0\");\n const minutes = Math.floor((absOffset % 1) * 60)\n .toString()\n .padStart(2, \"0\");\n\n // Append the timezone offset\n return `${isoDate}${sign}${hours}:${minutes}`;\n};\n","import logger from \"../services/reporting-service/logger\";\nimport { setTimezoneOffsetInCache } from \"./local-data-store/jobs-shared-data\";\nimport {\n convertToLocalTime,\n formatDateWithTZOffset,\n getTimezoneOffset,\n} from \"./timezone\";\n\n/**\n * Calculates the difference in hours between two timestamps\n * @param startTime ISO timestamp string\n * @param endTime ISO timestamp string\n * @param timezoneOffset timezone offset in hours\n * @returns number representing hours difference, rounded to 3 decimal places\n */\nexport function calculateTimeDifferenceInHours(\n startTime: string | null | undefined,\n endTime: string | null | undefined,\n timezoneOffset: number\n): number {\n if (!startTime || !endTime) return 0;\n\n const localStartTime = convertToLocalTime(startTime, timezoneOffset);\n const localEndTime = convertToLocalTime(endTime, timezoneOffset);\n\n if (!localStartTime || !localEndTime) return 0;\n\n // Get hours, minutes, seconds from the Date objects\n const startHours = localStartTime.getHours();\n const startMinutes = localStartTime.getMinutes();\n const startSeconds = localStartTime.getSeconds();\n\n const endHours = localEndTime.getHours();\n const endMinutes = localEndTime.getMinutes();\n const endSeconds = localEndTime.getSeconds();\n\n // Calculate total seconds for each time\n const startTotalSeconds =\n startHours * 3600 + startMinutes * 60 + startSeconds;\n const endTotalSeconds = endHours * 3600 + endMinutes * 60 + endSeconds;\n\n if (endTotalSeconds > startTotalSeconds) {\n return Number(((endTotalSeconds - startTotalSeconds) / 3600).toFixed(3));\n }\n\n return 0;\n}\n\nexport const getSecondsOfDay = (timestamp: string | null) => {\n if (!timestamp) return null;\n const time = new Date(timestamp);\n\n const utcHours = time.getUTCHours();\n const utcMinutes = time.getUTCMinutes();\n const utcSeconds = time.getUTCSeconds();\n\n return (utcHours * 3600 + utcMinutes * 60 + utcSeconds).toString();\n};\n\n/**\n * Apply timezone offsets to specified datetime fields in an object\n * @param item The object to transform\n * @param fields The fields to apply timezone offset to\n * @param timezoneOffset The timezone offset to apply\n * @returns The transformed object\n */\n\nexport const applyTimezoneOffsetsToFields = (\n item: Record<string, string>,\n fields: string[],\n timezoneOffset: number\n): Record<string, string> => {\n const transformed = { ...item };\n fields.forEach((field) => {\n if (transformed[field] && transformed[field].trim()) {\n const formattedDate = formatDateWithTZOffset(\n transformed[field],\n timezoneOffset\n );\n transformed[field] = formattedDate || \"\";\n } else {\n transformed[field] = \"\";\n }\n });\n return transformed;\n};\n\ninterface TimezoneOffsetParams {\n maxRetries: number;\n retryIntervalMs: number;\n}\n\n/**\n * Gets the timezone offset for the company and sets it in the cache\n * The cached offset can be acquired from getCachedTimezoneOffset() in \"./local-data-store/jobs-shared-data\"\n *\n * @param params.maxRetries Maximum number of retry attempts\n * @param params.retryIntervalMs Time to wait between retries in milliseconds\n */\nexport const getTimezoneOffsetAndPersist = async (\n params: TimezoneOffsetParams = {\n maxRetries: 36000, // Retry for 10 hours before giving up.\n retryIntervalMs: 10_000,\n }\n): Promise<void> => {\n let success = false;\n let retries = 0;\n logger.info(\n \"Acquiring the timezone offset from MachineMetrics and storing in cache\"\n );\n while (!success && retries < params.maxRetries) {\n try {\n const offsetHours = await getTimezoneOffset();\n logger.info(`Timezone offset: ${offsetHours} hours`);\n setTimezoneOffsetInCache(offsetHours);\n success = true;\n } catch (error) {\n logger.error(\"Error getting timezone offset:\", error);\n logger.info(`Retrying in ${params.retryIntervalMs / 1000} seconds...`);\n await new Promise((resolve) =>\n setTimeout(resolve, params.retryIntervalMs)\n );\n retries++;\n }\n }\n if (!success) {\n throw new Error(\n `Failed to get the timezone offset after ${params.maxRetries} retries`\n );\n }\n};\n","import knex, { Knex } from \"knex\";\nimport config from \"../../knexfile\";\nimport { ERPObjType } from \"../../types/erp-types\";\n\nconst DEFAULT_RECORD_TRACKING_TABLE_NAME = \"record_tracking\";\n\nexport type RecordTrackingObject = {\n entityType?: ERPObjType;\n lastValue: string; // Typically date/time string\n recordId: string; // A value to disambiguate records with the same lastValue\n};\n\nexport class RecordTrackingManager {\n db: Knex;\n\n constructor() {\n this.db = knex(config.local);\n }\n\n async updateRecord(record: RecordTrackingObject) {\n if (record.lastValue && record.recordId) {\n const recordUpdated = await this.db(DEFAULT_RECORD_TRACKING_TABLE_NAME)\n .where({ entityType: record.entityType })\n .update(record);\n\n if (recordUpdated < 1) {\n await this.db(DEFAULT_RECORD_TRACKING_TABLE_NAME).insert(record);\n }\n }\n }\n\n async getTrackingRecord(type: ERPObjType) {\n return await this.db(DEFAULT_RECORD_TRACKING_TABLE_NAME)\n .select(\"*\")\n .where({ entityType: type.toString() });\n }\n\n async destroy() {\n return this.db.destroy();\n }\n}\n","import { HashedCacheManager } from \"./hashed-cache-manager\";\nimport { ERPObjType } from \"../../types/erp-types\";\n\nexport type BatchResult<T> = {\n duplicates: T[];\n nonDuplicates: T[];\n};\n\ntype BatchCacheManagerOptions = {\n ttl?: number;\n tableName?: string;\n};\n\nexport class BatchCacheManager {\n private cacheManager: HashedCacheManager;\n\n constructor(options?: BatchCacheManagerOptions) {\n this.cacheManager = new HashedCacheManager({\n ttl: options?.ttl,\n tableName: options?.tableName,\n });\n }\n\n /**\n * Checks a batch of objects against the cache and separates them into duplicates and non-duplicates\n * @param type The type of objects\n * @param objects Array of objects to check\n * @returns Object containing arrays of duplicate and non-duplicate objects\n */\n async dedupeBatch(\n type: ERPObjType,\n objects: object[]\n ): Promise<BatchResult<object>> {\n const result: BatchResult<object> = {\n duplicates: [],\n nonDuplicates: [],\n };\n\n // Check each object individually\n for (const object of objects) {\n const hasChanged = await this.cacheManager.hasChanged(type, object);\n\n if (hasChanged) {\n result.nonDuplicates.push(object);\n } else {\n result.duplicates.push(object);\n }\n }\n\n return result;\n }\n\n /**\n * Stores a batch of objects in the cache\n * @param type The type of objects\n * @param objects Array of objects to store\n */\n async storeBatch(\n type: ERPObjType,\n objects: object[]\n ): Promise<{ totalInserted: number }> {\n // Store each object individually\n let totalInserted = 0;\n for (const object of objects) {\n if (await this.cacheManager.store(type, object)) {\n totalInserted++;\n }\n }\n return { totalInserted };\n }\n\n /**\n * Removes objects from the cache\n * @param type The type of objects\n * @param objects Array of objects to remove\n */\n async removeObjects(type: ERPObjType, objects: object[]): Promise<void> {\n // Remove each object individually\n for (const object of objects) {\n await this.cacheManager.removeRecord(type, object);\n }\n }\n\n /**\n * Gets all records of a specific type\n */\n async getRecordsByType(type: ERPObjType): Promise<string[]> {\n return this.cacheManager.getRecordsByType(type);\n }\n\n /**\n * Removes all records of a specific type\n */\n async removeRecordsByType(type: ERPObjType): Promise<void> {\n return this.cacheManager.removeRecordsByType(type);\n }\n\n /**\n * Clears all records from the cache\n */\n async clear(): Promise<void> {\n return this.cacheManager.clear();\n }\n\n /**\n * Cleans up resources\n */\n async destroy(): Promise<void> {\n return this.cacheManager.destroy();\n }\n}\n","import { convertToLocalTime } from \"./timezone\";\nimport { MMReceiveLaborTicket } from \"../services/mm-api-service/types/receive-types\";\n\n/**\n * Apply timezone offsets to datetime fields specifically for the MMApiReceiveLaborTicket object from the Zulu-based MM API\n * (presumably) before sending to the ERP\n * @param laborTicket The MMApiReceiveLaborTicket object to convert\n * @param timezoneOffset The timezone offset to apply\n */\nexport function convertLaborTicketToLocalTimezone(\n laborTicket: MMReceiveLaborTicket,\n timezoneOffset: number\n): MMReceiveLaborTicket {\n const timeFields = [\n \"clockIn\",\n \"clockOut\",\n \"transactionDate\",\n \"createdAt\",\n \"updatedAt\",\n \"workOrderOperationClosedDate\",\n ] as const;\n\n timeFields.forEach((field) => {\n const localTime = convertToLocalTime(laborTicket[field], timezoneOffset);\n laborTicket[field] = localTime?.toISOString() || null;\n });\n return laborTicket;\n}\n","import { ERPType } from \"../../types/erp-types\";\nimport { IERPLaborTicketHandler } from \"../../types/erp-connector\";\nimport { MMApiClient } from \"../../services/mm-api-service/mm-api-service\";\nimport { MMReceiveLaborTicket } from \"../../services/mm-api-service/types/receive-types\";\nimport { convertLaborTicketToLocalTimezone } from \"../mm-labor-ticket-helpers\";\nimport { getCachedTimezoneOffset } from \"../local-data-store/jobs-shared-data\";\nimport logger from \"../../services/reporting-service/logger\";\n\n/**\n * Handles synchronization of labor tickets between MachineMetrics and ERP systems\n */\nexport class LaborTicketERPSynchronizer {\n /**\n * Synchronizes updated labor tickets from MachineMetrics to an ERP system\n */\n static async syncToERP(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n try {\n const mmApiClient = new MMApiClient();\n const failedLaborTicketRefs: string[] = [];\n\n await mmApiClient.initializeCheckpoint({\n system: connectorType,\n table: \"labor_tickets\",\n checkpointType: \"export\",\n checkpointValue: {\n timestamp: new Date().toISOString(),\n },\n });\n\n const fallbackTimestamp = new Date().toISOString();\n const laborTicketsUpdates = await mmApiClient.fetchLaborTicketUpdates({\n system: connectorType,\n checkpointType: \"export\",\n });\n\n if (laborTicketsUpdates.length === 0) {\n logger.info(\"syncLaborTicketsToERP:No updated labor tickets found\");\n return;\n }\n\n logger.info(\n `ToERP: Found ${laborTicketsUpdates.length} Labor Ticket Ids and Refs to process`,\n {\n laborTickets: laborTicketsUpdates.map(\n (ticket: MMReceiveLaborTicket) => ({\n ref: ticket.laborTicketRef,\n id: ticket.laborTicketId,\n })\n ),\n }\n );\n\n // Find the most recent updatedAt timestamp from labor tickets. This will be used to update\n // the checkpoint to ensure there is no gap of time for the next sync.\n const mostRecentUpdate = laborTicketsUpdates.reduce(\n (latest: string | null, ticket: MMReceiveLaborTicket) => {\n if (!latest || !ticket.updatedAt) return latest;\n return new Date(ticket.updatedAt) > new Date(latest)\n ? ticket.updatedAt\n : latest;\n },\n null as string | null\n );\n\n await Promise.all(\n laborTicketsUpdates.map(async (laborTicket: MMReceiveLaborTicket) => {\n if (!laborTicket.laborTicketRef) {\n logger.error(\n \"syncLaborTicketsToERP: laborTicketRef is not set for laborTicket pulled from MM:\",\n { laborTicket }\n );\n return undefined;\n }\n\n try {\n return await this.processLaborTicket(\n connector,\n mmApiClient,\n laborTicket\n );\n } catch (error) {\n failedLaborTicketRefs.push(laborTicket.laborTicketRef);\n logger.error(\n `syncLaborTicketsToERP: Error processing laborTicketRef ${laborTicket.laborTicketRef}:`,\n { error }\n );\n return undefined;\n }\n })\n );\n\n logger.info(\n `syncLaborTicketsToERP: ${failedLaborTicketRefs.length} failed labor ticket ids`\n );\n if (failedLaborTicketRefs.length > 0) {\n logger.info(\n `syncLaborTicketsToERP: Reporting ${failedLaborTicketRefs.length} labor ticket failures:`,\n {\n failedLaborTicketRefs,\n }\n );\n const addFailedResult = await mmApiClient.addFailedLaborTicketRefs(\n connectorType,\n failedLaborTicketRefs\n );\n logger.info(\"syncLaborTicketsToERP: addFailedResult:\", {\n addFailedResult,\n });\n }\n\n mmApiClient.saveCheckpoint({\n system: connectorType,\n table: \"labor_tickets\",\n checkpointType: \"export\",\n checkpointValue: {\n timestamp: mostRecentUpdate || fallbackTimestamp,\n },\n });\n } catch (error) {\n logger.error(\"syncLaborTicketsToERP: Error:\", error);\n }\n }\n\n /**\n * Retries labor tickets that have failed to be created or updated in the ERP during the sync\n */\n static async retryFailed(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n try {\n const mmApiClient = new MMApiClient();\n const successLaborTicketIds: string[] = [];\n\n const laborTickets =\n await mmApiClient.fetchFailedLaborTickets(connectorType);\n if (laborTickets.length === 0) {\n logger.info(\"retryFailedLaborTickets: No failed labor tickets found\");\n return;\n }\n logger.info(\n \"retryFailedLaborTickets: Failed Labor Tickets count:\" +\n laborTickets.length\n );\n\n await Promise.all(\n laborTickets.map(async (laborTicket: MMReceiveLaborTicket) => {\n if (!laborTicket.laborTicketRef) {\n logger.error(\n \"retryFailedLaborTickets: laborTicketRef is not set for laborTicket pulled from MM:\",\n { laborTicket }\n );\n return undefined;\n }\n\n try {\n const laborTicketResult = await this.processLaborTicket(\n connector,\n mmApiClient,\n laborTicket\n );\n successLaborTicketIds.push(laborTicket.laborTicketRef);\n return laborTicketResult;\n } catch (error) {\n logger.error(\n \"retryFailedLaborTickets: Error processing laborTicketRef:\",\n { laborTicketRef: laborTicket.laborTicketRef, error }\n );\n return undefined;\n }\n })\n );\n\n if (successLaborTicketIds.length > 0) {\n logger.info(\"Deleting failed labor ticket ids:\", {\n successLaborTicketIds,\n });\n const deleteFailedResult = await mmApiClient.deleteFailedLaborTicketIds(\n connectorType,\n successLaborTicketIds\n );\n logger.info(\"deleteFailedResult:\", { deleteFailedResult });\n }\n } catch (error) {\n logger.error(\"retryFailedLaborTickets: Error:\", error);\n }\n }\n\n // ============================================================================\n // PRIVATE HELPER METHODS\n // ============================================================================\n\n private static async writeLaborTicketIdToMM(\n mmApiClient: MMApiClient,\n laborTicket: MMReceiveLaborTicket,\n laborTicketResult: MMReceiveLaborTicket\n ): Promise<void> {\n const updateRefAPIResponse = await mmApiClient.updateLaborTicketIdByRef(\n laborTicket.laborTicketRef,\n laborTicketResult.laborTicketId\n );\n logger.info(\n `Updated laborTicketId ${laborTicketResult.laborTicketId} for laborTicketRef ${laborTicket.laborTicketRef} in MM:`,\n { updateRefAPIResponse }\n );\n }\n\n private static async processLaborTicket(\n connector: IERPLaborTicketHandler,\n mmApiClient: MMApiClient,\n laborTicket: MMReceiveLaborTicket\n ): Promise<MMReceiveLaborTicket> {\n let laborTicketResult: MMReceiveLaborTicket;\n\n laborTicketResult = convertLaborTicketToLocalTimezone(\n laborTicket,\n getCachedTimezoneOffset()\n );\n\n logger.info(\n `processing laborTicket, id=${laborTicket.laborTicketId}, ref=${laborTicket.laborTicketRef}`\n );\n logger.debug({ laborTicket });\n\n // MLW TODO: Should we always swap out the resource ID for the machine group ID if it is found?\n // Or use a flag? What about the default resource ID as used by syteline? A Rutherford consultation is in order.\n /**\n * Swapping out the resource ID for the group id corresponding to the\n * resource ID in the ERP would be done like so:\n * const machineGroupId = await mmApiClient.getResourceERPGroupId(laborTicket.resourceId);\n * if(machineGroupId) {\n * laborTicket.resourceId = machineGroupId;\n * }\n */\n\n if (!laborTicket.laborTicketId) {\n const { laborTicket: laborTicketResult, erpUid } =\n await connector.createLaborTicketInERP(laborTicket);\n laborTicketResult.laborTicketId = erpUid;\n await this.writeLaborTicketIdToMM(\n mmApiClient,\n laborTicket,\n laborTicketResult\n );\n } else {\n laborTicketResult = await connector.updateLaborTicketInERP(laborTicket);\n }\n\n logger.info(\"ToERP: laborTicket update result:\", {\n laborTicketResult:\n laborTicketResult || \"Failed to create/update labor ticket\",\n laborTicketRef: laborTicket.laborTicketRef,\n operation: laborTicket.laborTicketId ? \"update\" : \"create\",\n });\n\n return laborTicketResult;\n }\n}\n","import { ERPObjType } from \"../../../types/erp-types\";\nimport { IToRESTApiObject } from \"..\";\nimport {\n MMSendPerson,\n MMSendResource,\n MMSendPart,\n MMSendPartOperation,\n MMSendWorkOrder,\n MMSendWorkOrderOperation,\n MMSendLaborTicket,\n MMSendReason,\n} from \"..\";\n\n/**\n * Utility class for transforming entities to/from non-typed and typed objects\n * for interacting with the MachineMetrics API..\n */\nexport class EntityTransformer {\n // ============================================================================\n // PUBLIC INTERFACE METHODS\n // ============================================================================\n\n /**\n * Extracts the primary key from a record based on entity type\n * @param entityType The type of entity being processed\n * @param record The record to extract primary key from\n * @returns A string representation of the primary key\n * @throws Error if primary key fields are missing or invalid\n */\n static extractPrimaryKey(\n entityType: ERPObjType,\n record: IToRESTApiObject\n ): string {\n switch (entityType) {\n case ERPObjType.PERSONS:\n return this.extractPersonKey(record);\n case ERPObjType.RESOURCES:\n return this.extractResourceKey(record);\n case ERPObjType.PARTS:\n return this.extractPartKey(record);\n case ERPObjType.PART_OPERATION:\n return this.extractPartOperationKey(record);\n case ERPObjType.WORK_ORDERS:\n return this.extractWorkOrderKey(record);\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return this.extractWorkOrderOperationKey(record);\n case ERPObjType.LABOR_TICKETS:\n return this.extractLaborTicketKey(record);\n case ERPObjType.REASONS:\n return this.extractReasonKey(record);\n default:\n throw new Error(\n `Unsupported entity type for primary key extraction: ${entityType}`\n );\n }\n }\n\n /**\n * Reconstructs a typed object from plain data based on entity type\n * @param entityType The type of entity being processed\n * @param plainData The plain data object containing entity fields\n * @returns A properly typed IToRESTApiObject instance\n * @throws Error if the entity type is not supported\n */\n static reconstructFromPlainData(\n entityType: ERPObjType,\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n switch (entityType) {\n case ERPObjType.PERSONS:\n return this.reconstructPerson(plainData);\n case ERPObjType.RESOURCES:\n return this.reconstructResource(plainData);\n case ERPObjType.PARTS:\n return this.reconstructPart(plainData);\n case ERPObjType.PART_OPERATION:\n return this.reconstructPartOperation(plainData);\n case ERPObjType.WORK_ORDERS:\n return this.reconstructWorkOrder(plainData);\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return this.reconstructWorkOrderOperation(plainData);\n case ERPObjType.LABOR_TICKETS:\n return this.reconstructLaborTicket(plainData);\n case ERPObjType.REASONS:\n return this.reconstructReason(plainData);\n default:\n throw new Error(\n `Unsupported entity type for reconstruction: ${entityType}`\n );\n }\n }\n\n /**\n * Reconstructs multiple typed objects from plain data based on entity type\n * @param entityType The type of entity being processed\n * @param plainDataArray Array of plain data objects containing entity fields\n * @returns Array of properly typed IToRESTApiObject instances\n */\n static reconstructMultipleFromPlainData(\n entityType: ERPObjType,\n plainDataArray: Record<string, string | null>[]\n ): IToRESTApiObject[] {\n return plainDataArray.map((plainData) =>\n this.reconstructFromPlainData(entityType, plainData)\n );\n }\n\n // ============================================================================\n // PRIVATE ENTITY-SPECIFIC KEY EXTRACTION METHODS\n // ============================================================================\n\n private static extractPersonKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(restApiObject, [\"personId\"], \"PERSONS\", [\n \"personId\",\n ]);\n }\n\n private static extractResourceKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"resourceId\"],\n \"RESOURCES\",\n [\"resourceId\"]\n );\n }\n\n private static extractPartKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"partNumber\", \"partRevision\", \"method\"],\n \"PARTS\",\n [\"partNumber\"]\n );\n }\n\n private static extractPartOperationKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"partNumber\", \"partRevision\", \"method\", \"sequenceNumber\"],\n \"PART_OPERATION\",\n [\"partNumber\", \"sequenceNumber\"]\n );\n }\n\n private static extractWorkOrderKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"workOrderId\", \"lot\", \"split\", \"sub\"],\n \"WORK_ORDERS\",\n [\"workOrderId\"]\n );\n }\n\n private static extractWorkOrderOperationKey(\n record: IToRESTApiObject\n ): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"workOrderId\", \"lot\", \"split\", \"sub\", \"sequenceNumber\"],\n \"WORK_ORDER_OPERATIONS\",\n [\"workOrderId\", \"sequenceNumber\"]\n );\n }\n\n private static extractLaborTicketKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n\n // Labor tickets can use laborTicketId if present, otherwise use operational context\n if (restApiObject.laborTicketId) {\n return this.validateAndExtractKey(\n restApiObject,\n [\"laborTicketId\"],\n \"LABOR_TICKETS\",\n [\"laborTicketId\"]\n );\n } else {\n return this.validateAndExtractKey(\n restApiObject,\n [\n \"workOrderId\",\n \"lot\",\n \"split\",\n \"sub\",\n \"sequenceNumber\",\n \"resourceId\",\n \"personId\",\n ],\n \"LABOR_TICKETS\",\n [\"workOrderId\", \"sequenceNumber\", \"resourceId\", \"personId\"]\n );\n }\n }\n\n private static extractReasonKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(restApiObject, [\"reasonId\"], \"REASONS\", [\n \"reasonId\",\n ]);\n }\n\n // ============================================================================\n // PRIVATE ENTITY-SPECIFIC RECONSTRUCTION METHODS\n // ============================================================================\n\n private static reconstructPerson(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendPerson.fromPlainObject(plainData);\n }\n\n private static reconstructResource(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendResource.fromPlainObject(plainData);\n }\n\n private static reconstructPart(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendPart.fromPlainObject(plainData);\n }\n\n private static reconstructPartOperation(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendPartOperation.fromPlainObject(plainData);\n }\n\n private static reconstructWorkOrder(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendWorkOrder.fromPlainObject(plainData);\n }\n\n private static reconstructWorkOrderOperation(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendWorkOrderOperation.fromPlainObject(plainData);\n }\n\n private static reconstructLaborTicket(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendLaborTicket.fromPlainObject(plainData);\n }\n\n private static reconstructReason(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendReason.fromPlainObject(plainData);\n }\n\n // ============================================================================\n // SHARED UTILITY METHODS\n // ============================================================================\n\n /**\n * Helper method to validate and extract primary key components\n * @param restApiObject The REST API object representation\n * @param keyFields The fields that make up the primary key\n * @param entityTypeName The entity type name for error messages\n * @param requiredFields The fields that must be non-empty (others can be empty)\n * @returns Combined primary key string\n * @throws Error if any required field is missing or null\n */\n private static validateAndExtractKey(\n restApiObject: Record<string, string | null>,\n keyFields: string[],\n entityTypeName: string,\n requiredFields: string[]\n ): string {\n const keyValues: string[] = [];\n\n for (const field of keyFields) {\n const value = restApiObject[field];\n\n // Check if this field is required\n if (requiredFields.includes(field)) {\n if (value === null || value === undefined || value === \"\") {\n throw new Error(\n `Primary key field '${field}' is missing or empty for entity type ${entityTypeName}`\n );\n }\n }\n\n // Use the value if present, otherwise use empty string\n keyValues.push(value || \"\");\n }\n\n return keyValues.join(\"|\");\n }\n}\n","import { ERPObjType } from \"../../types/erp-types\";\nimport { BatchCacheManager } from \"../../services/caching-service/batch-cache-manager\";\nimport {\n IToRESTApiObject,\n MM207NonLaborTicketResponse,\n MM207LaborTicketResponse,\n} from \"../../services/mm-api-service\";\nimport { EntityTransformer } from \"../../services/mm-api-service/types/entity-transformer\";\nimport logger from \"../../services/reporting-service/logger\";\n\n/**\n * Handles error processing and record management utilities for MM API operations\n */\nexport class ErrorProcessor {\n /**\n * Creates a set of primary keys for all failed records from batch errors\n * @param entityType The type of entity being processed\n * @param batchErrors Array of batch errors containing failed entities\n * @returns Set of primary keys for failed records\n */\n static createFailedRecordKeySet(\n entityType: ERPObjType,\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>\n ): Set<string> {\n const failedKeySet = new Set<string>();\n\n batchErrors.forEach((batchError) => {\n batchError.affectedEntities.forEach((affectedEntity) => {\n try {\n const primaryKey = EntityTransformer.extractPrimaryKey(\n entityType,\n affectedEntity\n );\n failedKeySet.add(primaryKey);\n } catch (error) {\n logger.warn(\n `Failed to extract primary key from error entity: ${error}`\n );\n // Continue processing other records even if one fails\n }\n });\n });\n\n return failedKeySet;\n }\n\n /**\n * Filters out failed records, returning only successful ones\n * @param entityType The type of entity being processed\n * @param allRecords All records (typed objects) that were sent to the API\n * @param failedKeySet Set of primary keys for records that failed\n * @returns Array of records that succeeded\n */\n static filterSuccessfulRecords(\n entityType: ERPObjType,\n allRecords: IToRESTApiObject[],\n failedKeySet: Set<string>\n ): IToRESTApiObject[] {\n const successfulRecords: IToRESTApiObject[] = [];\n\n allRecords.forEach((record) => {\n try {\n const primaryKey = EntityTransformer.extractPrimaryKey(\n entityType,\n record\n );\n if (!failedKeySet.has(primaryKey)) {\n successfulRecords.push(record);\n }\n } catch (error) {\n logger.warn(\n `Failed to extract primary key from record during filtering: ${error}`\n );\n // If we can't extract the key, we can't determine if it failed, so skip it\n }\n });\n\n return successfulRecords;\n }\n\n /**\n * Orchestrates the caching of successful records on partial failure\n * @param entityType The type of entity being processed\n * @param toProcess All records that were sent to the API (all are now guaranteed to be typed objects)\n * @param batchErrors Array of batch errors containing failed entities\n * @param batchCacheManager The cache manager instance\n */\n static async cacheSuccessfulRecordsOnPartialFailure(\n entityType: ERPObjType,\n toProcess: IToRESTApiObject[],\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>,\n batchCacheManager: BatchCacheManager\n ): Promise<void> {\n // Create a set of failed record keys for efficient lookup\n const failedKeySet = this.createFailedRecordKeySet(entityType, batchErrors);\n\n // Filter to get only successful records\n const successfulRecords = this.filterSuccessfulRecords(\n entityType,\n toProcess,\n failedKeySet\n );\n\n logger.info(\n `Caching ${successfulRecords.length} successful records out of ${toProcess.length} total records`\n );\n\n // All records are now guaranteed to be typed objects, so we can cache them directly\n if (successfulRecords.length > 0) {\n await batchCacheManager.storeBatch(entityType, successfulRecords);\n }\n }\n\n /**\n * Extracts error count and batch errors from MM API response for partial failures (HTTP 207)\n * This supports all entities, including the slightly different format for labor tickets.\n * In case of labor tickets, the updateErrors and insertErrors arrays are combined into affectedEntities.\n * @param mmApiResponse The full MM API response object\n * @param entityType The type of entity being processed (determines response structure)\n * @returns Object containing errorCount and batchErrors\n * See MM207NonLaborTicketResponse and MM207LaborTicketResponse for response structure details\n */\n static extractErrorDetails(\n mmApiResponse: MM207NonLaborTicketResponse | MM207LaborTicketResponse,\n entityType: ERPObjType\n ): {\n errorCount: number;\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n } {\n // Type the data property with the expected structure for HTTP 207 responses\n const data = mmApiResponse.data as\n | {\n errors?: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }>;\n updateErrors?: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }>;\n insertErrors?: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }>;\n }\n | undefined;\n\n let allErrors: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }> = [];\n\n if (entityType === ERPObjType.LABOR_TICKETS) {\n // Labor tickets: combine updateErrors and insertErrors\n const updateErrors = data?.updateErrors || [];\n const insertErrors = data?.insertErrors || [];\n\n // Defensive validation with actionable warnings\n if (!data?.updateErrors && !data?.insertErrors) {\n logger.warn(\n \"Labor tickets partial success response missing both updateErrors and insertErrors arrays\"\n );\n }\n\n allErrors = [...updateErrors, ...insertErrors];\n } else {\n // Regular entities: use errors array\n const errors = data?.errors || [];\n\n // Defensive validation\n if (!data?.errors) {\n logger.warn(\n `${entityType} partial success response missing errors array`\n );\n }\n\n allErrors = errors;\n }\n\n const batchErrors = allErrors\n .filter(\n (error: {\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }) => {\n return error.batchData && error.batchData.length > 0;\n }\n )\n .map(\n (error: {\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }) => {\n // Reconstruct typed objects from plain data\n const typedErrorEntities = (error.batchData || []).map((entity) => {\n if (\n typeof entity === \"object\" &&\n entity !== null &&\n \"toRESTApiObject\" in entity &&\n typeof entity.toRESTApiObject === \"function\"\n ) {\n // It's already a typed object, return as-is\n return entity as IToRESTApiObject;\n } else {\n // It's plain data, reconstruct as typed object\n return EntityTransformer.reconstructFromPlainData(\n entityType,\n entity as Record<string, string | null>\n );\n }\n });\n\n return {\n message: error.message,\n affectedEntities: typedErrorEntities,\n };\n }\n );\n\n const errorCount = batchErrors.reduce((total: number, batchError) => {\n return total + batchError.affectedEntities.length;\n }, 0);\n\n return {\n errorCount,\n batchErrors,\n };\n }\n\n /**\n * Extracts error details from a 500 HTTP exception when it contains structured error data\n * @param exception The caught exception from MM API call\n * @param entityType The type of entity being processed\n * @returns Object containing errorCount and batchErrors, or null if not a structured 500 error\n * See MM500NonLaborTicketException and MM500LaborTicketException for exception structure details\n */\n static extractErrorDetailsFrom500Exception(\n exception: unknown,\n entityType: ERPObjType\n ): {\n errorCount: number;\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n } | null {\n try {\n // Cast exception to expected structure for easier access\n const ex = exception as Record<string, unknown>;\n const data = ex?.data as Record<string, unknown>;\n\n // Add diagnostic logging to understand the 500 error structure\n logger.info(\n \"writeEntitiesToMM: Analyzing 500 exception structure for diagnostic purposes\",\n {\n status: ex?.status,\n code: ex?.code,\n hasResponseData: !!data,\n responseDataKeys: data ? Object.keys(data) : [],\n errorMessage: data?.error,\n hasMessageObject: !!data?.message,\n messageObjectKeys: data?.message\n ? Object.keys(data.message as Record<string, unknown>)\n : [],\n entityType,\n exceptionType: typeof exception,\n exceptionKeys: ex ? Object.keys(ex) : [],\n }\n );\n\n // Check if this is a structured 500 error\n if (\n ex?.status !== 500 ||\n typeof data?.error !== \"string\" ||\n !data.error.startsWith(\"Failed to import\")\n ) {\n logger.info(\n \"writeEntitiesToMM: Not a structured 500 error - will re-throw exception as-is\",\n {\n status: ex?.status,\n errorMessage: data?.error,\n expectedStatus: 500,\n expectedMessagePrefix: \"Failed to import\",\n }\n );\n return null;\n }\n\n logger.info(\n \"writeEntitiesToMM: Detected structured 500 error - extracting error details\"\n );\n\n const messageObject = data?.message as Record<string, unknown>;\n if (!messageObject) {\n logger.warn(\n \"writeEntitiesToMM: Structured 500 error missing message object\"\n );\n return null;\n }\n\n let allErrors: unknown[] = [];\n\n if (entityType === ERPObjType.LABOR_TICKETS) {\n // Labor tickets: combine updateErrors and insertErrors\n const updateErrors = Array.isArray(messageObject?.updateErrors)\n ? messageObject.updateErrors\n : [];\n const insertErrors = Array.isArray(messageObject?.insertErrors)\n ? messageObject.insertErrors\n : [];\n\n logger.info(\"writeEntitiesToMM: Processing labor tickets 500 error\", {\n updateErrorsCount: updateErrors.length,\n insertErrorsCount: insertErrors.length,\n });\n\n if (updateErrors.length === 0 && insertErrors.length === 0) {\n logger.warn(\n \"writeEntitiesToMM: Labor tickets 500 error missing both updateErrors and insertErrors arrays\"\n );\n }\n\n allErrors = [...updateErrors, ...insertErrors];\n } else {\n // Regular entities: use errors array\n const errors = Array.isArray(messageObject?.errors)\n ? messageObject.errors\n : [];\n\n logger.info(\"writeEntitiesToMM: Processing regular entity 500 error\", {\n errorsCount: errors.length,\n });\n\n if (errors.length === 0) {\n logger.warn(\n `writeEntitiesToMM: ${entityType} 500 error missing errors array`\n );\n }\n\n allErrors = errors;\n }\n\n const batchErrors = allErrors\n .filter((error) => {\n const err = error as Record<string, unknown>;\n return Array.isArray(err?.batchData) && err.batchData.length > 0;\n })\n .map((error) => {\n const err = error as Record<string, unknown>;\n const batchData = err?.batchData as (\n | IToRESTApiObject\n | Record<string, string | null>\n )[];\n\n // Reconstruct typed objects from plain data\n const typedErrorEntities = (batchData || []).map((entity) => {\n if (\n typeof entity === \"object\" &&\n entity !== null &&\n \"toRESTApiObject\" in entity &&\n typeof entity.toRESTApiObject === \"function\"\n ) {\n // It's already a typed object, return as-is\n return entity as IToRESTApiObject;\n } else {\n // It's plain data, reconstruct as typed object\n return EntityTransformer.reconstructFromPlainData(\n entityType,\n entity as Record<string, string | null>\n );\n }\n });\n\n return {\n message:\n typeof err?.message === \"string\" ? err.message : \"Unknown error\",\n affectedEntities: typedErrorEntities,\n };\n });\n\n const errorCount = batchErrors.reduce((total: number, batchError) => {\n return total + batchError.affectedEntities.length;\n }, 0);\n\n logger.info(\"writeEntitiesToMM: Extracted 500 error details\", {\n batchErrorsCount: batchErrors.length,\n totalErrorCount: errorCount,\n entityType,\n });\n\n return {\n errorCount,\n batchErrors,\n };\n } catch (error) {\n // If we can't even parse the structure safely, log what we can and return null\n logger.error(\n \"writeEntitiesToMM: Failed to parse 500 exception structure safely\",\n {\n error: error instanceof Error ? error.message : String(error),\n exceptionType: typeof exception,\n entityType,\n }\n );\n return null;\n }\n }\n}\n","import { ERPObjType } from \"../../types/erp-types\";\nimport { BatchCacheManager } from \"../../services/caching-service/batch-cache-manager\";\nimport {\n IToRESTApiObject,\n MMSendPerson,\n MMSendResource,\n MMSendPart,\n MMSendPartOperation,\n MMSendWorkOrder,\n MMSendWorkOrderOperation,\n MMSendLaborTicket,\n MMSendReason,\n MMApiBaseResponse,\n MM200NonLaborTicketResponse,\n MM200LaborTicketResponse,\n MM207NonLaborTicketResponse,\n MM207LaborTicketResponse,\n} from \"../../services/mm-api-service\";\nimport { MMApiClient } from \"../../services/mm-api-service/mm-api-service\";\nimport { HTTPError } from \"../http-client\";\nimport {\n WriteEntitiesToMMResult,\n MMBatchValidationError,\n} from \"./standard-process-drivers\";\nimport { ErrorProcessor } from \"./error-processor\";\n\n/**\n * Handles processing of entities to the MachineMetrics API\n */\nexport class MMEntityProcessor {\n /**\n * Writes entities to MM API with deduplication and caching\n */\n static async writeEntities(\n entityType: ERPObjType,\n mmRecords: IToRESTApiObject[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<WriteEntitiesToMMResult> {\n const { toProcess, result } = await this._prepareAndDedupe(\n entityType,\n mmRecords,\n batchCacheManager\n );\n\n if (toProcess.length === 0) {\n result.message =\n \"All records were deduplicated locally - no records sent to MM API\";\n return result;\n }\n\n let mmApiResponse: MMApiBaseResponse;\n try {\n mmApiResponse = await this._sendToAPI(entityType, toProcess);\n } catch (exception) {\n this._handleException(exception, entityType, result);\n }\n\n return await this._handleResponse(\n mmApiResponse,\n entityType,\n toProcess,\n result,\n batchCacheManager\n );\n }\n\n // ============================================================================\n // PRIVATE HELPER METHODS\n // ============================================================================\n\n /**\n * Deduplicates records against cache\n * Returns the records to process and the result object\n * If the batchCacheManager is provided, the records are deduplicated against the cache\n * If the batchCacheManager is not provided, the records are not deduplicated\n */\n private static async _prepareAndDedupe(\n entityType: ERPObjType,\n mmRecords: IToRESTApiObject[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<{\n toProcess: IToRESTApiObject[];\n result: WriteEntitiesToMMResult;\n }> {\n let toProcess: IToRESTApiObject[] = [];\n const result: WriteEntitiesToMMResult = {\n message: \"\",\n upsertedEntities: 0,\n localDedupeCount: 0,\n apiDedupeCount: 0,\n };\n\n if (batchCacheManager) {\n const { nonDuplicates, duplicates } =\n (await batchCacheManager.dedupeBatch(entityType, mmRecords)) as {\n nonDuplicates: IToRESTApiObject[];\n duplicates: IToRESTApiObject[];\n };\n toProcess = nonDuplicates;\n result.localDedupeCount = duplicates.length;\n } else {\n toProcess = mmRecords;\n }\n\n return { toProcess, result };\n }\n\n /**\n * Sends records to MM API\n */\n private static async _sendToAPI(\n entityType: ERPObjType,\n toProcess: IToRESTApiObject[]\n ): Promise<MMApiBaseResponse> {\n const mmApiClient = new MMApiClient();\n\n switch (entityType) {\n case ERPObjType.PERSONS:\n return await mmApiClient.sendPersonsToMM(toProcess as MMSendPerson[]);\n case ERPObjType.RESOURCES:\n return await mmApiClient.sendResourcesToMM(\n toProcess as MMSendResource[]\n );\n case ERPObjType.PARTS:\n return await mmApiClient.sendPartsToMM(toProcess as MMSendPart[]);\n case ERPObjType.PART_OPERATION:\n return await mmApiClient.sendPartOperationsToMM(\n toProcess as MMSendPartOperation[]\n );\n case ERPObjType.WORK_ORDERS:\n return await mmApiClient.sendWorkOrdersToMM(\n toProcess as MMSendWorkOrder[]\n );\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return await mmApiClient.sendWorkOrderOperationsToMM(\n toProcess as MMSendWorkOrderOperation[]\n );\n case ERPObjType.LABOR_TICKETS:\n return await mmApiClient.sendLaborTicketsToMM(\n toProcess as MMSendLaborTicket[]\n );\n case ERPObjType.REASONS:\n return await mmApiClient.sendReasonsToMM(toProcess as MMSendReason[]);\n default:\n throw new Error(`Unknown entity type: ${entityType}`);\n }\n }\n\n /**\n * Handles exceptions from API calls, converting structured 500 errors to MMBatchValidationError\n * @throws MMBatchValidationError for structured 500 errors\n * @throws The original exception for all other errors\n */\n private static _handleException(\n exception: unknown,\n entityType: ERPObjType,\n result: WriteEntitiesToMMResult\n ): never {\n // Handle structured 500 errors that may be appropriate for partial failure\n const structuredCompleteErrorSet =\n ErrorProcessor.extractErrorDetailsFrom500Exception(exception, entityType);\n\n if (structuredCompleteErrorSet) {\n const ex = exception as Record<string, unknown>;\n const data = ex?.data as Record<string, unknown>;\n const errorMessage =\n typeof data?.error === \"string\"\n ? data.error\n : \"All entities failed to import\";\n\n throw new MMBatchValidationError({\n message: errorMessage,\n upsertedEntities: 0,\n localDedupeCount: result.localDedupeCount,\n apiDedupeCount: 0,\n errorCount: structuredCompleteErrorSet.errorCount,\n httpStatus: (exception as HTTPError).status,\n batchErrors: structuredCompleteErrorSet.batchErrors,\n });\n }\n\n // For all other exceptions, re-throw as-is\n throw exception;\n }\n\n /**\n * Handles the MM API response based on HTTP status code, caching successful records\n * and throwing exceptions for partial failures\n *\n * @returns The final result for success cases\n * @throws MMBatchValidationError for partial success cases\n * @throws Error for unknown status codes\n */\n private static async _handleResponse(\n mmApiResponse: MMApiBaseResponse,\n entityType: ERPObjType,\n toProcess: IToRESTApiObject[],\n result: WriteEntitiesToMMResult,\n batchCacheManager: BatchCacheManager | null\n ): Promise<WriteEntitiesToMMResult> {\n if (mmApiResponse.httpStatus === 200) {\n // Complete success - cache all records\n if (batchCacheManager) {\n await batchCacheManager.storeBatch(entityType, toProcess);\n }\n\n if (entityType === ERPObjType.LABOR_TICKETS) {\n const success = mmApiResponse as MM200LaborTicketResponse;\n result.message = success.message || \"Entities processed successfully\";\n result.upsertedEntities =\n (success.updated || 0) + (success.inserted || 0);\n } else {\n const success = mmApiResponse as MM200NonLaborTicketResponse;\n result.message = success.message || \"Entities processed successfully\";\n result.upsertedEntities = success.affectedRows || 0;\n }\n result.apiDedupeCount = toProcess.length - result.upsertedEntities;\n\n return result;\n } else if (mmApiResponse.httpStatus === 207) {\n // Partial success - cache only successful records before throwing exception\n const partialResponse = mmApiResponse as\n | MM207NonLaborTicketResponse\n | MM207LaborTicketResponse;\n const { errorCount, batchErrors } = ErrorProcessor.extractErrorDetails(\n partialResponse,\n entityType\n );\n\n if (batchCacheManager) {\n await ErrorProcessor.cacheSuccessfulRecordsOnPartialFailure(\n entityType,\n toProcess,\n batchErrors,\n batchCacheManager\n );\n }\n\n let upsertedEntities = 0;\n if (entityType === ERPObjType.LABOR_TICKETS) {\n const partial = partialResponse as MM207LaborTicketResponse;\n upsertedEntities =\n (partial.data.updated || 0) + (partial.data.inserted || 0);\n } else {\n const partial = partialResponse as MM207NonLaborTicketResponse;\n upsertedEntities = partial.data.affectedRows || 0;\n }\n\n throw new MMBatchValidationError({\n message:\n partialResponse.message || \"Entities processed with partial failures\",\n upsertedEntities: upsertedEntities,\n localDedupeCount: result.localDedupeCount,\n apiDedupeCount: toProcess.length - upsertedEntities - errorCount,\n errorCount: errorCount,\n httpStatus: mmApiResponse.httpStatus,\n batchErrors: batchErrors,\n });\n } else {\n throw new Error(\n `writeEntitiesToMM: Unknown HTTP status code: ${mmApiResponse.httpStatus}. An exception was expected.`\n );\n }\n }\n}\n","import { ERPType, ERPObjType } from \"../../types/erp-types\";\nimport { IERPLaborTicketHandler } from \"../../types/erp-connector\";\nimport { BatchCacheManager } from \"../../services/caching-service/batch-cache-manager\";\nimport {\n IToRESTApiObject,\n MMSendWorkOrderBatch,\n MMSendPart,\n MMSendPartOperation,\n MMSendWorkOrder,\n MMSendWorkOrderOperation,\n} from \"../../services/mm-api-service\";\nimport { LaborTicketERPSynchronizer } from \"./labor-ticket-erp-synchronizer\";\nimport { MMEntityProcessor } from \"./mm-entity-processor\";\n\n/**\n * The result of writing entities to the MachineMetrics API on complete success.\n */\nexport interface WriteEntitiesToMMResult {\n message: string;\n upsertedEntities: number;\n localDedupeCount: number;\n apiDedupeCount: number;\n}\n\nexport class MMBatchValidationError extends Error {\n public readonly upsertedEntities: number;\n public readonly localDedupeCount: number;\n public readonly apiDedupeCount: number;\n public readonly errorCount: number;\n public readonly httpStatus: number;\n public readonly batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n\n constructor(options: {\n message: string;\n upsertedEntities: number;\n localDedupeCount: number;\n apiDedupeCount: number;\n errorCount: number;\n httpStatus: number;\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n }) {\n super(options.message);\n this.name = \"MMBatchValidationError\";\n this.upsertedEntities = options.upsertedEntities;\n this.localDedupeCount = options.localDedupeCount;\n this.apiDedupeCount = options.apiDedupeCount;\n this.errorCount = options.errorCount;\n this.httpStatus = options.httpStatus;\n this.batchErrors = options.batchErrors;\n }\n}\n\n/**\n * A collection of standardized process drivers that orchestrate various synchronization\n * and integration processes between systems. Use of these drivers is optional,\n * and useful as a reference implementation for how to implement the various processes.\n */\nexport class StandardProcessDrivers {\n /**\n * Synchronizes updated labor tickets from MachineMetrics to an ERP system:\n *\n * Initializes a checkpoint that tracks the last time labor tickets were synced,\n * fetches labor tickets from MM and converts them to the company timezone,\n * creates or updates the labor ticket in the ERP via connector-specific implementations,\n * updates the labor ticket id in MM on newly created labor tickets,\n * and saves the checkpoint\n */\n static async syncLaborTicketsToERP(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n return LaborTicketERPSynchronizer.syncToERP(connectorType, connector);\n }\n\n /**\n * Retries labor tickets that have failed to be created or updated in the ERP during the sync:\n *\n * Fetches failed labor tickets from MM, processes them, and updates the labor ticket id in MM.\n * If the labor ticket is successfully created or updated, it is added to the list of successful labor ticket ids,\n * which are then deleted from the list of failed labor ticket ids.\n */\n static async retryFailedLaborTickets(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n return LaborTicketERPSynchronizer.retryFailed(connectorType, connector);\n }\n\n /**\n * Writes a batch of records to MM for a specific entity type by:\n * 1. Deduplicating against cached records (localDedupeCount)\n * 2. Sending non-duplicate records to the MM API (apiDedupeCount)\n * 3. Storing successful records in cache\n *\n * An example usage pattern including comprehensive error handling:\n * ```\n * try {\n * const result = await StandardProcessDrivers.writeEntitiesToMM(\n * 'WorkOrders',\n * workOrderRecords,\n * batchCacheManager\n * );\n *\n * // HTTP 200 - Complete success\n * console.log(`✅ Success: ${result.message}`);\n * console.log(`📊 Metrics: ${result.upsertedEntities} upserted, ${result.localDedupeCount} locally deduplicated, ${result.apiDedupeCount} API deduplicated`);\n *\n * } catch (error) {\n * if (error instanceof MMBatchValidationError) {\n * // HTTP 207 - Partial success with some batches failing due to validation errors\n * // HTTP 500 - A specific type representing complete failure due to validation issues;\n * // other 500 types represent failure due to other issues and are not converted to MMBatchValidationError\n * // Note: Each batch error contains ALL entities from the failing batch, not necessarily just the failed ones\n *\n * console.log(`⚠️ Batch processing completed with errors (HTTP ${error.httpStatus})`);\n * console.log(`📊 Metrics: ${error.upsertedEntities} upserted, ${error.localDedupeCount} locally deduplicated, ${error.apiDedupeCount} API deduplicated`);\n * console.log(`❌ Error count: ${error.errorCount}`);\n *\n * // Process specific batch errors for retry or logging\n * error.batchErrors.forEach((batchError, index) => {\n * console.log(`Batch ${index + 1} error: ${batchError.message}`);\n * console.log(`All entities in failing batch:`, batchError.affectedEntities);\n *\n * // Example: Queue entire failing batch for retry (contains both successful and failed entities)\n * await queueForRetry(batchError.affectedEntities);\n * });\n *\n * // Decide whether to continue or halt based on httpStatus\n * if (error.httpStatus === 207) {\n * // Partial success - some batches processed successfully, others failed\n * console.log('⚠️ Continuing with partial success');\n * } else if (error.httpStatus === 500) {\n * // Complete failure - all batches failed due to validation issues\n * console.log('🛑 Complete failure - no records processed');\n * throw error; // Re-throw if complete failure should halt the process\n * }\n *\n * } else {\n * // Other underlying errors (network issues, authentication, etc.)\n * console.error('🚨 Unexpected error during MM API call:', error);\n *\n * // Example: Check for specific error types\n * if (error.message?.includes('authentication')) {\n * console.error('🔐 Authentication issue - check MM API credentials');\n * } else if (error.message?.includes('network') || error.code === 'ECONNREFUSED') {\n * console.error('🌐 Network connectivity issue - check MM API endpoint');\n * }\n *\n * throw error; // Re-throw for upstream handling\n * }\n * }\n * ```\n *\n * @param entityType The type of entity being processed\n * @param mmRecords The records to process\n * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired\n *\n * @returns WriteEntitiesToMMResult on complete success (HTTP 200)\n * @throws MMBatchValidationError on partial success (HTTP 207) or complete failure (HTTP 500) with structured error details\n * @throws Error on other underlying issues (network, authentication, etc.)\n */\n static async writeEntitiesToMM(\n entityType: ERPObjType,\n mmRecords: IToRESTApiObject[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<WriteEntitiesToMMResult> {\n return MMEntityProcessor.writeEntities(\n entityType,\n mmRecords,\n batchCacheManager\n );\n }\n\n /**\n * Writes a batch of Work Order related entities to MM maintaining referential integrity by:\n * 1. Processing parts first (base entities)\n * 2. Processing part operations (depends on parts)\n * 3. Processing work orders (depends on parts)\n * 4. Processing work order operations (depends on work orders and part operations)\n *\n * This ensures all foreign key constraints are satisfied and prevents referential integrity errors.\n *\n * @param workOrderBatch The batch containing all related entities\n * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired\n *\n * @returns Combined results from all entity processing\n * @throws MMBatchValidationError on partial success or complete failure with structured error details\n * @throws Error on other underlying issues (network, authentication, etc.)\n */\n static async writeWorkOrderBatchToMM(\n workOrderBatch: MMSendWorkOrderBatch,\n batchCacheManager: BatchCacheManager | null\n ): Promise<{\n parts: WriteEntitiesToMMResult;\n partOperations: WriteEntitiesToMMResult;\n workOrders: WriteEntitiesToMMResult;\n workOrderOperations: WriteEntitiesToMMResult;\n }> {\n // Process entities in order to maintain referential integrity\n\n // 1. Parts first (no dependencies)\n const partsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PARTS,\n workOrderBatch.parts,\n batchCacheManager\n );\n\n // 2. Part Operations (depends on parts)\n const partOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PART_OPERATION,\n workOrderBatch.partOperations,\n batchCacheManager\n );\n\n // 3. Work Orders (depends on parts)\n const workOrdersResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDERS,\n workOrderBatch.workOrders,\n batchCacheManager\n );\n\n // 4. Work Order Operations (depends on work orders and part operations)\n const workOrderOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDER_OPERATIONS,\n workOrderBatch.workOrderOperations,\n batchCacheManager\n );\n\n return {\n parts: partsResult,\n partOperations: partOperationsResult,\n workOrders: workOrdersResult,\n workOrderOperations: workOrderOperationsResult,\n };\n }\n\n /**\n * Processes flattened work order data and syncs it to MM maintaining referential integrity.\n *\n * This method expects flattened data where each row contains both work order and operation information\n * with camelCase field names matching the GraphQL schema. It will automatically extract and deduplicate\n * parts, part operations, work orders, and work order operations, then process them in the correct order\n * to maintain referential integrity.\n *\n * @param flattenedData Array of flattened rows containing both work order and operation data (camelCase fields)\n * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired\n *\n * @returns Combined results from all entity processing with detailed logging information\n * @throws MMBatchValidationError on partial success or complete failure with structured error details\n * @throws Error on other underlying issues (network, authentication, etc.)\n */\n static async syncWorkOrderBatchFromFlattened(\n flattenedData: any[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<{\n parts: WriteEntitiesToMMResult;\n partOperations: WriteEntitiesToMMResult;\n workOrders: WriteEntitiesToMMResult;\n workOrderOperations: WriteEntitiesToMMResult;\n }> {\n if (!flattenedData || flattenedData.length === 0) {\n throw new Error(\"No flattened work order data provided\");\n }\n\n // Process the flattened data - each row contains both work order and operation info\n const uniqueParts = new Map();\n const uniquePartOperations = new Map();\n const uniqueWorkOrders = new Map();\n const workOrderOperations = [];\n\n // Process each flattened row to extract entities\n for (const row of flattenedData) {\n // Extract unique parts\n const partKey = `${row.partNumber}|${row.partRevision}|${row.method}`;\n if (!uniqueParts.has(partKey)) {\n uniqueParts.set(partKey, {\n partNumber: row.partNumber, // → partNumber\n partRevision: row.partRevision, // → partRevision\n method: row.method, // → method\n });\n }\n\n // Extract unique part operations\n const partOpKey = `${row.partNumber}|${row.partRevision}|${row.method}|${row.sequenceNumber}`;\n if (!uniquePartOperations.has(partOpKey)) {\n uniquePartOperations.set(partOpKey, {\n partNumber: row.partNumber, // → partNumber\n partRevision: row.partRevision, // → partRevision\n method: row.method, // → method\n sequenceNumber: row.sequenceNumber, // → sequenceNumber\n resourceId: row.resourceId, // → resourceId\n cycleTimeMs: row.cycleTimeMs, // → cycleTimeMs\n setupTimeMs: row.setupTimeMs, // → setupTimeMs\n description: row.operationDescription || \"\", // → description\n quantityPerPart: row.quantityPerPart || 1, // → quantityPerPart\n });\n }\n\n // Extract unique work orders\n const workOrderKey = row.workOrderId;\n if (!uniqueWorkOrders.has(workOrderKey)) {\n uniqueWorkOrders.set(workOrderKey, {\n workOrderId: row.workOrderId, // → workOrderId\n lot: row.lot, // → lot\n split: row.split, // → split\n sub: row.sub, // → sub\n status: row.status, // → status\n dueDate: row.dueDate, // → dueDate\n description: row.description, // → description\n scheduledStartDate: row.scheduledStartDate, // → scheduledStartDate\n scheduledEndDate: row.scheduledEndDate, // → scheduledEndDate\n closedDate: row.closedDate, // → closedDate\n quantityRequired: row.quantityRequired, // → quantityRequired\n partNumber: row.partNumber, // → partNumber\n partRevision: row.partRevision, // → partRevision\n method: row.method, // → method\n });\n }\n\n // Add each work order operation (these are not deduplicated since each operation is unique)\n workOrderOperations.push({\n workOrderId: row.workOrderId, // → workOrderId\n lot: row.lot, // → lot\n split: row.split, // → split\n sub: row.sub, // → sub\n sequenceNumber: row.sequenceNumber, // → sequenceNumber\n resourceId: row.resourceId, // → resourceId\n startQuantity: row.startQuantity, // → startQuantity\n finishQuantity: row.finishQuantity, // → finishQuantity\n expectedRejectRate: row.expectedRejectRate, // → expectedRejectRate\n scheduledStartDate: row.opScheduledStartDate, // → scheduledStartDate\n scheduledFinishDate: row.opScheduledFinishDate, // → scheduledFinishDate\n closedDate: row.opClosedDate, // → closedDate\n cycleTimeMs: row.cycleTimeMs, // → cycleTimeMs\n setupTimeMs: row.setupTimeMs, // → setupTimeMs\n productionburdenRateHourly: row.productionburdenRateHourly, // → productionburdenRateHourly\n setupburdenRatehourly: row.setupburdenRatehourly, // → setupburdenRatehourly\n operationType: row.operationType, // → operationType\n quantityPerPart: row.quantityPerPart, // → quantityPerPart\n status: row.opStatus || row.status, // → status\n });\n }\n\n // Transform all the data directly to MM entities\n const parts = Array.from(uniqueParts.values()).map(\n (item) =>\n new MMSendPart(\n item.partNumber || \"\", // partNumber\n item.partRevision || \"\", // partRevision\n item.method || \"Standard\" // method\n )\n );\n\n const partOperations = Array.from(uniquePartOperations.values()).map(\n (item) =>\n new MMSendPartOperation(\n item.partNumber || \"\", // partNumber\n item.partRevision || \"\", // partRevision\n item.method || \"Standard\", // method\n item.sequenceNumber?.toString() || \"\", // sequenceNumber\n item.resourceId?.toString() || \"\", // resourceId\n item.cycleTimeMs || 0, // cycleTimeMs\n item.setupTimeMs || 0, // setupTimeMs\n item.description || \"\", // description\n item.quantityPerPart || 1 // quantityPerPart\n )\n );\n\n const transformedWorkOrders = Array.from(uniqueWorkOrders.values()).map(\n (item) =>\n new MMSendWorkOrder(\n item.workOrderId?.toString() || \"\", // workOrderId\n item.lot || \"\", // lot\n item.split || \"\", // split\n item.sub || \"\", // sub\n item.status || \"Open\", // status\n item.dueDate ? new Date(item.dueDate).toISOString() : null, // dueDate\n item.description || \"\", // description\n item.scheduledStartDate\n ? new Date(item.scheduledStartDate).toISOString()\n : null, // scheduledStartDate\n item.scheduledEndDate\n ? new Date(item.scheduledEndDate).toISOString()\n : null, // scheduledEndDate\n item.closedDate ? new Date(item.closedDate).toISOString() : null, // closedDate\n item.quantityRequired || 0, // quantityRequired\n item.partNumber || \"\", // partNumber\n item.partRevision || \"\", // partRevision\n item.method || \"Standard\" // method\n )\n );\n\n const transformedWorkOrderOperations = workOrderOperations.map(\n (item) =>\n new MMSendWorkOrderOperation(\n item.workOrderId?.toString() || \"\", // workOrderId\n item.lot || \"\", // lot\n item.split || \"\", // split\n item.sub || \"\", // sub\n item.sequenceNumber?.toString() || \"\", // sequenceNumber\n item.resourceId?.toString() || \"\", // resourceId\n item.startQuantity || 0, // startQuantity\n item.finishQuantity || 0, // finishQuantity\n item.expectedRejectRate || 0, // expectedRejectRate\n item.scheduledStartDate\n ? new Date(item.scheduledStartDate).toISOString()\n : null, // scheduledStartDate\n item.scheduledFinishDate\n ? new Date(item.scheduledFinishDate).toISOString()\n : null, // scheduledFinishDate\n item.closedDate ? new Date(item.closedDate).toISOString() : null, // closedDate\n item.cycleTimeMs || 0, // cycleTimeMs\n item.setupTimeMs || 0, // setupTimeMs\n parseFloat(item.productionburdenRateHourly || \"0\"), // productionburdenRateHourly\n parseFloat(item.setupburdenRatehourly || \"0\"), // setupburdenRatehourly\n item.operationType || \"Production\", // operationType\n item.quantityPerPart || 1, // quantityPerPart\n item.status || \"Open\" // status\n )\n );\n\n // Send each entity type individually in the correct order for referential integrity\n const partsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PARTS,\n parts,\n batchCacheManager\n );\n\n const partOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PART_OPERATION,\n partOperations,\n batchCacheManager\n );\n\n const workOrdersResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDERS,\n transformedWorkOrders,\n batchCacheManager\n );\n\n const workOrderOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDER_OPERATIONS,\n transformedWorkOrderOperations,\n batchCacheManager\n );\n\n return {\n parts: partsResult,\n partOperations: partOperationsResult,\n workOrders: workOrdersResult,\n workOrderOperations: workOrderOperationsResult,\n };\n }\n}\n","import { HTTPClient, HTTPClientFactory } from \"../../../utils/http-client\";\nimport {\n QueryParams,\n buildLogicalCondition,\n Pagination,\n} from \"./get-query-params\";\nimport { ErrorHandler } from \"../errors\";\nimport { APIResponse, ERPApiConfig } from \"../types\";\n\nconst DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries\nconst DEFAULT_PAGINATION_LIMIT = 100; // Reasonable default for most APIs\n\n/**\n * RestAPIService is a utility class for making REST API requests to an ERP system.\n * Provides methods for GET, PATCH, and POST requests, with built-in pagination support.\n *\n * @param config - Configuration for the ERP API connection\n * @param retryAttempts - Optional number of retry attempts for failed requests. Defaults to 0 (no retries)\n * @param paginationLimit - Optional default limit for paginated requests. Defaults to 100 items per page\n *\n * NOTE: assumes bearertoken-based authentication.\n */\nexport class RestAPIService {\n private client: HTTPClient;\n private config: ERPApiConfig;\n private paginationLimit: number;\n\n constructor(\n config: ERPApiConfig,\n retryAttempts?: number,\n paginationLimit?: number\n ) {\n this.config = config;\n this.paginationLimit = paginationLimit ?? DEFAULT_PAGINATION_LIMIT;\n this.client = HTTPClientFactory.getInstance({\n baseUrl: config.apiUrl,\n retryAttempts: retryAttempts ?? DEFAULT_RETRY_ATTEMPTS,\n });\n }\n\n //#region Get Request Helpers\n private async getHeaders(): Promise<Record<string, string>> {\n const token = await this.config.getAuthToken();\n return {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }\n\n private buildQueryParams(query: QueryParams = {}): URLSearchParams {\n const { limit, nextPage, filter } = query;\n const queryParams: Record<string, string> = {};\n\n if (limit) {\n queryParams.take = limit.toString();\n }\n if (nextPage) {\n queryParams.skip = nextPage;\n }\n\n if (filter) {\n if (filter.in) {\n filter.in.forEach((filterIn) => {\n const query = filterIn.value.join(\"|\");\n queryParams[`${filterIn.field}[in]`] = query;\n });\n }\n\n if (filter.and) {\n queryParams[\"filter[and]\"] = buildLogicalCondition(filter.and, \"and\");\n }\n\n if (filter.or) {\n queryParams[\"filter[or]\"] = buildLogicalCondition(filter.or, \"or\");\n }\n }\n\n return new URLSearchParams(queryParams);\n }\n\n /**\n * Builds pagination metadata for API responses\n * @param limit - Optional limit for this specific request. If not provided, uses the service's default pagination limit\n * @param nextPage - Optional next page token\n * @param previousPage - Optional previous page token\n * @param dataLength - Number of items in the current response\n * @param totalCount - Total number of items available\n * @returns Pagination metadata including count, limit, and page tokens\n */\n private buildPagination(\n limit?: number,\n nextPage?: string,\n previousPage?: string,\n dataLength: number = 0,\n totalCount?: number\n ): Pagination {\n const paging: Pagination = {\n count: totalCount || 0,\n limit: limit || this.paginationLimit,\n nextPage: undefined,\n previousPage,\n };\n\n if (limit) {\n paging.limit = limit;\n const currentSkip = parseInt(nextPage || \"0\");\n\n // Only set nextPage if:\n // 1. We have data in this response\n // 2. We haven't reached the end (current skip + limit < total count)\n if (dataLength > 0 && (!totalCount || currentSkip + limit < totalCount)) {\n paging.nextPage = `${currentSkip + limit}`;\n }\n }\n\n return paging;\n }\n\n private buildUrl(endpoint: string, queryParams?: URLSearchParams): string {\n const pathParts = [this.config.apiUrl || \"\"];\n pathParts.push(endpoint);\n\n const path = pathParts.filter(Boolean).join(\"/\");\n return queryParams ? `${path}?${queryParams.toString()}` : path;\n }\n //#endregion get request helpers\n\n async get<T>(\n endpoint: string,\n query: QueryParams = {}\n ): Promise<APIResponse<T[]>> {\n try {\n const params = this.buildQueryParams(query);\n const url = this.buildUrl(endpoint, params);\n const headers = await this.getHeaders();\n\n const response = await this.client.request<{\n Data: T[];\n TotalCount: number;\n }>({\n method: \"GET\",\n url,\n headers,\n });\n\n const paging = this.buildPagination(\n query.limit,\n query.nextPage,\n query.previousPage,\n response.data.Data?.length,\n response.data.TotalCount\n );\n\n return {\n data: response.data.Data || [],\n metadata: {\n pagination: paging,\n },\n };\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n async patch<T>(\n endpoint: string,\n id: string,\n data: Partial<T>\n ): Promise<APIResponse<T>> {\n try {\n const url = this.buildUrl(`${endpoint}/${id}`);\n const headers = await this.getHeaders();\n\n const response = await this.client.request<T>({\n method: \"PATCH\",\n url,\n data,\n headers,\n });\n\n return {\n data: response.data,\n };\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n async post<TRequest, TResponse = TRequest>(\n endpoint: string,\n data: TRequest\n ): Promise<APIResponse<TResponse>> {\n try {\n const url = this.buildUrl(endpoint);\n const headers = await this.getHeaders();\n\n const response = await this.client.request<TResponse>({\n method: \"POST\",\n url,\n data,\n headers,\n });\n\n return {\n data: response.data,\n };\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Cleanup all HTTP connections and resources\n * Call this when the service is no longer needed\n */\n async destroy(): Promise<void> {\n await this.client.destroy();\n }\n}\n","import { ERPObjType } from \"../types/erp-types\";\n\nexport function getERPAPITypeFromEntity(\n entity: string,\n entityMap: Record<ERPObjType, { entity: string }>\n): ERPObjType | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const entry = Object.entries(entityMap).find(\n ([_, value]) => value.entity === entity\n );\n return entry ? (Number(entry[0]) as ERPObjType) : undefined;\n}\n","import logger from \"../services/reporting-service/logger\";\nimport { CoreConfiguration } from \"../services/data-sync-service/configuration-manager\";\nimport { SQLiteCoordinator } from \"../services/sqlite-service\";\nimport { getTimezoneOffsetAndPersist } from \"./time-utils\";\nimport knex from \"knex\";\nimport config from \"../knexfile\";\n\n/**\n * Utility class to handle application initialization tasks\n */\nexport class ApplicationInitializer {\n /**\n * Performs all necessary application initialization tasks\n * This should be called before starting any services or jobs\n */\n public static async initialize(): Promise<void> {\n try {\n logger.info(\n \"\\n================================INITIALIZING APPLICATION================================\\n\"\n );\n\n // Load and validate core configuration\n const coreConfig = CoreConfiguration.inst();\n logger.info(\"Core Configuration loaded:\", coreConfig);\n\n // Perform database startup checks\n logger.info(\"Performing database startup checks...\");\n await SQLiteCoordinator.performStartupCheck();\n logger.info(\"Database startup checks completed successfully\");\n\n // Run database migrations to ensure all tables exist\n logger.info(\"Running database migrations...\");\n await ApplicationInitializer.runMigrations();\n logger.info(\"Database migrations completed successfully\");\n\n // Required for most connectors\n await getTimezoneOffsetAndPersist();\n\n logger.info(\n \"\\n================================APPLICATION INITIALIZATION COMPLETED================================\\n\"\n );\n } catch (error) {\n logger.error(\"Critical initialization failure. Exiting.\", error);\n process.exit(1);\n }\n }\n\n /**\n * Runs database migrations to ensure all required tables exist\n */\n private static async runMigrations(): Promise<void> {\n const db = knex(config.local);\n try {\n await db.migrate.latest();\n } catch (error) {\n logger.error(\"Error running migrations:\", error);\n throw error;\n } finally {\n await db.destroy();\n }\n }\n}\n","import {\n HTTPClient,\n HTTPClientFactory,\n HTTPResponse,\n} from \"../../../utils/http-client\";\nimport { GraphQLResponse } from \"./types\";\nimport { ErrorHandler } from \"../errors\";\nimport { APIResponse } from \"../types\";\nimport { ERPApiConfig } from \"../types\";\n\nconst DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries\n\nexport class GraphQLService {\n private client: HTTPClient;\n private config: ERPApiConfig;\n private endpoint: string;\n\n constructor(config: ERPApiConfig, endpoint: string, retryAttempts?: number) {\n this.config = config;\n this.endpoint = endpoint\n ? endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`\n : \"\";\n this.client = HTTPClientFactory.getInstance({\n baseUrl: config.apiUrl,\n retryAttempts: retryAttempts ?? DEFAULT_RETRY_ATTEMPTS,\n });\n }\n\n private async getHeaders(): Promise<Record<string, string>> {\n const token = await this.config.getAuthToken();\n return {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }\n\n /**\n * Handles a GraphQL response, properly handling both successful responses\n * and GraphQL-level errors (which come in a 200 HTTP response)\n * \n * From the GraphQL specification (https://spec.graphql.org/draft/#sec-Errors):\n> * \"When a GraphQL server encounters an error, it should return a response with a \n> * top-level \"errors\" field containing the error information. The response may still contain\n * a partial result in the \"data\" field if the error occurred after some data was already resolved.\"\n * \n * And specifically about HTTP status codes:\n * \"A server should return a 200 status code when a GraphQL operation successfully executes, including when \n * the operation returns errors. A server should return a 400 status code when a GraphQL operation fails to execute.\"\n */\n private handleGraphQLResponse<T>(\n response: HTTPResponse<GraphQLResponse<T>>\n ): APIResponse<T> {\n return {\n data: response.data.data as T,\n metadata: {\n errors: response.data.errors,\n extensions: response.data.extensions,\n },\n };\n }\n\n /**\n * Executes a GraphQL query\n * @param query The GraphQL query string\n * @param variables Optional variables for the query\n * @returns The query result\n * @throws {HTTPError} For HTTP/network errors only\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<APIResponse<T>> {\n try {\n const headers = await this.getHeaders();\n const response = await this.client.request<GraphQLResponse<T>>({\n method: \"POST\",\n url: this.endpoint,\n data: { query, variables },\n headers,\n });\n\n return this.handleGraphQLResponse(response);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Executes a GraphQL mutation\n * @param mutation The GraphQL mutation string\n * @param variables Optional variables for the mutation\n * @returns The mutation result\n * @throws {HTTPError} For HTTP/network errors only\n */\n async mutate<T>(\n mutation: string,\n variables?: Record<string, unknown>\n ): Promise<APIResponse<T>> {\n try {\n const headers = await this.getHeaders();\n const response = await this.client.request<GraphQLResponse<T>>({\n method: \"POST\",\n url: this.endpoint,\n data: { query: mutation, variables },\n headers,\n });\n\n return this.handleGraphQLResponse(response);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Cleanup all HTTP connections and resources\n * Call this when the service is no longer needed\n */\n async destroy(): Promise<void> {\n await this.client.destroy();\n }\n}\n","/**\n * Configuration for OAuth client credentials flow\n */\nexport interface OAuthConfig {\n /** The URL to request the OAuth token from */\n authUrl: string;\n /** The client ID for OAuth authentication */\n clientId: string;\n /** The client secret for OAuth authentication */\n clientSecret: string;\n /** The scope for the OAuth token. Use empty string if no scope is needed. */\n scope: string;\n}\n\n/**\n * Standard OAuth 2.0 token response format as defined in RFC 6749\n */\nexport interface OAuthTokenResponse {\n /** The access token issued by the authorization server */\n access_token: string;\n /** The type of token issued (typically \"Bearer\") */\n token_type: string;\n /** The lifetime in seconds of the access token */\n expires_in: number;\n /** The refresh token, which can be used to obtain new access tokens (optional) */\n refresh_token?: string;\n /** The scope of the access token (optional) */\n scope?: string;\n}\n\n/**\n * A utility class for handling OAuth client credentials flow.\n * This is specifically for the client credentials grant type,\n * which is used for server-to-server authentication.\n */\nexport class OAuthClient {\n constructor(private config: OAuthConfig) {}\n\n /**\n * Requests an OAuth token using the client credentials flow.\n * The request is sent as application/x-www-form-urlencoded.\n * @returns A promise that resolves to the token response containing access_token and expires_in\n * @throws Error if the token request fails\n */\n async getToken(): Promise<OAuthTokenResponse> {\n const formData = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n scope: this.config.scope,\n });\n\n const response = await fetch(this.config.authUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`OAuth token request failed: ${response.statusText}`);\n }\n\n const data = (await response.json()) as OAuthTokenResponse;\n if (data.token_type !== \"Bearer\") {\n throw new Error(`Unexpected token type: ${data.token_type}`);\n }\n\n return data;\n }\n}\n","import Bree, { Job } from \"bree\";\nimport Graceful from \"@ladjs/graceful\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { CoreConfiguration } from \"./configuration-manager\";\nimport logger from \"../reporting-service/logger\";\n\nexport const runDataSyncService = async (connectorPath: string) => {\n const config = CoreConfiguration.inst();\n\n try {\n // Find the SDK's node_modules directory and jobs path using ES module import\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n\n // Navigate from current file to the SDK root and then to jobs\n // Current: /path/to/sdk/dist/mm-erp-sdk.js.js\n // Target: /path/to/sdk/dist/services/data-sync-service/jobs\n const sdkDistPath = path.dirname(currentFilePath);\n const jobsPath = path.join(\n sdkDistPath,\n \"services\",\n \"data-sync-service\",\n \"jobs\"\n );\n\n const bree = new Bree({\n root: jobsPath,\n logger,\n worker: {\n env: {\n CONNECTOR_PATH: connectorPath,\n // Pass through all required environment variables\n MM_MAPPING_SERVICE_URL: process.env.MM_MAPPING_SERVICE_URL,\n MM_MAPPING_AUTH_SERVICE_URL: process.env.MM_MAPPING_AUTH_SERVICE_URL,\n MM_MAPPING_SERVICE_TOKEN: process.env.MM_MAPPING_SERVICE_TOKEN,\n ERP_SYSTEM: process.env.ERP_SYSTEM,\n LOG_LEVEL: process.env.LOG_LEVEL,\n NODE_ENV: process.env.NODE_ENV,\n RETRY_ATTEMPTS: process.env.RETRY_ATTEMPTS,\n CACHE_TTL: process.env.CACHE_TTL,\n // Pass through all other environment variables that might be needed\n ...process.env,\n },\n },\n jobs: [\n // {\n // name: 'run-migrations', // Running this once on startup will create the tables in the sqlite database\n // },\n {\n name: \"from-erp\",\n timeout: \"10s\",\n interval: config.fromErpInterval,\n },\n {\n name: \"to-erp\",\n //timeout: '3s', // Use timeout during development to see the job in action quickly\n interval: config.toErpInterval,\n },\n {\n name: \"retry-failed-labor-tickets\",\n interval: config.retryLaborTicketsInterval,\n },\n {\n name: \"clean-up-expired-cache\",\n interval: config.cacheExpirationCheckInterval,\n },\n ],\n });\n\n logger.info(\n \"\\n================================INITIATING DATA SYNC CYCLES (Bree)================================\\n\"\n );\n const jobsConfig = bree.config.jobs.map((job: Job) => ({\n name: job.name,\n interval: job.interval,\n timeout: job.timeout,\n }));\n logger.info(\"JOBS CONFIGURATION:\", { jobs: jobsConfig });\n\n const graceful = new Graceful({ brees: [bree] });\n graceful.listen();\n\n (async () => {\n await bree.start();\n })();\n\n bree.on(\"jobStarted\", (job) => {\n console.log(\"Job \" + job.name + \" started\");\n });\n\n bree.on(\"jobCompleted\", (job) => {\n if (job.error) {\n console.error(\"Job \" + job.name + \" failed:\", job.error);\n } else {\n console.log(\"Job \" + job.name + \" completed successfully!\");\n }\n });\n\n bree.on(\"error\", (error) => {\n console.error(\"Bree error:\", error);\n });\n\n // Exit and let the jobs take over\n logger.info(\n \"\\n================================DATA SYNC CYCLES INITIATION COMPLETED================================\\n\"\n );\n } catch (error) {\n logger.error(\"startUp: Error initiating data sync cycles:\", error);\n }\n};\n","import { z } from \"zod\";\nexport const SQLServerConfigSchema = z.object({\n user: z.string().nonempty(\"User is required.\"),\n password: z.string().nonempty(\"Password is required.\"),\n database: z.string().nonempty(\"Database name is required.\"),\n server: z.string().nonempty(\"Server is required.\"),\n port: z.coerce.number().int().positive(\"Port must be a positive integer.\").default(1433),\n connectionTimeout: z.coerce\n .number()\n .int()\n .positive(\"Connection timeout must be a positive integer.\")\n .default(30000),\n requestTimeout: z.coerce\n .number()\n .int()\n .positive(\"Request timeout must be a positive integer.\")\n .default(60000),\n pool: z.object({\n max: z.coerce\n .number()\n .int()\n .positive(\"Max pool size must be a positive integer.\")\n .default(10),\n min: z.coerce\n .number()\n .int()\n .nonnegative(\"Min pool size must be a non-negative integer.\")\n .default(0),\n idleTimeoutMillis: z.coerce\n .number()\n .int()\n .nonnegative(\"Idle timeout must be a non-negative integer.\")\n .default(30000),\n }),\n options: z.object({\n encrypt: z.coerce.boolean().default(false),\n trustServerCertificate: z.coerce.boolean().default(false),\n }),\n});\n","import sql, { ConnectionPool, IRecordSet } from \"mssql\";\nimport { SQLServerConfigSchema } from \"./internal/sql-server-config\";\nimport logger from \"../reporting-service/logger\";\nimport { ERPResponse } from \"../../types/erp-types\";\nimport { SQLServerConfiguration } from \"./configuration\";\n\ntype PagingParams = {\n limit?: number;\n offset?: number;\n};\n\nexport class SqlServerService {\n private connection: ConnectionPool | null = null;\n private config: SQLServerConfiguration;\n\n constructor(config: SQLServerConfiguration) {\n this.config = config;\n }\n\n async dispose() {\n await this.closeConnection();\n }\n\n /**\n * Execute a prepared statement and return the results\n *\n * @param statementToPrepare The SQL query to prepare\n * @param params The parameters to bind to the prepared statement\n * @param paging Optional paging parameters\n * @returns The entities fetched from the database, along with paging information\n */\n public async executePreparedStatement(\n statementToPrepare: string,\n params: Record<string, string>,\n paging?: PagingParams\n ): Promise<ERPResponse | undefined> {\n const connection = await this.openConnection();\n\n const preparedStatement = new sql.PreparedStatement(connection);\n\n // Add all parameters as inputs\n Object.keys(params).forEach((key) => {\n preparedStatement.input(key, sql.VarChar);\n });\n\n // If limit is specified, try SQL paging\n const finalQuery =\n paging?.limit !== undefined\n ? `${statementToPrepare} OFFSET ${paging.offset || 0} ROWS FETCH NEXT ${paging.limit} ROWS ONLY`\n : statementToPrepare;\n\n await preparedStatement.prepare(finalQuery);\n\n let records;\n try {\n records = await preparedStatement.execute(params);\n } catch (error) {\n const errorInfo = error as Error;\n const errorMessage =\n \"Error fetching data from ERP -> \" +\n (errorInfo.cause ? `Cause: ${errorInfo.cause}. ` : \"\") +\n `Name: ${errorInfo.name}. ` +\n `Message: ${errorInfo.message}. ` +\n `Stack: ${errorInfo.stack}`;\n\n throw new Error(errorMessage);\n } finally {\n try {\n await preparedStatement.unprepare();\n } catch (unprepareError) {\n logger.error(\"Error during unprepare:\", unprepareError);\n }\n }\n\n const allRecords = SqlServerService.recordsetToRecords(records?.recordset);\n const rowsFetched = records?.rowsAffected[0] || 0;\n\n // If SQL paging failed or we need to handle offset, apply in-memory paging\n const pagedData =\n paging?.offset !== undefined\n ? allRecords.slice(\n paging.offset,\n (paging.offset || 0) + (paging.limit || allRecords.length)\n )\n : allRecords;\n\n return {\n data: pagedData,\n paging: {\n count: rowsFetched,\n limit: paging?.limit || 0,\n offset: paging?.offset || 0,\n nextPage: (() => {\n const currentPageEnd = (paging?.offset || 0) + (paging?.limit || 0);\n return paging?.limit && currentPageEnd < rowsFetched\n ? String(currentPageEnd)\n : undefined;\n })(),\n previousPage: paging?.offset\n ? String(Math.max(0, (paging.offset || 0) - (paging.limit || 10)))\n : undefined,\n },\n };\n }\n\n /**\n * Opens a connection to SQL Server\n * Caches the connection so that it can be reused.\n * On failure to connect, throws\n */\n async openConnection(): Promise<ConnectionPool> {\n // If we have a connection and it's still connected, reuse it\n if (this.connection?.connected) {\n logger.debug(\"Reusing existing SQL Server connection\");\n return this.connection;\n }\n\n // If we have a connection but it's not connected, just null it out\n if (this.connection) {\n logger.debug(\"Clearing disconnected SQL Server connection\");\n this.connection = null;\n }\n\n try {\n logger.info(\"Opening new SQL Server connection\");\n const sqlConfig = SQLServerConfigSchema.parse({\n user: this.config.username,\n password: this.config.password,\n database: this.config.database,\n server: this.config.host,\n port: parseInt(this.config.port),\n connectionTimeout: parseInt(this.config.connectionTimeout),\n requestTimeout: parseInt(this.config.requestTimeout),\n pool: {\n max: parseInt(this.config.poolMax),\n min: parseInt(this.config.poolMin),\n idleTimeoutMillis: parseInt(this.config.idleTimeoutMillis),\n },\n options: {\n encrypt: this.config.encrypt,\n trustServerCertificate: this.config.trustServer,\n },\n });\n\n this.connection = await sql.connect(sqlConfig);\n return this.connection;\n } catch (error) {\n logger.error(\"SqlServerService>>openConnection>> Connection failed\", {\n error,\n });\n throw new Error(\"SQL Server connection failed\");\n }\n }\n\n /**\n * Transform a IRecordSet from a SQL query into an array of Record<string, string> instances.\n * @param recordset IRecordSet from a SQL query\n * @returns array of Record<string, string> instances\n */\n public static recordsetToRecords(\n recordset?: IRecordSet<Record<string, unknown>>\n ): Record<string, string>[] {\n const data: Record<string, string>[] =\n recordset?.map((row) => {\n const transformedRow: Record<string, string> = {};\n Object.keys(row).forEach((key) => {\n transformedRow[key] = row[key]?.toString() || \"\";\n });\n return transformedRow;\n }) || [];\n\n return data;\n }\n\n private async closeConnection(): Promise<void> {\n if (this.connection?.connected) {\n logger.info(\"Closing SQL Server connection\");\n try {\n await this.connection.close();\n } catch (error) {\n logger.error(\n \"SqlServerService::closeConnection: Error closing connection\",\n {\n error,\n }\n );\n }\n this.connection = null;\n }\n }\n}\n","import sql from \"mssql\";\nimport logger from \"../../reporting-service/logger\";\n\nexport interface SQLTransactionConfig {\n isolationLevel?: sql.IIsolationLevel;\n}\n\nexport interface SQLTransactionOperation<T, R> {\n execute(transaction: sql.Transaction, data: T): Promise<R>;\n}\n\nexport class SQLTransactionManager {\n constructor(private connection: sql.ConnectionPool) {}\n /**\n * Executes a transaction with the given operation and data, manages rollbacks\n * @param operation The SQLTransactionOperation to execute\n * @param data The sql input parameters to pass to the operation\n * @param config The configuration for the transaction\n * @returns The result of the operation; throws exceptions on failures\n */\n async executeTransaction<T, R>(\n operation: SQLTransactionOperation<T, R>,\n data: T,\n config: SQLTransactionConfig = {}\n ): Promise<R | undefined> {\n const transaction = new sql.Transaction(this.connection);\n const isolationLevel =\n config.isolationLevel || sql.ISOLATION_LEVEL.READ_COMMITTED;\n\n try {\n await transaction.begin(isolationLevel);\n const result = await operation.execute(transaction, data);\n await transaction.commit();\n return result;\n } catch (error) {\n logger.error(\"Transaction error:\", error);\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n logger.error(\"Rollback error:\", rollbackError);\n }\n throw error;\n }\n }\n}\n","import sql from \"mssql\";\nimport { SQLInput } from \"../types/sql-input-param\";\nimport { SQLTransactionOperation } from \"./sql-transaction-manager\";\n\n/**\n * Insert a new labor ticket into the database.\n * Create a query named laborTicketsInsert in the sql_toERP folder, add its inputs to the SQLInput array\n * The laborTicketsInsert query is expected to return the NewRowUniqueId of the inserted labor ticket\n *\n * @param transaction The SQL transaction object\n * @param inputs The SQL input parameters\n * @returns The NewRowUniqueId of the inserted labor ticket\n */\nexport class SQLLaborTicketInsertOperation\n implements SQLTransactionOperation<SQLInput[], number>\n{\n constructor(private readonly sqlQuery: string) {}\n\n async execute(\n transaction: sql.Transaction,\n inputs: SQLInput[]\n ): Promise<number> {\n const request = transaction.request();\n inputs.forEach((input) => {\n request.input(input.name, input.type, input.value);\n });\n\n const result = await request.query(this.sqlQuery);\n\n if (!result.recordset[0].NewRowUniqueId) {\n throw new Error(\n \"No LaborTicketId generated by the labor ticket insert query: \" +\n JSON.stringify(request.parameters, null, 2)\n );\n }\n\n return result.recordset[0].NewRowUniqueId;\n }\n}\n\n/**\n * Update an existing labor ticket in the database.\n * Create a query named laborTicketsUpdate in the sql_toERP folder, add its inputs to the SQLInput array\n *\n * @param transaction The SQL transaction object\n * @param inputs The SQL input parameters\n * @returns The number of rows affected\n */\nexport class SQLLaborTicketUpdateOperation\n implements SQLTransactionOperation<SQLInput[], number>\n{\n constructor(private readonly sqlQuery: string) {}\n\n async execute(\n transaction: sql.Transaction,\n inputs: SQLInput[]\n ): Promise<number> {\n const request = transaction.request();\n inputs.forEach((input) => {\n request.input(input.name, input.type, input.value);\n });\n\n const result = await request.query(this.sqlQuery);\n return result.rowsAffected[0];\n }\n}\n","import { SQLTransactionManager } from \"./internal/sql-transaction-manager\";\nimport {\n SQLLaborTicketInsertOperation,\n SQLLaborTicketUpdateOperation,\n} from \"./internal/sql-labor-ticket-operations\";\nimport { MMReceiveLaborTicket } from \"../mm-api-service/types/receive-types\";\nimport { SqlServerService } from \"./sql-server-service\";\nimport logger from \"../reporting-service/logger\";\nimport { SQLInput } from \"./types/sql-input-param\";\n\nexport class SqlServerHelper {\n /**\n * Creates a new labor ticket in the SQL Server database\n * Opens but does not close the connection\n *\n * @param sqlServerService The SQL Server service to use for connections\n * @param laborTicket The labor ticket to create\n * @param sqlInputs The SQL query parameters\n * @param insertQuery The SQL query to execute for insertion\n *\n * @returns The processed labor ticket, with the ERP's laborTicketId set\n * Throws exceptions on failures, including if the query does not return a laborTicketId\n */\n static async createLaborTicket(\n sqlServerService: SqlServerService,\n laborTicket: MMReceiveLaborTicket,\n sqlInputs: SQLInput[],\n insertQuery: string\n ): Promise<MMReceiveLaborTicket> {\n const connection = await sqlServerService.openConnection();\n if (!connection) {\n throw new Error(\n \"Unable to establish database connection to create labor ticket.\"\n );\n }\n\n const transactionManager = new SQLTransactionManager(connection);\n const laborTicketId = await transactionManager.executeTransaction(\n new SQLLaborTicketInsertOperation(insertQuery),\n sqlInputs\n );\n\n if (laborTicketId) {\n laborTicket.laborTicketId = laborTicketId.toString();\n return laborTicket;\n } else {\n throw new Error(\n `The query did not return the labor ticket id for labor ticket ref: ${laborTicket.laborTicketRef}`\n );\n }\n }\n\n /**\n * Updates an existing labor ticket in the SQL Server database\n * Opens but does not close the connection\n * @param sqlServerService The SQL Server service to use for connections\n * @param laborTicket The labor ticket to update\n * @param sqlInputs The SQL query parameters\n * @param updateQuery The SQL query to execute for update\n *\n * @returns The processed labor ticket\n * Throws exceptions on failures\n */\n static async updateLaborTicket(\n sqlServerService: SqlServerService,\n laborTicket: MMReceiveLaborTicket,\n sqlInputs: SQLInput[],\n updateQuery: string\n ): Promise<MMReceiveLaborTicket> {\n const connection = await sqlServerService.openConnection();\n if (!connection) {\n throw new Error(\n \"Unable to establish database connection to update labor ticket.\"\n );\n }\n\n const transactionManager = new SQLTransactionManager(connection);\n await transactionManager.executeTransaction(\n new SQLLaborTicketUpdateOperation(updateQuery),\n sqlInputs\n );\n\n return laborTicket;\n }\n\n /**\n * Logs the SQL input parameters for debugging\n */\n static logQueryInputs(inputs: SQLInput[]): void {\n logger.info(\"SQL Input Variables:\");\n logger.info(\"----------------------------------------\");\n logger.info(\"Variable Name | Value\");\n logger.info(\"----------------------------------------\");\n inputs.forEach((input) => {\n logger.info(`${input.name.padEnd(20)} | ${input.value}`);\n });\n logger.info(\"----------------------------------------\");\n }\n}\n"],"names":["ERPType","ERPObjType","Operator","config","c","httpError","UrlBase","path","a","laborTicketResult","DEFAULT_RETRY_ATTEMPTS","query"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mm-erp-sdk.js","sources":["../src/types/erp-types.ts","../src/services/erp-api-services/rest/get-query-params.ts","../src/services/mm-api-service/types/receive-types.ts","../src/utils/http-client.ts","../src/services/mm-api-service/token-mgr.ts","../src/services/erp-api-services/errors.ts","../src/services/mm-api-service/mm-api-service.ts","../src/services/mm-api-service/types/send-types.ts","../src/utils/uniqueRows.ts","../src/utils/removeExtraneousFields.ts","../src/utils/removeIdFieldFromPayload.ts","../src/utils/trimObjectValues.ts","../src/utils/cleanup-numbers.ts","../src/utils/data-transformation.ts","../src/utils/timezone.ts","../src/utils/time-utils.ts","../src/services/caching-service/record-tracking-manager.ts","../src/services/caching-service/batch-cache-manager.ts","../src/utils/mm-labor-ticket-helpers.ts","../src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts","../src/services/mm-api-service/types/entity-transformer.ts","../src/utils/standard-process-drivers/error-processor.ts","../src/utils/standard-process-drivers/mm-entity-processor.ts","../src/utils/standard-process-drivers/standard-process-drivers.ts","../src/services/erp-api-services/rest/rest-api-service.ts","../src/utils/erp-type-from-entity.ts","../src/utils/error-utils.ts","../src/utils/connector-log/mm-connector-logger.ts","../src/utils/connector-log/log-deduper.ts","../src/utils/application-initializer.ts","../src/services/erp-api-services/graphql/graphql-service.ts","../src/services/erp-api-services/oauth-client.ts","../src/services/data-sync-service/data-sync-service.ts","../src/services/sql-server-erp-service/internal/sql-server-config.ts","../src/services/sql-server-erp-service/sql-server-service.ts","../src/services/sql-server-erp-service/internal/sql-transaction-manager.ts","../src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts","../src/services/sql-server-erp-service/sql-server-helpers.ts","../node_modules/@mapbox/node-pre-gyp/lib/util/s3_setup.js","../node_modules/abbrev/abbrev.js","../node_modules/nopt/lib/nopt.js","../node_modules/are-we-there-yet/lib/tracker-base.js","../node_modules/are-we-there-yet/lib/tracker.js","../node_modules/delegates/index.js","../node_modules/are-we-there-yet/lib/tracker-stream.js","../node_modules/are-we-there-yet/lib/tracker-group.js","../node_modules/are-we-there-yet/lib/index.js","../node_modules/console-control-strings/index.js","../node_modules/ansi-regex/index.js","../node_modules/strip-ansi/index.js","../node_modules/is-fullwidth-code-point/index.js","../node_modules/emoji-regex/index.js","../node_modules/string-width/index.js","../node_modules/wide-align/align.js","../node_modules/aproba/index.js","../node_modules/gauge/wide-truncate.js","../node_modules/gauge/error.js","../node_modules/gauge/template-item.js","../node_modules/gauge/render-template.js","../node_modules/gauge/plumbing.js","../node_modules/has-unicode/index.js","../node_modules/color-support/browser.js","../node_modules/gauge/has-color.js","../node_modules/signal-exit/signals.js","../node_modules/signal-exit/index.js","../node_modules/object-assign/index.js","../node_modules/gauge/spin.js","../node_modules/gauge/progress-bar.js","../node_modules/gauge/base-theme.js","../node_modules/gauge/theme-set.js","../node_modules/gauge/themes.js","../node_modules/gauge/set-interval.js","../node_modules/gauge/process.js","../node_modules/gauge/set-immediate.js","../node_modules/gauge/index.js","../node_modules/set-blocking/index.js","../node_modules/npmlog/log.js","../node_modules/fs.realpath/old.js","../node_modules/fs.realpath/index.js","../node_modules/concat-map/index.js","../node_modules/balanced-match/index.js","../node_modules/brace-expansion/index.js","../node_modules/minimatch/minimatch.js","../node_modules/path-is-absolute/index.js","../node_modules/glob/common.js","../node_modules/glob/sync.js","../node_modules/wrappy/wrappy.js","../node_modules/once/once.js","../node_modules/inflight/inflight.js","../node_modules/glob/glob.js","../node_modules/rimraf/rimraf.js","../node_modules/@mapbox/node-pre-gyp/lib/util/napi.js","../node_modules/semver/internal/constants.js","../node_modules/semver/internal/debug.js","../node_modules/semver/internal/re.js","../node_modules/semver/internal/parse-options.js","../node_modules/semver/internal/identifiers.js","../node_modules/semver/classes/semver.js","../node_modules/semver/functions/parse.js","../node_modules/semver/functions/valid.js","../node_modules/semver/functions/clean.js","../node_modules/semver/functions/inc.js","../node_modules/semver/functions/diff.js","../node_modules/semver/functions/major.js","../node_modules/semver/functions/minor.js","../node_modules/semver/functions/patch.js","../node_modules/semver/functions/prerelease.js","../node_modules/semver/functions/compare.js","../node_modules/semver/functions/rcompare.js","../node_modules/semver/functions/compare-loose.js","../node_modules/semver/functions/compare-build.js","../node_modules/semver/functions/sort.js","../node_modules/semver/functions/rsort.js","../node_modules/semver/functions/gt.js","../node_modules/semver/functions/lt.js","../node_modules/semver/functions/eq.js","../node_modules/semver/functions/neq.js","../node_modules/semver/functions/gte.js","../node_modules/semver/functions/lte.js","../node_modules/semver/functions/cmp.js","../node_modules/semver/functions/coerce.js","../node_modules/semver/internal/lrucache.js","../node_modules/semver/classes/range.js","../node_modules/semver/classes/comparator.js","../node_modules/semver/functions/satisfies.js","../node_modules/semver/ranges/to-comparators.js","../node_modules/semver/ranges/max-satisfying.js","../node_modules/semver/ranges/min-satisfying.js","../node_modules/semver/ranges/min-version.js","../node_modules/semver/ranges/valid.js","../node_modules/semver/ranges/outside.js","../node_modules/semver/ranges/gtr.js","../node_modules/semver/ranges/ltr.js","../node_modules/semver/ranges/intersects.js","../node_modules/semver/ranges/simplify.js","../node_modules/semver/ranges/subset.js","../node_modules/semver/index.js","../node_modules/detect-libc/lib/process.js","../node_modules/detect-libc/lib/filesystem.js","../node_modules/detect-libc/lib/detect-libc.js","../node_modules/@mapbox/node-pre-gyp/lib/util/versioning.js","../node_modules/@mapbox/node-pre-gyp/lib/pre-binding.js","../node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js","../node_modules/odbc/lib/Cursor.js","../node_modules/odbc/lib/Statement.js","../node_modules/odbc/lib/Connection.js","../node_modules/async/dist/async.mjs","../node_modules/odbc/lib/Pool.js","../node_modules/odbc/lib/odbc.js","../src/services/psql-erp-service/psql-service.ts","../src/services/psql-erp-service/internal/psql-labor-ticket-operations.ts","../src/services/psql-erp-service/psql-helpers.ts"],"sourcesContent":["// TO DO: This will change once the SDK is refactored into its own repo\nexport enum ERPType {\n INVALID = \"INVALID\",\n D365 = \"D365\",\n JOB_BOSS = \"JOB_BOSS\",\n PROFITKEY = \"PROFITKEY\",\n PROSHOP = \"PROSHOP\",\n SYTELINE = \"SYTELINE\",\n TEMPLATE = \"TEMPLATE\",\n GLOBALSHOP = \"GLOBALSHOP\",\n}\n\nexport enum ERPObjType {\n RESOURCES,\n PARTS,\n PART_OPERATION,\n WORK_ORDERS,\n WORK_ORDER_OPERATIONS,\n PERSONS,\n REASONS,\n LABOR_TICKETS,\n // TO DO: TIMESHEETS support\n}\n\nexport interface ERPPagination {\n count: number;\n limit: number;\n nextPage: string | undefined;\n previousPage: string | undefined;\n offset?: number;\n}\n\nexport interface ERPResponse {\n data: Record<string, string>[];\n paging: ERPPagination;\n}\n\nexport type ERPObject = Record<string, string>;\n","/**\n * Types and utilities for handling GET query parameters and responses\n */\n\nexport enum Operator {\n eq = \"eq\",\n lt = \"lt\",\n lte = \"lte\",\n gt = \"gt\",\n gte = \"gte\",\n}\n\nexport type LogicalCondition = {\n field: string;\n value: string;\n operator: Operator;\n};\n\nexport type InCondition = { field: string; value: Array<string> };\n\n/**\n * QueryParams is specifically used for the get API, defining pagination and filters\n */\nexport interface QueryParams {\n limit?: number;\n nextPage?: string;\n previousPage?: string;\n filter?: {\n in?: InCondition[];\n and?: LogicalCondition[];\n or?: LogicalCondition[];\n };\n}\n\nexport interface Pagination {\n count: number;\n limit: number;\n nextPage?: string;\n previousPage?: string;\n}\n\nexport interface PaginatedAPIResponse<T> {\n data: T[];\n paging: Pagination;\n}\n\n/**\n * Builds a logical condition string from an array of conditions\n * @param conditions Array of logical conditions\n * @param operator The logical operator to use ('and' or 'or')\n * @returns A string representation of the logical conditions\n */\nexport const buildLogicalCondition = (\n conditions: LogicalCondition[],\n operator: \"and\" | \"or\"\n): string => {\n return conditions\n .map(\n (condition) =>\n `${condition.field} ${condition.operator} '${condition.value}'`\n )\n .join(` ${operator} `);\n};\n","//#region MMReceiveLaborTicket\n/**\n * Represents a labor ticket as received from the MM API /erp/v1/labor-tickets/export/updates\n */\nexport class MMReceiveLaborTicket {\n constructor(data: Partial<MMReceiveLaborTicket>) {\n Object.assign(this, data);\n }\n\n // Returns the closed date if it is a valid date, otherwise returns null\n get workOrderOperationClosedDate(): string | null {\n const closedDate = this.workOrderOperation?.closedDate;\n return typeof closedDate === \"string\" &&\n closedDate !== \"\" &&\n !isNaN(Date.parse(closedDate))\n ? closedDate\n : null;\n }\n\n set workOrderOperationClosedDate(value: string | null) {\n if (this.workOrderOperation) {\n this.workOrderOperation.closedDate = value;\n }\n }\n\n // Returns 1 if the work order operation is closed (has a valid closed date), 0 otherwise\n get workOrderOpIsClosed(): number {\n return this.workOrderOperationClosedDate !== null ? 1 : 0;\n }\n\n /*Descriptions from machinemetrics.atlassian.net/wiki/spaces/DEVE/pages/842661901/MM+ERP+Schema+Descriptions*/\n\n badParts!: number; // The number of parts produced that do not meet quality standards\n clockIn!: string | null; // The timestamp when the work on this ticket started\n clockOut!: string | null; // The timestamp when the work on this ticket ended\n comment!: string | null;\n createdAt!: string | null;\n goodParts!: number; // The number of parts produced that meet quality standards\n laborTicketId!: string; // The unique identifier for the labor ticket in the ERP\n laborTicketRef!: string; // The unique identifier for the labor ticket in MM\n lot!: string; // Refers to a material batch. If not available in the ERP, default to an empty string\n personId!: string; // The person who did the work\n reasons?: MMReceiveLaborTicketReason[];\n resourceId!: string; // The physical resource that did the work\n sequenceNumber!: number; // Which sequence this operation is for in the order, associates back to a part_operation with the part_number from the work_order, and sequence_number from the op\n split!: string; // Batch number if order split for staggered delivery. If not available in the ERP, default to an empty string\n state!: string; // The current state of the labor ticket (e.g., \"CLOSED/OPEN\")\n type!: string; // If the labor is production, setup, or indirect\n syncedAt!: string | null;\n updatedAt!: string | null;\n workOrderId!: string; // The order this labor ticket corresponds to\n workOrderOperation?: MMReceiveLaborTicketWorkOrderOperation;\n sub!: string; // Batch number for parts that had to be rerun. If not available in the ERP, default to an empty string\n transactionDate!: string | null;\n}\n\n/**\n * Represents a reason in the MMApiReceiveLaborTicket object as received from MM\n */\nexport interface MMReceiveLaborTicketReason {\n reason: {\n annotationTypeRef: string | null;\n category: string; // Parent group if applicable (optional)\n code: string; // The functional name of the label\n companyId: string;\n createdAt: string;\n description: string;\n entityType: string; // Whether it represents machine downtime or rejected parts context (downtime/quality)\n reasonId: string; // Unique identifier in the ERP\n reasonRef: number;\n rejectReasonRef: number;\n updatedAt: string | null;\n };\n}\n\n/**\n * Represents a work order operation in the MMApiReceiveLaborTicket object, incomplete when\n * pulling updated labor tickets from MM\n */\nexport interface MMReceiveLaborTicketWorkOrderOperation {\n closedDate: string | null; // non-null and a valid date if the work order operation is closed\n}\n//#endregion MMReceiveLaborTicket\n\n//#region MMReceiveTimesheet\n\n// MLW TODO\n\n// #endregion MMReceiveTimesheet\n","import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport logger from \"../services/reporting-service/logger\";\n\nexport class HTTPError extends Error {\n constructor(\n message: string,\n public status: number,\n public code?: string,\n public data?: unknown\n ) {\n super(message);\n this.name = \"HTTPError\";\n }\n}\n\nexport type HTTPMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface HTTPRequestConfig {\n method: HTTPMethod;\n url: string;\n headers?: Record<string, string>;\n data?: unknown;\n params?: Record<string, string>;\n}\n\nexport interface HTTPResponse<T = unknown> {\n data: T;\n status: number;\n headers: Record<string, string>;\n}\n\nexport interface HTTPClient {\n request<T = unknown>(config: HTTPRequestConfig): Promise<HTTPResponse<T>>;\n handleError(error: unknown): HTTPError;\n destroy(): Promise<void>;\n}\n\nexport interface HTTPClientConfig {\n baseUrl: string;\n retryAttempts: number;\n}\n\n/**\n * This is a factory class for creating HTTPClient instances, at least for now\n * just a wrapper around AxiosClient\n */\nexport class HTTPClientFactory {\n static getInstance(config: HTTPClientConfig): HTTPClient {\n return new AxiosClient(config.baseUrl, config.retryAttempts);\n }\n}\n\nclass AxiosClient implements HTTPClient {\n private client: AxiosInstance | null = null;\n private retryAttempts: number;\n private isDestroyed: boolean = false;\n private inFlightControllers: Set<AbortController> = new Set();\n private pendingTimeouts: Set<ReturnType<typeof setTimeout>> = new Set();\n private pendingSleepResolvers: Set<() => void> = new Set();\n\n /**\n * Note regarding baseURL, from https://github.com/axios/axios\n * `baseURL` will be prepended to `url` unless `url` is absolute and option `allowAbsoluteUrls` is set to true (the default).\n * It can be convenient to set `baseURL` for an instance of axios to pass relative URLs to methods of that instance.\n */\n constructor(baseUrl: string, retryAttempts: number) {\n this.client = axios.create({\n baseURL: baseUrl,\n timeout: 30000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n this.retryAttempts = retryAttempts;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n if (this.isDestroyed) {\n resolve();\n return;\n }\n const timeout = setTimeout(() => {\n this.pendingTimeouts.delete(timeout);\n this.pendingSleepResolvers.delete(resolve);\n resolve();\n }, ms);\n this.pendingTimeouts.add(timeout);\n this.pendingSleepResolvers.add(resolve);\n });\n }\n\n async request<T = unknown>(\n config: HTTPRequestConfig\n ): Promise<HTTPResponse<T>> {\n if (this.isDestroyed || !this.client) {\n throw new HTTPError(\"HTTP client has been destroyed\", 500);\n }\n\n const controller = new AbortController();\n this.inFlightControllers.add(controller);\n\n const axiosConfig: AxiosRequestConfig = {\n method: config.method,\n url: config.url,\n headers: config.headers,\n data: config.data,\n params: config.params,\n signal: controller.signal,\n };\n\n logger.info(\"HTTP request starting\", { \n url: config.url, \n method: config.method, \n baseURL: this.client.defaults.baseURL,\n retryAttempts: this.retryAttempts \n });\n \n // Extra console.log for debugging\n console.log(\"=== FULL URL DEBUG ===\");\n console.log(\"baseURL:\", this.client.defaults.baseURL);\n console.log(\"relative url:\", config.url);\n console.log(\"full constructed URL:\", (this.client.defaults.baseURL || \"\") + config.url);\n console.log(\"method:\", config.method);\n\n let lastError: unknown;\n try {\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n logger.info(`HTTP request attempt ${attempt + 1}/${this.retryAttempts + 1}`);\n const response = await this.client.request<T>(axiosConfig);\n logger.info(\"HTTP request succeeded\", { status: response.status });\n return {\n data: response.data,\n status: response.status,\n headers: response.headers as Record<string, string>,\n };\n } catch (error) {\n lastError = error;\n\n const isAxiosErr = error instanceof AxiosError;\n const code = isAxiosErr ? error.code : undefined;\n const status = isAxiosErr ? error.response?.status : undefined;\n const errorConstructor = error instanceof Error ? error.constructor.name : undefined;\n const message = error instanceof Error ? error.message : String(error);\n \n logger.info(`HTTP request attempt ${attempt + 1} failed`, {\n errorType: typeof error,\n errorConstructor,\n isAxiosError: isAxiosErr,\n message,\n code,\n status,\n });\n\n // Don't retry on 4xx errors (client errors)\n if (\n error instanceof AxiosError &&\n error.response?.status &&\n error.response.status >= 400 &&\n error.response.status < 500\n ) {\n logger.info(\"Not retrying due to 4xx client error\");\n break;\n }\n\n // Don't retry canceled/aborted requests\n if (error instanceof AxiosError && error.code === \"ERR_CANCELED\") {\n break;\n }\n\n // If this was the last attempt, don't wait\n if (attempt < this.retryAttempts) {\n const waitTime = Math.pow(2, attempt) * 1000;\n logger.info(`Waiting ${waitTime}ms before retry`);\n await this.sleep(waitTime);\n if (this.isDestroyed) {\n throw new HTTPError(\"HTTP client has been destroyed\", 500);\n }\n }\n }\n }\n } finally {\n this.inFlightControllers.delete(controller);\n }\n logger.info(\"HTTP request failed after all retries, throwing error\");\n throw this.handleError(lastError, config);\n }\n\n handleError(error: unknown, requestConfig?: HTTPRequestConfig): HTTPError {\n if (error instanceof AxiosError) {\n // Build a more descriptive error message that includes the URL and method\n const baseUrl = this.client?.defaults.baseURL || \"\";\n const fullUrl = requestConfig\n ? `${baseUrl}${requestConfig.url}`\n : \"Unknown URL\";\n const method = requestConfig?.method || \"Unknown method\";\n\n const errorMessage = `${error.message} (${method} ${fullUrl})`;\n\n return new HTTPError(\n errorMessage,\n error.response?.status || 500,\n error.code,\n error.response?.data\n );\n }\n return new HTTPError(\n error instanceof Error ? error.message : \"Unknown error occurred\",\n 500\n );\n }\n\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n // Abort any in-flight requests\n for (const c of this.inFlightControllers) {\n try { c.abort(); } catch { /* ignore: abort may throw in some environments */ }\n }\n this.inFlightControllers.clear();\n\n // Cancel any pending retry waits\n for (const t of this.pendingTimeouts) {\n clearTimeout(t);\n }\n this.pendingTimeouts.clear();\n for (const resolve of this.pendingSleepResolvers) {\n try { resolve(); } catch { /* ignore: resolver threw; cleanup proceeds */ }\n }\n this.pendingSleepResolvers.clear();\n\n // Drop axios instance reference\n this.client = null;\n }\n}\n","import {\n getCachedMMToken,\n setCachedMMToken,\n} from \"../../utils/local-data-store/jobs-shared-data\";\nimport { HTTPClient, HTTPClientFactory } from \"../../utils/http-client\";\nimport { CoreConfiguration } from \"../data-sync-service/configuration-manager\";\nimport { logger } from \"../reporting-service\";\n\n/**\n * Manages the MM API token with caching and expiration checking\n * Tokens are cached across jobs and job instances in local-data-store/jobs-shared-data.ts\n * @jest-environment node\n */\nexport class MMTokenManager {\n private token: string;\n private tokenExpiration: Date | null;\n private baseUrl: string;\n private api: HTTPClient;\n\n constructor() {\n const cached = getCachedMMToken();\n this.token = cached?.token || \"\";\n this.tokenExpiration = cached?.expiration\n ? new Date(cached.expiration)\n : null;\n const config = CoreConfiguration.inst();\n console.log(\"=== MMTOKEN MANAGER DEBUG ===\");\n console.log(\"config.mmApiBaseUrl:\", config.mmApiBaseUrl);\n console.log(\"config object keys:\", Object.keys(config));\n this.baseUrl = config.mmApiBaseUrl;\n console.log(\"this.baseUrl set to:\", this.baseUrl);\n console.log(\"=== END MMTOKEN MANAGER DEBUG ===\");\n this.api = HTTPClientFactory.getInstance({\n baseUrl: this.baseUrl,\n retryAttempts: config.mmApiRetryAttempts,\n });\n }\n\n /**\n * Checks if the current token is expired or will expire within the next minute\n * @returns boolean indicating if token needs refresh\n */\n private isTokenExpired(): boolean {\n if (!this.tokenExpiration) return true;\n\n // Add 1 minute buffer to ensure we refresh before actual expiration\n const bufferTimeMS = 60_000;\n const isExpired =\n this.tokenExpiration.getTime() - bufferTimeMS <= Date.now();\n if (isExpired) {\n logger.info(\"isTokenExpired: the api token from MM has expired\");\n }\n return isExpired;\n }\n\n /**\n * Safely extracts expiration time from JWT token\n * @param token JWT token string\n * @returns Date object representing token expiration, or null if cannot be determined\n */\n private getTokenExpiration(token: string): Date | null {\n try {\n // Split token into parts\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n console.warn(\"Invalid JWT format: token does not have 3 parts\");\n return null;\n }\n\n // Decode payload (second part)\n const payload = Buffer.from(parts[1], \"base64\").toString(\"utf-8\");\n const decodedPayload = JSON.parse(payload);\n\n // Check if exp claim exists\n if (typeof decodedPayload.exp !== \"number\") {\n console.warn(\"JWT does not contain expiration time (exp claim)\");\n return null;\n }\n\n // Convert Unix timestamp (seconds) to Date\n return new Date(decodedPayload.exp * 1000);\n } catch (error) {\n console.warn(\"Error parsing JWT token:\", error);\n return null;\n }\n }\n\n /**\n * Gets a valid token, either from cache or by requesting a new one\n * @returns Promise resolving to a valid token string\n */\n public async getToken(): Promise<string> {\n if (this.token && !this.isTokenExpired()) {\n return this.token;\n }\n\n const config = CoreConfiguration.inst();\n const serviceToken = config.mmApiAuthToken;\n const tokenResponse = await this.api.request<string>({\n url: \"/user-token\",\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${serviceToken}`,\n },\n });\n\n this.token = tokenResponse.data;\n this.tokenExpiration = this.getTokenExpiration(this.token);\n\n // Cache the new token and its expiration\n setCachedMMToken({\n token: this.token,\n expiration: this.tokenExpiration?.getTime() || null,\n });\n\n logger.info(\"getToken: the api token from MM has been refreshed\");\n return this.token;\n }\n\n /**\n * Invalidates the current token, forcing a fresh fetch on next getToken() call\n */\n public invalidateToken(): void {\n this.token = \"\";\n this.tokenExpiration = null;\n setCachedMMToken({ token: \"\", expiration: null });\n }\n}\n","import { AxiosError } from \"axios\";\nimport logger from \"../reporting-service/logger\";\nimport { GraphQLServerError } from \"./graphql/types\";\nimport { HTTPError } from \"../../utils/http-client\";\n\n/**\n * Represents GraphQL specific errors (validation, missing fields, etc.)\n */\nexport class GraphQLError extends Error {\n constructor(\n message: string,\n public errors: GraphQLServerError[]\n ) {\n super(message);\n this.name = \"GraphQLError\";\n }\n}\n\n/**\n * Centralized error handling for API requests.\n * Transforms various error types into standardized HTTPError or GraphQLError.\n */\nexport class ErrorHandler {\n /**\n * Transforms any error into a standardized HTTPError or GraphQLError and throws it.\n * Never returns - always throws an error.\n *\n * @throws {HTTPError|GraphQLError} Standardized error with appropriate details\n */\n static handle(error: unknown): never {\n // Handle HTTPError (already processed by http-client)\n if (error instanceof HTTPError) {\n // For GraphQL responses with errors in the data\n if (\n error.data &&\n typeof error.data === \"object\" &&\n \"errors\" in error.data\n ) {\n const graphqlError = new GraphQLError(\n \"GraphQL Error\",\n (error.data as { errors: GraphQLServerError[] }).errors\n );\n\n // Log the error\n logger.error(\"Error>>GraphQL\", {\n message: graphqlError.message,\n errors: graphqlError.errors,\n });\n\n throw graphqlError;\n }\n\n // Log HTTP error with generic response data\n logger.error(\"Error>>HTTP\", {\n status: error.status,\n message: error.message,\n code: error.code,\n data: error.data,\n });\n\n throw error; // Re-throw the original HTTPError\n }\n\n // Handle raw AxiosError (direct usage, not through http-client)\n if (error instanceof AxiosError) {\n // For GraphQL responses with errors\n if (error.response?.data?.errors) {\n const graphqlError = new GraphQLError(\n \"GraphQL Error\",\n error.response.data.errors as GraphQLServerError[]\n );\n\n // Log the error\n logger.error(\"Error>>GraphQL\", {\n message: graphqlError.message,\n errors: graphqlError.errors,\n });\n\n throw graphqlError;\n }\n\n // For HTTP errors - create HTTPError and log with response data\n const httpError = new HTTPError(\n error.message,\n error.response?.status || 500,\n error.code,\n error.response?.data\n );\n\n // Log HTTP error with generic response data\n logger.error(\"Error>>HTTP\", {\n status: httpError.status,\n message: httpError.message,\n code: httpError.code,\n data: httpError.data,\n });\n\n throw httpError;\n }\n\n // For other errors\n const httpError = new HTTPError(\n error instanceof Error ? error.message : \"An unknown error occurred\",\n 500\n );\n\n // Log the error\n logger.error(\"Error>>Unknown\", {\n message: httpError.message,\n status: httpError.status,\n });\n\n throw httpError;\n }\n}\n","import logger from \"../reporting-service/logger\";\nimport { ERPObjType, ERPType } from \"../../types/erp-types\";\nimport { MMReceiveLaborTicket } from \"./types/receive-types\";\nimport { MMTokenManager } from \"./token-mgr\";\nimport * as MM_SEND_TYPES from \"./types/send-types\";\nimport {\n HTTPClient,\n HTTPMethod,\n HTTPRequestConfig,\n HTTPClientFactory,\n} from \"../../utils/http-client\";\nimport { Checkpoint } from \"./types/checkpoint\";\nimport { CoreConfiguration } from \"../data-sync-service/configuration-manager\";\nimport { ErrorHandler } from \"../erp-api-services/errors\";\nimport {\n MMApiBaseResponse,\n MMGraphQLResourceResponse,\n MMMachineGroupsResponse,\n} from \"./types/mm-response-interfaces\";\n\nconst MAPPING = \"MAPPING\";\nconst CHECKPOINTS = \"CHECKPOINTS\";\nconst MACHINE_GROUPS = \"MACHINE_GROUPS\";\nconst GRAPHQL = \"GRAPHQL\";\n\nenum UrlBase {\n ErpApiSvcBase = \"ErpApiSvcBase\",\n ApiBase = \"ApiBase\",\n}\n\n/**\n * Class to manage interactions with the MM Mapping Service\n * Integrates an MM Token Manager to handle the API token.\n */\nexport class MMApiClient {\n tokenMgr: MMTokenManager;\n api: HTTPClient;\n\n private baseUrls: Record<UrlBase, string>;\n\n resourceURLs = {\n [ERPObjType.RESOURCES]: \"/erp/v1/resources\",\n [ERPObjType.PARTS]: \"/erp/v1/parts\",\n [ERPObjType.PART_OPERATION]: \"/erp/v1/part-operations\",\n [ERPObjType.WORK_ORDERS]: \"/erp/v1/production-orders\",\n [ERPObjType.WORK_ORDER_OPERATIONS]: \"/erp/v1/production-order-operations\",\n [ERPObjType.PERSONS]: \"/erp/v1/persons\",\n [ERPObjType.REASONS]: \"/erp/v1/reasons\",\n [ERPObjType.LABOR_TICKETS]: \"/erp/v1/labor-tickets\",\n [MAPPING]: \"/erp/v1/mapping\",\n [CHECKPOINTS]: \"/erp/v1/checkpoints\",\n [MACHINE_GROUPS]: \"/machine-groups\",\n [GRAPHQL]: \"/proxy/graphql\",\n };\n\n constructor() {\n this.tokenMgr = new MMTokenManager();\n this.baseUrls = {\n [UrlBase.ErpApiSvcBase]: CoreConfiguration.inst().mmERPSvcApiBaseUrl,\n [UrlBase.ApiBase]: CoreConfiguration.inst().mmApiBaseUrl,\n };\n this.api = HTTPClientFactory.getInstance({\n baseUrl: '',\n retryAttempts: CoreConfiguration.inst().mmApiRetryAttempts,\n });\n }\n\n //#region Private Methods\n private async executeWithAuthRetry<T>(\n operation: (token: string) => Promise<T>,\n options: { token?: string } = {}\n ): Promise<T> {\n let token = options.token || (await this.tokenMgr.getToken());\n\n try {\n return await operation(token);\n } catch (error: unknown) {\n // Type guard to check if error has status property\n const hasStatus = (err: unknown): err is { status: number } => {\n return typeof err === \"object\" && err !== null && \"status\" in err;\n };\n\n // Check if this looks like an auth error - only retry on explicit auth status codes\n const isAuthError =\n hasStatus(error) && (error.status === 401 || error.status === 403);\n\n if (isAuthError && !options.token) {\n // Only retry if we used cached token\n logger.info(\"Retrying request with fresh token due to auth error\");\n this.tokenMgr.invalidateToken();\n token = await this.tokenMgr.getToken();\n return await operation(token); // Single retry\n }\n\n throw error; // Re-throw if not auth error or already retried\n }\n }\n\n /**\n * Fetch data from the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n * Flags:\n */\n private async getData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n queryParams: { [key: string]: string } = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...queryParams,\n ...(baseUrl === UrlBase.ErpApiSvcBase ? { raw: \"true\" } : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const result = await this.api.request<object>({\n url: fullUrl,\n method: \"GET\" as HTTPMethod,\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n });\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Send data to the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n * Flags:\n * - 'raw' = true and 'dedupe' = true will be set for MM's ERP API url\n */\n private async postData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n data: object = {},\n queryParams: { [key: string]: string } = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...queryParams,\n ...(baseUrl === UrlBase.ErpApiSvcBase\n ? { dedupe: \"true\", raw: \"true\" }\n : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const request: HTTPRequestConfig = {\n url: fullUrl,\n method: \"POST\",\n data: JSON.stringify(data),\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n };\n\n const result = await this.api.request<object>(request);\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Delete data from the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n */\n private async deleteData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n data: object = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...(baseUrl === UrlBase.ErpApiSvcBase ? { raw: \"true\" } : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const result = await this.api.request<object>({\n url: fullUrl,\n method: \"DELETE\",\n data,\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n });\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Patch data to the MM API, with an auth retry mechanism\n * Auth Retry Level (executeWithAuthRetry)\n * - 401 (Unauthorized) and 403 (Forbidden) get special treatment\n * - These trigger a token refresh and one retry attempt\n * - If the retry still fails, the error is re-thrown\n *\n * HTTP Status Codes behavior:\n * - 2xx - Success, returns normally\n * - 4xx - Client errors, throws immediately\n * - 5xx - Server errors, retries then throws\n *\n */\n private async patchData<\n T extends Record<string, unknown> = Record<string, unknown>,\n >(\n path: string,\n data: object = {},\n options: {\n baseUrl?: UrlBase;\n token?: string;\n headers?: Record<string, string>;\n } = {}\n ): Promise<T & MMApiBaseResponse> {\n try {\n return await this.executeWithAuthRetry(async (token) => {\n const baseUrl = options.baseUrl || UrlBase.ErpApiSvcBase;\n const params = new URLSearchParams({\n ...(baseUrl === UrlBase.ErpApiSvcBase ? { raw: \"true\" } : {}),\n });\n const url = params.size > 0 ? `${path}?${params.toString()}` : path;\n const fullUrl = this.baseUrls[baseUrl] + url;\n const request: HTTPRequestConfig = {\n url: fullUrl,\n method: \"PATCH\",\n data,\n headers: {\n Authorization: `Bearer ${token}`,\n ...options.headers,\n },\n };\n\n const result = await this.api.request<object>(request);\n\n // Always include HTTP status in the response\n return {\n ...(result.data as T),\n httpStatus: result.status,\n } as T & MMApiBaseResponse;\n }, options);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n private async graphqlRequest(\n operationName: string,\n query: string\n ): Promise<MMApiBaseResponse> {\n try {\n return await this.postData(\n this.resourceURLs[GRAPHQL],\n { operationName, query },\n {},\n {\n baseUrl: UrlBase.ApiBase,\n token: CoreConfiguration.inst().mmApiAuthToken,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Fetch a checkpoint for a specific system, table, and checkpoint type\n * @param checkpoint The checkpoint to fetch\n * @returns Promise with the checkpoint data\n */\n private async fetchCheckpoint(\n checkpoint: Checkpoint\n ): Promise<MMApiBaseResponse> {\n const { system, table, checkpointType } = checkpoint;\n return this.getData(this.resourceURLs[CHECKPOINTS], {\n system,\n table,\n checkpointType,\n });\n }\n\n //#endregion private methods\n\n //#region Public Methods\n /**\n * Send resources to the MM API\n * @param resources Array of resources to send\n * @returns Promise with the API response\n */\n async sendResourcesToMM(\n resources: MM_SEND_TYPES.MMSendResource[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.RESOURCES], {\n data: resources.map((resource) => resource.toRESTApiObject()),\n });\n }\n\n /**\n * Send parts to the MM API\n * @param parts Array of parts to send\n * @returns Promise with the API response\n */\n async sendPartsToMM(\n parts: MM_SEND_TYPES.MMSendPart[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.PARTS], {\n data: parts.map((part) => part.toRESTApiObject()),\n });\n }\n\n /**\n * Send part operations to the MM API\n * @param operations Array of part operations to send\n * @returns Promise with the API response\n */\n async sendPartOperationsToMM(\n operations: MM_SEND_TYPES.MMSendPartOperation[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.PART_OPERATION], {\n data: operations.map((operation) => operation.toRESTApiObject()),\n });\n }\n\n /**\n * Send work orders to the MM API\n * @param workOrders Array of work orders to send\n * @returns Promise with the API response\n */\n async sendWorkOrdersToMM(\n workOrders: MM_SEND_TYPES.MMSendWorkOrder[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.WORK_ORDERS], {\n data: workOrders.map((workOrder) => workOrder.toRESTApiObject()),\n });\n }\n\n /**\n * Send work order operations to the MM API\n * @param workOrderOperations Array of work order operations to send\n * @returns Promise with the API response\n */\n async sendWorkOrderOperationsToMM(\n workOrderOperations: MM_SEND_TYPES.MMSendWorkOrderOperation[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(\n this.resourceURLs[ERPObjType.WORK_ORDER_OPERATIONS],\n {\n data: workOrderOperations.map((operation) =>\n operation.toRESTApiObject()\n ),\n }\n );\n }\n\n /**\n * Send persons to the MM API\n * @param persons Array of persons to send\n * @returns Promise with the API response\n */\n async sendPersonsToMM(\n persons: MM_SEND_TYPES.MMSendPerson[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.PERSONS], {\n data: persons.map((person) => person.toRESTApiObject()),\n });\n }\n\n /**\n * Send reasons to the MM API\n * @param reasons Array of reasons to send\n * @returns Promise with the API response\n */\n async sendReasonsToMM(\n reasons: MM_SEND_TYPES.MMSendReason[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.REASONS], {\n data: reasons.map((reason) => reason.toRESTApiObject()),\n });\n }\n\n /**\n * Send labor tickets to the MM API\n * @param laborTickets Array of labor tickets to send\n * @returns Promise with the API response\n */\n async sendLaborTicketsToMM(\n laborTickets: MM_SEND_TYPES.MMSendLaborTicket[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[ERPObjType.LABOR_TICKETS], {\n data: laborTickets.map((ticket) => ticket.toRESTApiObject()),\n });\n }\n\n /**\n * Delete labor tickets from the MM API\n * @param laborTickets Array of labor ticket records to delete\n * @returns Promise with the API response\n */\n async deleteLaborTickets(\n laborTickets: Record<string, string>[]\n ): Promise<MMApiBaseResponse> {\n logger.debug(\"deleteLaborTickets:\", { laborTickets });\n return await this.deleteData(this.resourceURLs[ERPObjType.LABOR_TICKETS], {\n laborTickets,\n });\n }\n\n /**\n * Fetch transformed labor tickets from the MM API\n * @returns Promise with the transformed labor tickets\n */\n async fetchTransformedLaborTickets(): Promise<MMApiBaseResponse> {\n return await this.getData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/export`\n );\n }\n\n /**\n * Fetch labor ticket updates from the MM API\n * @param query Query parameters for filtering updates\n * @returns Promise with an array of labor ticket updates\n */\n async fetchLaborTicketUpdates(\n query: Record<string, string>\n ): Promise<MMReceiveLaborTicket[]> {\n const updates = (await this.getData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/export/updates`,\n query\n )) as { data: MMReceiveLaborTicket[] };\n return updates.data.map((ticket) => new MMReceiveLaborTicket(ticket));\n }\n\n /**\n * Fetch a checkpoint for a specific system, table, and checkpoint type\n * @param checkpoint The checkpoint to fetch\n * @returns Promise with the checkpoint data\n */\n async getCheckpoint(checkpoint: Checkpoint): Promise<MMApiBaseResponse> {\n return await this.fetchCheckpoint(checkpoint);\n }\n\n /**\n * Save a checkpoint to the MM API\n * @param checkpoint The checkpoint to save\n * @returns Promise with the API response\n */\n async saveCheckpoint(checkpoint: Checkpoint): Promise<MMApiBaseResponse> {\n return await this.postData(this.resourceURLs[CHECKPOINTS], checkpoint);\n }\n\n /**\n * Initialize a checkpoint for a specific system, table, and checkpoint type\n * @param checkpoint The checkpoint to initialize\n * @returns Promise with the checkpoint data\n */\n async initializeCheckpoint(checkpoint: Checkpoint): Promise<void> {\n const currentCheckpoint = await this.fetchCheckpoint(checkpoint);\n\n logger.info(\"currentCheckpoint:\", { currentCheckpoint });\n logger.info(\"currentCheckpoint keys:\", {\n keys: Object.keys(currentCheckpoint || {}),\n });\n\n // Check if we have a meaningful checkpoint response\n // The API returns either:\n // - Empty: just { httpStatus: 200 }\n // - With data: { timestamp: \"2025-08-08T18:53:14.295Z\", httpStatus: 200 }\n const checkpointResponse = currentCheckpoint as any;\n const hasCheckpointData =\n checkpointResponse && checkpointResponse.timestamp;\n\n if (!hasCheckpointData) {\n logger.info(\"No checkpoint data found, initializing checkpoint\");\n const saveCheckpoint = await this.saveCheckpoint(checkpoint);\n logger.info(\"saveCheckpoint:\", { saveCheckpoint });\n } else {\n logger.info(\"Existing checkpoint found:\", {\n timestamp: checkpointResponse.timestamp,\n });\n }\n }\n\n /**\n * Send data to MM API based on the object type\n * @param type The type of ERP object to send\n * @param objects Array of objects to send\n * @returns Promise with the API response including affected rows count\n */\n public async sendDataToMMByType(\n type: ERPObjType,\n objects: MM_SEND_TYPES.IToRESTApiObject[]\n ): Promise<MMApiBaseResponse> {\n switch (type) {\n case ERPObjType.PERSONS:\n return await this.sendPersonsToMM(\n objects as MM_SEND_TYPES.MMSendPerson[]\n );\n case ERPObjType.RESOURCES:\n return await this.sendResourcesToMM(\n objects as MM_SEND_TYPES.MMSendResource[]\n );\n case ERPObjType.PARTS:\n return await this.sendPartsToMM(objects as MM_SEND_TYPES.MMSendPart[]);\n case ERPObjType.PART_OPERATION:\n return await this.sendPartOperationsToMM(\n objects as MM_SEND_TYPES.MMSendPartOperation[]\n );\n case ERPObjType.WORK_ORDERS:\n return await this.sendWorkOrdersToMM(\n objects as MM_SEND_TYPES.MMSendWorkOrder[]\n );\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return await this.sendWorkOrderOperationsToMM(\n objects as MM_SEND_TYPES.MMSendWorkOrderOperation[]\n );\n case ERPObjType.REASONS:\n return await this.sendReasonsToMM(\n objects as MM_SEND_TYPES.MMSendReason[]\n );\n case ERPObjType.LABOR_TICKETS:\n return await this.sendLaborTicketsToMM(\n objects as MM_SEND_TYPES.MMSendLaborTicket[]\n );\n default:\n throw new Error(`Unsupported type: ${ERPObjType[type]}`);\n }\n }\n\n /**\n * Update the labor ticket ERP ID by laborTicketRef\n * @param laborTicketRef The MM API labor ticket unique ID\n * @param erpObjectId The ERP labor ticket ID to update\n * @returns The updated labor ticket\n */\n async updateLaborTicketIdByRef(\n laborTicketRef: string,\n laborTicketId: string\n ): Promise<MMApiBaseResponse> {\n return await this.patchData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/${laborTicketRef}`,\n { laborTicketId }\n );\n }\n\n /**\n * Add failed labor ticket refs to the MM API\n * @param failedTicketRefs The failed labor ticket references\n * @returns The response from the MM API\n */\n async addFailedLaborTicketRefs(\n system: ERPType,\n failedTicketRefs: string[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/failed`,\n { failedTicketRefs },\n { system }\n );\n }\n\n async fetchFailedLaborTickets(\n system: ERPType\n ): Promise<MMReceiveLaborTicket[]> {\n const failedTickets = (await this.getData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/failed`,\n { system }\n )) as { erpLaborTickets: MMReceiveLaborTicket[] };\n return failedTickets.erpLaborTickets.map(\n (ticket) => new MMReceiveLaborTicket(ticket)\n );\n }\n\n /**\n * Send connector logs to the MM API\n * @param logEntry Single log entry to send\n * @returns Promise with the API response\n */\n async sendConnectorLog(logEntry: { source: string; level: string; message: string }): Promise<MMApiBaseResponse> {\n return await this.postData(\n '/connector/logs',\n logEntry,\n {},\n { baseUrl: UrlBase.ApiBase }\n );\n }\n\n /**\n * Send bulk connector logs to the MM API\n * @param logs Array of log entries to send\n * @returns Promise with the API response\n */\n async sendBulkConnectorLogs(logs: { source: string; level: string; message: string }[]): Promise<MMApiBaseResponse> {\n return await this.postData(\n '/connector/logs',\n { logs },\n {},\n { baseUrl: UrlBase.ApiBase }\n );\n }\n\n async deleteFailedLaborTicketIds(\n system: ERPType,\n laborTicketRefs: string[]\n ): Promise<MMApiBaseResponse> {\n return await this.postData(\n `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/failed/remove`,\n { laborTicketRefs },\n { system }\n );\n }\n\n /**\n * Fetch machine groups from the MM API\n * @returns Promise with the machine groups data\n */\n async fetchMachineGroups(): Promise<MMMachineGroupsResponse> {\n return (await this.getData(\n this.resourceURLs[MACHINE_GROUPS],\n {},\n { baseUrl: UrlBase.ApiBase }\n )) as unknown as MMMachineGroupsResponse;\n }\n\n /**\n * Fetch resources using GraphQL\n * @returns Promise with the resources data\n */\n async fetchResourcesFromGraphQL(): Promise<MMGraphQLResourceResponse> {\n return (await this.graphqlRequest(\n \"getErpResources\",\n \"query getErpResources { machineResource: erpResources { machineRef machineGroupId resourceId }}\"\n )) as unknown as MMGraphQLResourceResponse;\n }\n\n /**\n * Cleanup all HTTP connections and resources\n * Call this when the service is no longer needed\n */\n async destroy(): Promise<void> {\n await this.api.destroy();\n // Note: MMTokenManager doesn't currently need explicit cleanup\n // but if it ever acquires resources that need cleanup, add it here\n }\n\n //#endregion public methods\n}\n","/**\n * These represent types of objects that can be sent to the MM API\n * Note that each class also implements a static method to convert from a plain\n * object to a REST API object: e.g.\n * MMSendPerson::fromPlainObject(data: Record<string, string | null>): MMSendPerson\n */\n\nexport interface IToRESTApiObject {\n toRESTApiObject(): Record<string, string | null>;\n}\n\n/**\n * Interface for static factory methods that can reconstruct typed objects\n * from plain data, without validation.\n */\n\nexport class MMSendPerson implements IToRESTApiObject {\n constructor(\n public personId: string,\n public firstName: string,\n public lastName: string,\n public isActive: boolean\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n personId: this.personId,\n firstName: this.firstName,\n lastName: this.lastName,\n isActive: this.isActive ? \"1\" : \"0\",\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendPerson {\n return new MMSendPerson(\n data.personId || \"\",\n data.firstName || \"\",\n data.lastName || \"\",\n data.isActive === \"1\"\n );\n }\n}\n\nexport class MMSendResource implements IToRESTApiObject {\n constructor(\n public resourceId: string, // Unique identifier that the ERP uses to describe a resource\n public name: string, // A colloquial name for the resource, sometimes also just the resource_id\n public isResourceGroup: boolean, // Whether or not this record represents an individual machine/piece of hardware, or a group/type of machines\n public description: string, // Text description of the resource (optional)\n public type: string, // The type of resource (optional)\n public productionBurdenRateHourly: number, // The cost associated with running this machine in production/hour (optional)\n public setupBurdenRateHourly: number // The cost associated with running this machine in setup/hour (optional)\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n resourceId: this.resourceId,\n name: this.name,\n isResourceGroup: this.isResourceGroup ? \"1\" : \"0\",\n description: this.description,\n type: this.type,\n productionBurdenRateHourly: this.productionBurdenRateHourly.toString(),\n setupBurdenRateHourly: this.setupBurdenRateHourly.toString(),\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendResource {\n return new MMSendResource(\n data.resourceId || \"\",\n data.name || \"\",\n data.isResourceGroup === \"1\",\n data.description || \"\",\n data.type || \"\",\n parseFloat(data.productionBurdenRateHourly || \"0\"),\n parseFloat(data.setupBurdenRateHourly || \"0\")\n );\n }\n}\n\nexport class MMSendPart implements IToRESTApiObject {\n constructor(\n public partNumber: string,\n public partRevision: string,\n public method: string\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n partNumber: this.partNumber,\n partRevision: this.partRevision,\n method: this.method,\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendPart {\n return new MMSendPart(\n data.partNumber || \"\",\n data.partRevision || \"\",\n data.method || \"\"\n );\n }\n}\n\nexport class MMSendPartOperation implements IToRESTApiObject {\n constructor(\n public partNumber: string,\n public partRevision: string,\n public method: string,\n public sequenceNumber: string,\n public resourceId: string,\n public cycleTimeMs: number,\n public setupTimeMs: number,\n public description: string,\n public quantityPerPart: number\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n partNumber: this.partNumber,\n partRevision: this.partRevision,\n method: this.method,\n sequenceNumber: this.sequenceNumber,\n resourceId: this.resourceId,\n cycleTimeMs: this.cycleTimeMs.toString(),\n setupTimeMs: this.setupTimeMs.toString(),\n description: this.description,\n quantityPerPart: this.quantityPerPart.toString(),\n };\n }\n\n static fromPlainObject(\n data: Record<string, string | null>\n ): MMSendPartOperation {\n return new MMSendPartOperation(\n data.partNumber || \"\",\n data.partRevision || \"\",\n data.method || \"\",\n data.sequenceNumber || \"\",\n data.resourceId || \"\",\n parseInt(data.cycleTimeMs || \"0\"),\n parseInt(data.setupTimeMs || \"0\"),\n data.description || \"\",\n parseFloat(data.quantityPerPart || \"1\")\n );\n }\n}\n\nexport class MMSendWorkOrder implements IToRESTApiObject {\n constructor(\n public workOrderId: string,\n public lot: string,\n public split: string,\n public sub: string,\n public status: string,\n public dueDate: string | null,\n public description: string,\n public scheduledStartDate: string | null,\n public scheduledEndDate: string | null,\n public closedDate: string | null,\n public quantityRequired: number,\n public partNumber: string,\n public partRevision: string,\n public method: string\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n workOrderId: this.workOrderId,\n lot: this.lot,\n split: this.split,\n sub: this.sub,\n status: this.status,\n dueDate: this.dueDate,\n description: this.description,\n scheduledStartDate: this.scheduledStartDate,\n scheduledEndDate: this.scheduledEndDate,\n closedDate: this.closedDate,\n quantityRequired: this.quantityRequired.toString(),\n partNumber: this.partNumber,\n partRevision: this.partRevision,\n method: this.method,\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendWorkOrder {\n return new MMSendWorkOrder(\n data.workOrderId || \"\",\n data.lot || \"\",\n data.split || \"\",\n data.sub || \"\",\n data.status || \"\",\n data.dueDate ?? null,\n data.description || \"\",\n data.scheduledStartDate ?? null,\n data.scheduledEndDate ?? null,\n data.closedDate ?? null,\n parseFloat(data.quantityRequired || \"0\"),\n data.partNumber || \"\",\n data.partRevision || \"\",\n data.method || \"\"\n );\n }\n}\n\nexport class MMSendWorkOrderOperation implements IToRESTApiObject {\n constructor(\n public workOrderId: string,\n public lot: string,\n public split: string,\n public sub: string,\n public sequenceNumber: string,\n public resourceId: string,\n public startQuantity: number,\n public finishQuantity: number,\n public expectedRejectRate: number,\n public scheduledStartDate: string | null,\n public scheduledFinishDate: string | null,\n public closedDate: string | null,\n public cycleTimeMs: number,\n public setupTimeMs: number,\n public productionburdenRateHourly: number,\n public setupburdenRatehourly: number,\n public operationType: string,\n public quantityPerPart: number,\n public status: string\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n workOrderId: this.workOrderId,\n lot: this.lot,\n split: this.split,\n sub: this.sub,\n sequenceNumber: this.sequenceNumber,\n resourceId: this.resourceId,\n startQuantity: this.startQuantity.toString(),\n finishQuantity: this.finishQuantity.toString(),\n expectedRejectRate: this.expectedRejectRate.toString(),\n scheduledStartDate: this.scheduledStartDate,\n scheduledFinishDate: this.scheduledFinishDate,\n closedDate: this.closedDate,\n cycleTimeMs: this.cycleTimeMs.toString(),\n setupTimeMs: this.setupTimeMs.toString(),\n productionburdenRateHourly: this.productionburdenRateHourly.toString(),\n setupburdenRatehourly: this.setupburdenRatehourly.toString(),\n operationType: this.operationType,\n quantityPerPart: this.quantityPerPart.toString(),\n status: this.status,\n };\n }\n\n static fromPlainObject(\n data: Record<string, string | null>\n ): MMSendWorkOrderOperation {\n return new MMSendWorkOrderOperation(\n data.workOrderId || \"\",\n data.lot || \"\",\n data.split || \"\",\n data.sub || \"\",\n data.sequenceNumber || \"\",\n data.resourceId || \"\",\n parseFloat(data.startQuantity || \"0\"),\n parseFloat(data.finishQuantity || \"0\"),\n parseFloat(data.expectedRejectRate || \"0\"),\n data.scheduledStartDate ?? null,\n data.scheduledFinishDate ?? null,\n data.closedDate ?? null,\n parseInt(data.cycleTimeMs || \"0\"),\n parseInt(data.setupTimeMs || \"0\"),\n parseFloat(data.productionburdenRateHourly || \"0\"),\n parseFloat(data.setupburdenRatehourly || \"0\"),\n data.operationType || \"\",\n parseFloat(data.quantityPerPart || \"1\"),\n data.status || \"\"\n );\n }\n}\n\nexport class MMSendReason implements IToRESTApiObject {\n constructor(\n public reasonId: string,\n public category: string,\n public code: string,\n public description: string,\n public entityType: string\n ) {}\n\n toRESTApiObject(): Record<string, string> {\n return {\n reasonId: this.reasonId,\n category: this.category,\n code: this.code,\n description: this.description,\n entityType: this.entityType,\n };\n }\n\n static fromPlainObject(data: Record<string, string | null>): MMSendReason {\n return new MMSendReason(\n data.reasonId || \"\",\n data.category || \"\",\n data.code || \"\",\n data.description || \"\",\n data.entityType || \"\"\n );\n }\n}\n\nexport class MMSendLaborTicket implements IToRESTApiObject {\n constructor(\n public workOrderId: string,\n public lot: string,\n public split: string,\n public sub: string,\n public sequenceNumber: string,\n public resourceId: string,\n public personId: string,\n public laborTicketId: string,\n public transactionDate: string | null,\n public clockIn: string | null,\n public clockOut: string | null,\n public goodParts: number,\n public badParts: number,\n public type: string,\n public comment: string,\n public state: string\n ) {}\n\n toRESTApiObject(): Record<string, string | null> {\n return {\n workOrderId: this.workOrderId,\n lot: this.lot,\n split: this.split,\n sub: this.sub,\n sequenceNumber: this.sequenceNumber,\n resourceId: this.resourceId,\n personId: this.personId,\n laborTicketId: this.laborTicketId,\n transactionDate: this.transactionDate,\n clockIn: this.clockIn,\n clockOut: this.clockOut,\n goodParts: this.goodParts.toString(),\n badParts: this.badParts.toString(),\n type: this.type,\n comment: this.comment,\n state: this.state,\n };\n }\n\n static fromPlainObject(\n data: Record<string, string | null>\n ): MMSendLaborTicket {\n return new MMSendLaborTicket(\n data.workOrderId || \"\",\n data.lot || \"\",\n data.split || \"\",\n data.sub || \"\",\n data.sequenceNumber || \"\",\n data.resourceId || \"\",\n data.personId || \"\",\n data.laborTicketId || \"\",\n data.transactionDate ?? null,\n data.clockIn ?? null,\n data.clockOut ?? null,\n parseInt(data.goodParts || \"0\"),\n parseInt(data.badParts || \"0\"),\n data.type || \"\",\n data.comment || \"\",\n data.state || \"\"\n );\n }\n}\n\n/**\n * Flattened interface for Work Order related entities that maintains referential integrity\n * by processing parts, part operations, work orders, and work order operations together\n */\nexport interface MMSendWorkOrderBatch {\n parts: MMSendPart[];\n partOperations: MMSendPartOperation[];\n workOrders: MMSendWorkOrder[];\n workOrderOperations: MMSendWorkOrderOperation[];\n}\n","/**\n * Extracts unique rows from data based on specified fields and sorts by up to two fields\n * @param data Array of data objects\n * @param fields Array of field names to use as a unique keys\n * @param sortFields Optional array of field names to sort by (up to two fields)\n * @returns Array of unique objects based on the specified fields, or an empty array if data is empty\n */\nexport function getUniqueRows<T extends Record<string, unknown>>(\n data: T[],\n fields: (keyof T)[],\n sortFields?: (keyof T)[]\n): T[] {\n const createCompositeKey = (item: T): string => {\n return fields.map((field) => String(item[field])).join(\"|\");\n };\n\n const uniqueKeys = new Set<string>();\n const uniqueRows: T[] = [];\n\n data.forEach((item) => {\n const key = createCompositeKey(item);\n if (!uniqueKeys.has(key)) {\n uniqueKeys.add(key);\n uniqueRows.push(item);\n }\n });\n\n if (sortFields && sortFields.length > 0) {\n uniqueRows.sort((a, b) => {\n for (let i = 0; i < sortFields.length; i++) {\n const field = sortFields[i];\n if (a[field] < b[field]) return -1;\n if (a[field] > b[field]) return 1;\n }\n return 0;\n });\n }\n\n return uniqueRows || [];\n}\n","import { ERPObject } from \"../types/erp-types\";\n\n/**\n * Retain only the fields listed in retainFields[] in the payload\n */\nexport const removeExtraneousFields = (\n recordset: ERPObject[],\n retainFields: string[]\n): ERPObject[] => {\n const data: ERPObject[] =\n recordset.map((row) => {\n const transformedRow: ERPObject = {};\n Object.keys(row).forEach((key) => {\n if (retainFields.includes(key)) {\n transformedRow[key] = row[key]?.toString() || \"\";\n }\n });\n return transformedRow;\n }) || [];\n\n return data;\n};\n","import { ERPObject } from \"../types/erp-types\";\n\n/**\n * Remove all fields listed in idField[] the from the payload\n */\nexport const getPayloadWithoutIDField = (\n recordset: ERPObject[],\n idField: string[]\n): ERPObject[] => {\n const data: ERPObject[] =\n recordset.map((row) => {\n const transformedRow: ERPObject = {};\n Object.keys(row).forEach((key) => {\n if (!idField.includes(key)) {\n transformedRow[key] = row[key]?.toString() || \"\";\n }\n });\n return transformedRow;\n }) || [];\n\n return data;\n};\n","/**\n * Trims all string values in an object while preserving the object's structure\n */\nexport const trimObjectValues = <T extends object>(obj: T): T => {\n return Object.keys(obj).reduce((acc, key) => {\n const value = obj[key as keyof T];\n acc[key as keyof T] = (\n typeof value === \"string\" ? value.trim() : value\n ) as T[keyof T];\n return acc;\n }, {} as T);\n};\n","export const cleanupNumbers = (data: string) => {\n // eslint-disable-next-line no-useless-escape\n data = data.toString().replace(/[^0-9\\.]+/g, \"\");\n return data;\n};\n","/**\n * Add a new field to the data from an external source by matching on the same field name\n * @param data The data to add the new field to\n * @param externalSource The external source to get the new field from\n * @param externalSourceFieldName The field in both data and external source to match on\n * @param newFieldName The name of the new field to add\n * @param defaultValue The default value to use if there is no match\n */\nexport const addNewFieldFromExternalSource = (\n data: Record<string, string>[],\n externalSource: Record<string, string>[],\n externalSourceFieldName: string,\n newFieldName: string,\n defaultValue: string = \"-\"\n): Record<string, string>[] => {\n return data.map((current) => {\n const cacheEntry = externalSource.find(\n (existing) =>\n existing[externalSourceFieldName] === current[externalSourceFieldName]\n );\n const newFieldValue = cacheEntry?.[newFieldName] || defaultValue;\n\n return {\n ...current,\n [newFieldName]: newFieldValue,\n };\n });\n};\n\n/**\n * Add a new field to the data from an external source by matching on different field names\n * @param data The data to add the new field to\n * @param externalSource The external source to get the new field from\n * @param lookupField The field in the external source to match on\n * @param currentField The field in the current data to match on\n * @param newFieldName The name of the new field to add\n * @param defaultValue The default value to use if there is no match\n */\nexport const addNewFieldFromLookupField = (\n data: Record<string, string>[],\n externalSource: Record<string, string>[],\n lookupField: string,\n currentField: string,\n newFieldName: string,\n defaultValue: string = \"-\"\n): Record<string, string>[] => {\n return data.map((current) => {\n const cacheEntry = externalSource.find(\n (existing) => existing[lookupField] === current[currentField]\n );\n const newFieldValue = cacheEntry?.[currentField] || defaultValue;\n\n return {\n ...current,\n [newFieldName]: newFieldValue,\n };\n });\n};\n","import { CoreConfiguration } from \"../services/data-sync-service/configuration-manager\";\nimport { HTTPClientFactory } from \"./http-client\";\n\n/**\n * Gets the timezone offset in hours for the company's timezone\n * @returns Promise<number> The timezone offset in hours\n * @throws Error if unable to fetch timezone information\n */\nexport const getTimezoneOffset = async (): Promise<number> => {\n try {\n // Get the timezone from configuration\n const config = CoreConfiguration.inst();\n const apiUrl = config.mmApiBaseUrl;\n const authToken = config.mmApiAuthToken;\n\n if (!apiUrl || !authToken) {\n throw new Error(\"Missing required configuration for timezone fetch\");\n }\n\n // Create HTTP client\n const client = HTTPClientFactory.getInstance({\n baseUrl: apiUrl,\n retryAttempts: config.mmApiRetryAttempts,\n });\n\n // Fetch user/company information from the API\n const response = await client.request<{ company: { timezone: string } }>({\n url: \"/accounts/current\",\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${authToken}`,\n },\n });\n\n const userInfo = response.data;\n if (!userInfo?.company?.timezone) {\n throw new Error(\"Unable to retrieve company timezone from API\");\n }\n\n // Calculate the timezone offset\n const date = new Date();\n const utcDate = new Date(date.toLocaleString(\"en-US\", { timeZone: \"UTC\" }));\n const tzDate = new Date(\n date.toLocaleString(\"en-US\", { timeZone: userInfo.company.timezone })\n );\n\n // Return offset in hours\n return (tzDate.getTime() - utcDate.getTime()) / 3600000;\n } catch (error) {\n throw new Error(\n `Failed to get timezone offset: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n};\n\n/**\n * Converts a UTC/Zulu time to local time based on the provided timezone offset\n * @param zuluTime The UTC/Zulu time to convert\n * @param timezoneOffset The timezone offset in hours\n * @returns The converted local time, or undefined if input is null/undefined\n */\nexport const convertToLocalTime = (\n zuluTime: string | Date | null | undefined,\n timezoneOffset: number\n): Date | undefined => {\n if (!zuluTime) return undefined;\n const date = new Date(zuluTime);\n return new Date(date.getTime() + timezoneOffset * 60 * 60 * 1000);\n};\n\n/**\n * Formats a date with the timezone offset in ISO format with offset\n * @param date The date string in format YYYY-MM-DD HH:mm:ss or YYYY-MM-DDTHH:mm:ss\n * @param timezoneOffset The timezone offset in hours\n * @returns The formatted date string in format: YYYY-MM-DDTHH:mm:ss+/-HH:MM\n */\nexport const formatDateWithTZOffset = (\n date: string | null | undefined,\n timezoneOffset: number\n): string | undefined => {\n if (!date) return undefined;\n\n // Replace space with T if present\n const isoDate = date.replace(\" \", \"T\");\n\n // Calculate offset components\n const sign = timezoneOffset >= 0 ? \"+\" : \"-\";\n const absOffset = Math.abs(timezoneOffset);\n const hours = Math.floor(absOffset).toString().padStart(2, \"0\");\n const minutes = Math.floor((absOffset % 1) * 60)\n .toString()\n .padStart(2, \"0\");\n\n // Append the timezone offset\n return `${isoDate}${sign}${hours}:${minutes}`;\n};\n","import logger from \"../services/reporting-service/logger\";\nimport { setTimezoneOffsetInCache } from \"./local-data-store/jobs-shared-data\";\nimport {\n convertToLocalTime,\n formatDateWithTZOffset,\n getTimezoneOffset,\n} from \"./timezone\";\n\n/**\n * Calculates the difference in hours between two timestamps\n * @param startTime ISO timestamp string\n * @param endTime ISO timestamp string\n * @param timezoneOffset timezone offset in hours\n * @returns number representing hours difference, rounded to 3 decimal places\n */\nexport function calculateTimeDifferenceInHours(\n startTime: string | null | undefined,\n endTime: string | null | undefined,\n timezoneOffset: number\n): number {\n if (!startTime || !endTime) return 0;\n\n const localStartTime = convertToLocalTime(startTime, timezoneOffset);\n const localEndTime = convertToLocalTime(endTime, timezoneOffset);\n\n if (!localStartTime || !localEndTime) return 0;\n\n // Get hours, minutes, seconds from the Date objects\n const startHours = localStartTime.getHours();\n const startMinutes = localStartTime.getMinutes();\n const startSeconds = localStartTime.getSeconds();\n\n const endHours = localEndTime.getHours();\n const endMinutes = localEndTime.getMinutes();\n const endSeconds = localEndTime.getSeconds();\n\n // Calculate total seconds for each time\n const startTotalSeconds =\n startHours * 3600 + startMinutes * 60 + startSeconds;\n const endTotalSeconds = endHours * 3600 + endMinutes * 60 + endSeconds;\n\n if (endTotalSeconds > startTotalSeconds) {\n return Number(((endTotalSeconds - startTotalSeconds) / 3600).toFixed(3));\n }\n\n return 0;\n}\n\nexport const getSecondsOfDay = (timestamp: string | null) => {\n if (!timestamp) return null;\n const time = new Date(timestamp);\n\n const utcHours = time.getUTCHours();\n const utcMinutes = time.getUTCMinutes();\n const utcSeconds = time.getUTCSeconds();\n\n return (utcHours * 3600 + utcMinutes * 60 + utcSeconds).toString();\n};\n\n/**\n * Apply timezone offsets to specified datetime fields in an object\n * @param item The object to transform\n * @param fields The fields to apply timezone offset to\n * @param timezoneOffset The timezone offset to apply\n * @returns The transformed object\n */\n\nexport const applyTimezoneOffsetsToFields = (\n item: Record<string, string>,\n fields: string[],\n timezoneOffset: number\n): Record<string, string> => {\n const transformed = { ...item };\n fields.forEach((field) => {\n if (transformed[field] && transformed[field].trim()) {\n const formattedDate = formatDateWithTZOffset(\n transformed[field],\n timezoneOffset\n );\n transformed[field] = formattedDate || \"\";\n } else {\n transformed[field] = \"\";\n }\n });\n return transformed;\n};\n\ninterface TimezoneOffsetParams {\n maxRetries: number;\n retryIntervalMs: number;\n}\n\n/**\n * Gets the timezone offset for the company and sets it in the cache\n * The cached offset can be acquired from getCachedTimezoneOffset() in \"./local-data-store/jobs-shared-data\"\n *\n * @param params.maxRetries Maximum number of retry attempts\n * @param params.retryIntervalMs Time to wait between retries in milliseconds\n */\nexport const getTimezoneOffsetAndPersist = async (\n params: TimezoneOffsetParams = {\n maxRetries: 36000, // Retry for 10 hours before giving up.\n retryIntervalMs: 10_000,\n }\n): Promise<void> => {\n let success = false;\n let retries = 0;\n logger.info(\n \"Acquiring the timezone offset from MachineMetrics and storing in cache\"\n );\n while (!success && retries < params.maxRetries) {\n try {\n const offsetHours = await getTimezoneOffset();\n logger.info(`Timezone offset: ${offsetHours} hours`);\n setTimezoneOffsetInCache(offsetHours);\n success = true;\n } catch (error) {\n logger.error(\"Error getting timezone offset:\", error);\n logger.info(`Retrying in ${params.retryIntervalMs / 1000} seconds...`);\n await new Promise((resolve) =>\n setTimeout(resolve, params.retryIntervalMs)\n );\n retries++;\n }\n }\n if (!success) {\n throw new Error(\n `Failed to get the timezone offset after ${params.maxRetries} retries`\n );\n }\n};\n","import knex, { Knex } from \"knex\";\nimport config from \"../../knexfile\";\nimport { ERPObjType } from \"../../types/erp-types\";\n\nconst DEFAULT_RECORD_TRACKING_TABLE_NAME = \"record_tracking\";\n\nexport type RecordTrackingObject = {\n entityType?: ERPObjType;\n lastValue: string; // Typically date/time string\n recordId: string; // A value to disambiguate records with the same lastValue\n};\n\nexport class RecordTrackingManager {\n db: Knex;\n\n constructor() {\n this.db = knex(config.local);\n }\n\n async updateRecord(record: RecordTrackingObject) {\n if (record.lastValue && record.recordId) {\n const recordUpdated = await this.db(DEFAULT_RECORD_TRACKING_TABLE_NAME)\n .where({ entityType: record.entityType })\n .update(record);\n\n if (recordUpdated < 1) {\n await this.db(DEFAULT_RECORD_TRACKING_TABLE_NAME).insert(record);\n }\n }\n }\n\n async getTrackingRecord(type: ERPObjType) {\n return await this.db(DEFAULT_RECORD_TRACKING_TABLE_NAME)\n .select(\"*\")\n .where({ entityType: type.toString() });\n }\n\n async destroy() {\n return this.db.destroy();\n }\n}\n","import { HashedCacheManager } from \"./hashed-cache-manager\";\nimport { ERPObjType } from \"../../types/erp-types\";\n\nexport type BatchResult<T> = {\n duplicates: T[];\n nonDuplicates: T[];\n};\n\ntype BatchCacheManagerOptions = {\n ttl?: number;\n tableName?: string;\n};\n\nexport class BatchCacheManager {\n private cacheManager: HashedCacheManager;\n\n constructor(options?: BatchCacheManagerOptions) {\n this.cacheManager = new HashedCacheManager({\n ttl: options?.ttl,\n tableName: options?.tableName,\n });\n }\n\n /**\n * Checks a batch of objects against the cache and separates them into duplicates and non-duplicates\n * @param type The type of objects\n * @param objects Array of objects to check\n * @returns Object containing arrays of duplicate and non-duplicate objects\n */\n async dedupeBatch(\n type: ERPObjType,\n objects: object[]\n ): Promise<BatchResult<object>> {\n const result: BatchResult<object> = {\n duplicates: [],\n nonDuplicates: [],\n };\n\n // Check each object individually\n for (const object of objects) {\n const hasChanged = await this.cacheManager.hasChanged(type, object);\n\n if (hasChanged) {\n result.nonDuplicates.push(object);\n } else {\n result.duplicates.push(object);\n }\n }\n\n return result;\n }\n\n /**\n * Stores a batch of objects in the cache\n * @param type The type of objects\n * @param objects Array of objects to store\n */\n async storeBatch(\n type: ERPObjType,\n objects: object[]\n ): Promise<{ totalInserted: number }> {\n // Store each object individually\n let totalInserted = 0;\n for (const object of objects) {\n if (await this.cacheManager.store(type, object)) {\n totalInserted++;\n }\n }\n return { totalInserted };\n }\n\n /**\n * Removes objects from the cache\n * @param type The type of objects\n * @param objects Array of objects to remove\n */\n async removeObjects(type: ERPObjType, objects: object[]): Promise<void> {\n // Remove each object individually\n for (const object of objects) {\n await this.cacheManager.removeRecord(type, object);\n }\n }\n\n /**\n * Gets all records of a specific type\n */\n async getRecordsByType(type: ERPObjType): Promise<string[]> {\n return this.cacheManager.getRecordsByType(type);\n }\n\n /**\n * Removes all records of a specific type\n */\n async removeRecordsByType(type: ERPObjType): Promise<void> {\n return this.cacheManager.removeRecordsByType(type);\n }\n\n /**\n * Clears all records from the cache\n */\n async clear(): Promise<void> {\n return this.cacheManager.clear();\n }\n\n /**\n * Cleans up resources\n */\n async destroy(): Promise<void> {\n return this.cacheManager.destroy();\n }\n}\n","import { convertToLocalTime } from \"./timezone\";\nimport { MMReceiveLaborTicket } from \"../services/mm-api-service/types/receive-types\";\n\n/**\n * Apply timezone offsets to datetime fields specifically for the MMApiReceiveLaborTicket object from the Zulu-based MM API\n * (presumably) before sending to the ERP\n * @param laborTicket The MMApiReceiveLaborTicket object to convert\n * @param timezoneOffset The timezone offset to apply\n */\nexport function convertLaborTicketToLocalTimezone(\n laborTicket: MMReceiveLaborTicket,\n timezoneOffset: number\n): MMReceiveLaborTicket {\n const timeFields = [\n \"clockIn\",\n \"clockOut\",\n \"transactionDate\",\n \"createdAt\",\n \"updatedAt\",\n \"workOrderOperationClosedDate\",\n ] as const;\n\n timeFields.forEach((field) => {\n const localTime = convertToLocalTime(laborTicket[field], timezoneOffset);\n laborTicket[field] = localTime?.toISOString() || null;\n });\n return laborTicket;\n}\n","import { ERPType } from \"../../types/erp-types\";\nimport { IERPLaborTicketHandler } from \"../../types/erp-connector\";\nimport { MMApiClient } from \"../../services/mm-api-service/mm-api-service\";\nimport { MMReceiveLaborTicket } from \"../../services/mm-api-service/types/receive-types\";\nimport { convertLaborTicketToLocalTimezone } from \"../mm-labor-ticket-helpers\";\nimport { getCachedTimezoneOffset } from \"../local-data-store/jobs-shared-data\";\nimport logger from \"../../services/reporting-service/logger\";\n\n/**\n * Handles synchronization of labor tickets between MachineMetrics and ERP systems\n */\nexport class LaborTicketERPSynchronizer {\n /**\n * Synchronizes updated labor tickets from MachineMetrics to an ERP system\n */\n static async syncToERP(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n try {\n const mmApiClient = new MMApiClient();\n const failedLaborTicketRefs: string[] = [];\n\n await mmApiClient.initializeCheckpoint({\n system: connectorType,\n table: \"labor_tickets\",\n checkpointType: \"export\",\n checkpointValue: {\n timestamp: new Date().toISOString(),\n },\n });\n\n const fallbackTimestamp = new Date().toISOString();\n const laborTicketsUpdates = await mmApiClient.fetchLaborTicketUpdates({\n system: connectorType,\n checkpointType: \"export\",\n });\n\n if (laborTicketsUpdates.length === 0) {\n logger.info(\"syncLaborTicketsToERP:No updated labor tickets found\");\n return;\n }\n\n logger.info(\n `ToERP: Found ${laborTicketsUpdates.length} Labor Ticket Ids and Refs to process`,\n {\n laborTickets: laborTicketsUpdates.map(\n (ticket: MMReceiveLaborTicket) => ({\n ref: ticket.laborTicketRef,\n id: ticket.laborTicketId,\n })\n ),\n }\n );\n\n // Find the most recent updatedAt timestamp from labor tickets. This will be used to update\n // the checkpoint to ensure there is no gap of time for the next sync.\n const mostRecentUpdate = laborTicketsUpdates.reduce(\n (latest: string | null, ticket: MMReceiveLaborTicket) => {\n if (!latest || !ticket.updatedAt) return latest;\n return new Date(ticket.updatedAt) > new Date(latest)\n ? ticket.updatedAt\n : latest;\n },\n null as string | null\n );\n\n await Promise.all(\n laborTicketsUpdates.map(async (laborTicket: MMReceiveLaborTicket) => {\n if (!laborTicket.laborTicketRef) {\n logger.error(\n \"syncLaborTicketsToERP: laborTicketRef is not set for laborTicket pulled from MM:\",\n { laborTicket }\n );\n return undefined;\n }\n\n try {\n return await this.processLaborTicket(\n connector,\n mmApiClient,\n laborTicket\n );\n } catch (error) {\n failedLaborTicketRefs.push(laborTicket.laborTicketRef);\n logger.error(\n `syncLaborTicketsToERP: Error processing laborTicketRef ${laborTicket.laborTicketRef}:`,\n { error }\n );\n return undefined;\n }\n })\n );\n\n logger.info(\n `syncLaborTicketsToERP: ${failedLaborTicketRefs.length} failed labor ticket ids`\n );\n if (failedLaborTicketRefs.length > 0) {\n logger.info(\n `syncLaborTicketsToERP: Reporting ${failedLaborTicketRefs.length} labor ticket failures:`,\n {\n failedLaborTicketRefs,\n }\n );\n const addFailedResult = await mmApiClient.addFailedLaborTicketRefs(\n connectorType,\n failedLaborTicketRefs\n );\n logger.info(\"syncLaborTicketsToERP: addFailedResult:\", {\n addFailedResult,\n });\n }\n\n mmApiClient.saveCheckpoint({\n system: connectorType,\n table: \"labor_tickets\",\n checkpointType: \"export\",\n checkpointValue: {\n timestamp: mostRecentUpdate || fallbackTimestamp,\n },\n });\n } catch (error) {\n logger.error(\"syncLaborTicketsToERP: Error:\", error);\n }\n }\n\n /**\n * Retries labor tickets that have failed to be created or updated in the ERP during the sync\n */\n static async retryFailed(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n try {\n const mmApiClient = new MMApiClient();\n const successLaborTicketIds: string[] = [];\n\n const laborTickets =\n await mmApiClient.fetchFailedLaborTickets(connectorType);\n if (laborTickets.length === 0) {\n logger.info(\"retryFailedLaborTickets: No failed labor tickets found\");\n return;\n }\n logger.info(\n \"retryFailedLaborTickets: Failed Labor Tickets count:\" +\n laborTickets.length\n );\n\n await Promise.all(\n laborTickets.map(async (laborTicket: MMReceiveLaborTicket) => {\n if (!laborTicket.laborTicketRef) {\n logger.error(\n \"retryFailedLaborTickets: laborTicketRef is not set for laborTicket pulled from MM:\",\n { laborTicket }\n );\n return undefined;\n }\n\n try {\n const laborTicketResult = await this.processLaborTicket(\n connector,\n mmApiClient,\n laborTicket\n );\n successLaborTicketIds.push(laborTicket.laborTicketRef);\n return laborTicketResult;\n } catch (error) {\n logger.error(\n \"retryFailedLaborTickets: Error processing laborTicketRef:\",\n { laborTicketRef: laborTicket.laborTicketRef, error }\n );\n return undefined;\n }\n })\n );\n\n if (successLaborTicketIds.length > 0) {\n logger.info(\"Deleting failed labor ticket ids:\", {\n successLaborTicketIds,\n });\n const deleteFailedResult = await mmApiClient.deleteFailedLaborTicketIds(\n connectorType,\n successLaborTicketIds\n );\n logger.info(\"deleteFailedResult:\", { deleteFailedResult });\n }\n } catch (error) {\n logger.error(\"retryFailedLaborTickets: Error:\", error);\n }\n }\n\n // ============================================================================\n // PRIVATE HELPER METHODS\n // ============================================================================\n\n private static async writeLaborTicketIdToMM(\n mmApiClient: MMApiClient,\n laborTicket: MMReceiveLaborTicket,\n laborTicketResult: MMReceiveLaborTicket\n ): Promise<void> {\n const updateRefAPIResponse = await mmApiClient.updateLaborTicketIdByRef(\n laborTicket.laborTicketRef,\n laborTicketResult.laborTicketId\n );\n logger.info(\n `Updated laborTicketId ${laborTicketResult.laborTicketId} for laborTicketRef ${laborTicket.laborTicketRef} in MM:`,\n { updateRefAPIResponse }\n );\n }\n\n private static async processLaborTicket(\n connector: IERPLaborTicketHandler,\n mmApiClient: MMApiClient,\n laborTicket: MMReceiveLaborTicket\n ): Promise<MMReceiveLaborTicket> {\n let laborTicketResult: MMReceiveLaborTicket;\n\n laborTicketResult = convertLaborTicketToLocalTimezone(\n laborTicket,\n getCachedTimezoneOffset()\n );\n\n logger.info(\n `processing laborTicket, id=${laborTicket.laborTicketId}, ref=${laborTicket.laborTicketRef}`\n );\n logger.debug({ laborTicket });\n\n // MLW TODO: Should we always swap out the resource ID for the machine group ID if it is found?\n // Or use a flag? What about the default resource ID as used by syteline? A Rutherford consultation is in order.\n /**\n * Swapping out the resource ID for the group id corresponding to the\n * resource ID in the ERP would be done like so:\n * const machineGroupId = await mmApiClient.getResourceERPGroupId(laborTicket.resourceId);\n * if(machineGroupId) {\n * laborTicket.resourceId = machineGroupId;\n * }\n */\n\n if (!laborTicket.laborTicketId) {\n const { laborTicket: laborTicketResult, erpUid } =\n await connector.createLaborTicketInERP(laborTicket);\n laborTicketResult.laborTicketId = erpUid;\n await this.writeLaborTicketIdToMM(\n mmApiClient,\n laborTicket,\n laborTicketResult\n );\n } else {\n laborTicketResult = await connector.updateLaborTicketInERP(laborTicket);\n }\n\n logger.info(\"ToERP: laborTicket update result:\", {\n laborTicketResult:\n laborTicketResult || \"Failed to create/update labor ticket\",\n laborTicketRef: laborTicket.laborTicketRef,\n operation: laborTicket.laborTicketId ? \"update\" : \"create\",\n });\n\n return laborTicketResult;\n }\n}\n","import { ERPObjType } from \"../../../types/erp-types\";\nimport { IToRESTApiObject } from \"..\";\nimport {\n MMSendPerson,\n MMSendResource,\n MMSendPart,\n MMSendPartOperation,\n MMSendWorkOrder,\n MMSendWorkOrderOperation,\n MMSendLaborTicket,\n MMSendReason,\n} from \"..\";\n\n/**\n * Utility class for transforming entities to/from non-typed and typed objects\n * for interacting with the MachineMetrics API..\n */\nexport class EntityTransformer {\n // ============================================================================\n // PUBLIC INTERFACE METHODS\n // ============================================================================\n\n /**\n * Extracts the primary key from a record based on entity type\n * @param entityType The type of entity being processed\n * @param record The record to extract primary key from\n * @returns A string representation of the primary key\n * @throws Error if primary key fields are missing or invalid\n */\n static extractPrimaryKey(\n entityType: ERPObjType,\n record: IToRESTApiObject\n ): string {\n switch (entityType) {\n case ERPObjType.PERSONS:\n return this.extractPersonKey(record);\n case ERPObjType.RESOURCES:\n return this.extractResourceKey(record);\n case ERPObjType.PARTS:\n return this.extractPartKey(record);\n case ERPObjType.PART_OPERATION:\n return this.extractPartOperationKey(record);\n case ERPObjType.WORK_ORDERS:\n return this.extractWorkOrderKey(record);\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return this.extractWorkOrderOperationKey(record);\n case ERPObjType.LABOR_TICKETS:\n return this.extractLaborTicketKey(record);\n case ERPObjType.REASONS:\n return this.extractReasonKey(record);\n default:\n throw new Error(\n `Unsupported entity type for primary key extraction: ${entityType}`\n );\n }\n }\n\n /**\n * Reconstructs a typed object from plain data based on entity type\n * @param entityType The type of entity being processed\n * @param plainData The plain data object containing entity fields\n * @returns A properly typed IToRESTApiObject instance\n * @throws Error if the entity type is not supported\n */\n static reconstructFromPlainData(\n entityType: ERPObjType,\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n switch (entityType) {\n case ERPObjType.PERSONS:\n return this.reconstructPerson(plainData);\n case ERPObjType.RESOURCES:\n return this.reconstructResource(plainData);\n case ERPObjType.PARTS:\n return this.reconstructPart(plainData);\n case ERPObjType.PART_OPERATION:\n return this.reconstructPartOperation(plainData);\n case ERPObjType.WORK_ORDERS:\n return this.reconstructWorkOrder(plainData);\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return this.reconstructWorkOrderOperation(plainData);\n case ERPObjType.LABOR_TICKETS:\n return this.reconstructLaborTicket(plainData);\n case ERPObjType.REASONS:\n return this.reconstructReason(plainData);\n default:\n throw new Error(\n `Unsupported entity type for reconstruction: ${entityType}`\n );\n }\n }\n\n /**\n * Reconstructs multiple typed objects from plain data based on entity type\n * @param entityType The type of entity being processed\n * @param plainDataArray Array of plain data objects containing entity fields\n * @returns Array of properly typed IToRESTApiObject instances\n */\n static reconstructMultipleFromPlainData(\n entityType: ERPObjType,\n plainDataArray: Record<string, string | null>[]\n ): IToRESTApiObject[] {\n return plainDataArray.map((plainData) =>\n this.reconstructFromPlainData(entityType, plainData)\n );\n }\n\n // ============================================================================\n // PRIVATE ENTITY-SPECIFIC KEY EXTRACTION METHODS\n // ============================================================================\n\n private static extractPersonKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(restApiObject, [\"personId\"], \"PERSONS\", [\n \"personId\",\n ]);\n }\n\n private static extractResourceKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"resourceId\"],\n \"RESOURCES\",\n [\"resourceId\"]\n );\n }\n\n private static extractPartKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"partNumber\", \"partRevision\", \"method\"],\n \"PARTS\",\n [\"partNumber\"]\n );\n }\n\n private static extractPartOperationKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"partNumber\", \"partRevision\", \"method\", \"sequenceNumber\"],\n \"PART_OPERATION\",\n [\"partNumber\", \"sequenceNumber\"]\n );\n }\n\n private static extractWorkOrderKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"workOrderId\", \"lot\", \"split\", \"sub\"],\n \"WORK_ORDERS\",\n [\"workOrderId\"]\n );\n }\n\n private static extractWorkOrderOperationKey(\n record: IToRESTApiObject\n ): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(\n restApiObject,\n [\"workOrderId\", \"lot\", \"split\", \"sub\", \"sequenceNumber\"],\n \"WORK_ORDER_OPERATIONS\",\n [\"workOrderId\", \"sequenceNumber\"]\n );\n }\n\n private static extractLaborTicketKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n\n // Labor tickets can use laborTicketId if present, otherwise use operational context\n if (restApiObject.laborTicketId) {\n return this.validateAndExtractKey(\n restApiObject,\n [\"laborTicketId\"],\n \"LABOR_TICKETS\",\n [\"laborTicketId\"]\n );\n } else {\n return this.validateAndExtractKey(\n restApiObject,\n [\n \"workOrderId\",\n \"lot\",\n \"split\",\n \"sub\",\n \"sequenceNumber\",\n \"resourceId\",\n \"personId\",\n ],\n \"LABOR_TICKETS\",\n [\"workOrderId\", \"sequenceNumber\", \"resourceId\", \"personId\"]\n );\n }\n }\n\n private static extractReasonKey(record: IToRESTApiObject): string {\n const restApiObject = record.toRESTApiObject();\n return this.validateAndExtractKey(restApiObject, [\"reasonId\"], \"REASONS\", [\n \"reasonId\",\n ]);\n }\n\n // ============================================================================\n // PRIVATE ENTITY-SPECIFIC RECONSTRUCTION METHODS\n // ============================================================================\n\n private static reconstructPerson(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendPerson.fromPlainObject(plainData);\n }\n\n private static reconstructResource(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendResource.fromPlainObject(plainData);\n }\n\n private static reconstructPart(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendPart.fromPlainObject(plainData);\n }\n\n private static reconstructPartOperation(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendPartOperation.fromPlainObject(plainData);\n }\n\n private static reconstructWorkOrder(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendWorkOrder.fromPlainObject(plainData);\n }\n\n private static reconstructWorkOrderOperation(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendWorkOrderOperation.fromPlainObject(plainData);\n }\n\n private static reconstructLaborTicket(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendLaborTicket.fromPlainObject(plainData);\n }\n\n private static reconstructReason(\n plainData: Record<string, string | null>\n ): IToRESTApiObject {\n return MMSendReason.fromPlainObject(plainData);\n }\n\n // ============================================================================\n // SHARED UTILITY METHODS\n // ============================================================================\n\n /**\n * Helper method to validate and extract primary key components\n * @param restApiObject The REST API object representation\n * @param keyFields The fields that make up the primary key\n * @param entityTypeName The entity type name for error messages\n * @param requiredFields The fields that must be non-empty (others can be empty)\n * @returns Combined primary key string\n * @throws Error if any required field is missing or null\n */\n private static validateAndExtractKey(\n restApiObject: Record<string, string | null>,\n keyFields: string[],\n entityTypeName: string,\n requiredFields: string[]\n ): string {\n const keyValues: string[] = [];\n\n for (const field of keyFields) {\n const value = restApiObject[field];\n\n // Check if this field is required\n if (requiredFields.includes(field)) {\n if (value === null || value === undefined || value === \"\") {\n throw new Error(\n `Primary key field '${field}' is missing or empty for entity type ${entityTypeName}`\n );\n }\n }\n\n // Use the value if present, otherwise use empty string\n keyValues.push(value || \"\");\n }\n\n return keyValues.join(\"|\");\n }\n}\n","import { ERPObjType } from \"../../types/erp-types\";\nimport { BatchCacheManager } from \"../../services/caching-service/batch-cache-manager\";\nimport {\n IToRESTApiObject,\n MM207NonLaborTicketResponse,\n MM207LaborTicketResponse,\n} from \"../../services/mm-api-service\";\nimport { EntityTransformer } from \"../../services/mm-api-service/types/entity-transformer\";\nimport logger from \"../../services/reporting-service/logger\";\n\n/**\n * Handles error processing and record management utilities for MM API operations\n */\nexport class ErrorProcessor {\n /**\n * Creates a set of primary keys for all failed records from batch errors\n * @param entityType The type of entity being processed\n * @param batchErrors Array of batch errors containing failed entities\n * @returns Set of primary keys for failed records\n */\n static createFailedRecordKeySet(\n entityType: ERPObjType,\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>\n ): Set<string> {\n const failedKeySet = new Set<string>();\n\n batchErrors.forEach((batchError) => {\n batchError.affectedEntities.forEach((affectedEntity) => {\n try {\n const primaryKey = EntityTransformer.extractPrimaryKey(\n entityType,\n affectedEntity\n );\n failedKeySet.add(primaryKey);\n } catch (error) {\n logger.warn(\n `Failed to extract primary key from error entity: ${error}`\n );\n // Continue processing other records even if one fails\n }\n });\n });\n\n return failedKeySet;\n }\n\n /**\n * Filters out failed records, returning only successful ones\n * @param entityType The type of entity being processed\n * @param allRecords All records (typed objects) that were sent to the API\n * @param failedKeySet Set of primary keys for records that failed\n * @returns Array of records that succeeded\n */\n static filterSuccessfulRecords(\n entityType: ERPObjType,\n allRecords: IToRESTApiObject[],\n failedKeySet: Set<string>\n ): IToRESTApiObject[] {\n const successfulRecords: IToRESTApiObject[] = [];\n\n allRecords.forEach((record) => {\n try {\n const primaryKey = EntityTransformer.extractPrimaryKey(\n entityType,\n record\n );\n if (!failedKeySet.has(primaryKey)) {\n successfulRecords.push(record);\n }\n } catch (error) {\n logger.warn(\n `Failed to extract primary key from record during filtering: ${error}`\n );\n // If we can't extract the key, we can't determine if it failed, so skip it\n }\n });\n\n return successfulRecords;\n }\n\n /**\n * Orchestrates the caching of successful records on partial failure\n * @param entityType The type of entity being processed\n * @param toProcess All records that were sent to the API (all are now guaranteed to be typed objects)\n * @param batchErrors Array of batch errors containing failed entities\n * @param batchCacheManager The cache manager instance\n */\n static async cacheSuccessfulRecordsOnPartialFailure(\n entityType: ERPObjType,\n toProcess: IToRESTApiObject[],\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>,\n batchCacheManager: BatchCacheManager\n ): Promise<void> {\n // Create a set of failed record keys for efficient lookup\n const failedKeySet = this.createFailedRecordKeySet(entityType, batchErrors);\n\n // Filter to get only successful records\n const successfulRecords = this.filterSuccessfulRecords(\n entityType,\n toProcess,\n failedKeySet\n );\n\n logger.info(\n `Caching ${successfulRecords.length} successful records out of ${toProcess.length} total records`\n );\n\n // All records are now guaranteed to be typed objects, so we can cache them directly\n if (successfulRecords.length > 0) {\n await batchCacheManager.storeBatch(entityType, successfulRecords);\n }\n }\n\n /**\n * Extracts error count and batch errors from MM API response for partial failures (HTTP 207)\n * This supports all entities, including the slightly different format for labor tickets.\n * In case of labor tickets, the updateErrors and insertErrors arrays are combined into affectedEntities.\n * @param mmApiResponse The full MM API response object\n * @param entityType The type of entity being processed (determines response structure)\n * @returns Object containing errorCount and batchErrors\n * See MM207NonLaborTicketResponse and MM207LaborTicketResponse for response structure details\n */\n static extractErrorDetails(\n mmApiResponse: MM207NonLaborTicketResponse | MM207LaborTicketResponse,\n entityType: ERPObjType\n ): {\n errorCount: number;\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n } {\n // Type the data property with the expected structure for HTTP 207 responses\n const data = mmApiResponse.data as\n | {\n errors?: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }>;\n updateErrors?: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }>;\n insertErrors?: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }>;\n }\n | undefined;\n\n let allErrors: Array<{\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }> = [];\n\n if (entityType === ERPObjType.LABOR_TICKETS) {\n // Labor tickets: combine updateErrors and insertErrors\n const updateErrors = data?.updateErrors || [];\n const insertErrors = data?.insertErrors || [];\n\n // Defensive validation with actionable warnings\n if (!data?.updateErrors && !data?.insertErrors) {\n logger.warn(\n \"Labor tickets partial success response missing both updateErrors and insertErrors arrays\"\n );\n }\n\n allErrors = [...updateErrors, ...insertErrors];\n } else {\n // Regular entities: use errors array\n const errors = data?.errors || [];\n\n // Defensive validation\n if (!data?.errors) {\n logger.warn(\n `${entityType} partial success response missing errors array`\n );\n }\n\n allErrors = errors;\n }\n\n const batchErrors = allErrors\n .filter(\n (error: {\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }) => {\n return error.batchData && error.batchData.length > 0;\n }\n )\n .map(\n (error: {\n message: string;\n batchData?: (IToRESTApiObject | Record<string, string | null>)[];\n }) => {\n // Reconstruct typed objects from plain data\n const typedErrorEntities = (error.batchData || []).map((entity) => {\n if (\n typeof entity === \"object\" &&\n entity !== null &&\n \"toRESTApiObject\" in entity &&\n typeof entity.toRESTApiObject === \"function\"\n ) {\n // It's already a typed object, return as-is\n return entity as IToRESTApiObject;\n } else {\n // It's plain data, reconstruct as typed object\n return EntityTransformer.reconstructFromPlainData(\n entityType,\n entity as Record<string, string | null>\n );\n }\n });\n\n return {\n message: error.message,\n affectedEntities: typedErrorEntities,\n };\n }\n );\n\n const errorCount = batchErrors.reduce((total: number, batchError) => {\n return total + batchError.affectedEntities.length;\n }, 0);\n\n return {\n errorCount,\n batchErrors,\n };\n }\n\n /**\n * Extracts error details from a 500 HTTP exception when it contains structured error data\n * @param exception The caught exception from MM API call\n * @param entityType The type of entity being processed\n * @returns Object containing errorCount and batchErrors, or null if not a structured 500 error\n * See MM500NonLaborTicketException and MM500LaborTicketException for exception structure details\n */\n static extractErrorDetailsFrom500Exception(\n exception: unknown,\n entityType: ERPObjType\n ): {\n errorCount: number;\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n } | null {\n try {\n // Cast exception to expected structure for easier access\n const ex = exception as Record<string, unknown>;\n const data = ex?.data as Record<string, unknown>;\n\n // Add diagnostic logging to understand the 500 error structure\n logger.info(\n \"writeEntitiesToMM: Analyzing 500 exception structure for diagnostic purposes\",\n {\n status: ex?.status,\n code: ex?.code,\n hasResponseData: !!data,\n responseDataKeys: data ? Object.keys(data) : [],\n errorMessage: data?.error,\n hasMessageObject: !!data?.message,\n messageObjectKeys: data?.message\n ? Object.keys(data.message as Record<string, unknown>)\n : [],\n entityType,\n exceptionType: typeof exception,\n exceptionKeys: ex ? Object.keys(ex) : [],\n }\n );\n\n // Check if this is a structured 500 error\n if (\n ex?.status !== 500 ||\n typeof data?.error !== \"string\" ||\n !data.error.startsWith(\"Failed to import\")\n ) {\n logger.info(\n \"writeEntitiesToMM: Not a structured 500 error - will re-throw exception as-is\",\n {\n status: ex?.status,\n errorMessage: data?.error,\n expectedStatus: 500,\n expectedMessagePrefix: \"Failed to import\",\n }\n );\n return null;\n }\n\n logger.info(\n \"writeEntitiesToMM: Detected structured 500 error - extracting error details\"\n );\n\n const messageObject = data?.message as Record<string, unknown>;\n if (!messageObject) {\n logger.warn(\n \"writeEntitiesToMM: Structured 500 error missing message object\"\n );\n return null;\n }\n\n let allErrors: unknown[] = [];\n\n if (entityType === ERPObjType.LABOR_TICKETS) {\n // Labor tickets: combine updateErrors and insertErrors\n const updateErrors = Array.isArray(messageObject?.updateErrors)\n ? messageObject.updateErrors\n : [];\n const insertErrors = Array.isArray(messageObject?.insertErrors)\n ? messageObject.insertErrors\n : [];\n\n logger.info(\"writeEntitiesToMM: Processing labor tickets 500 error\", {\n updateErrorsCount: updateErrors.length,\n insertErrorsCount: insertErrors.length,\n });\n\n if (updateErrors.length === 0 && insertErrors.length === 0) {\n logger.warn(\n \"writeEntitiesToMM: Labor tickets 500 error missing both updateErrors and insertErrors arrays\"\n );\n }\n\n allErrors = [...updateErrors, ...insertErrors];\n } else {\n // Regular entities: use errors array\n const errors = Array.isArray(messageObject?.errors)\n ? messageObject.errors\n : [];\n\n logger.info(\"writeEntitiesToMM: Processing regular entity 500 error\", {\n errorsCount: errors.length,\n });\n\n if (errors.length === 0) {\n logger.warn(\n `writeEntitiesToMM: ${entityType} 500 error missing errors array`\n );\n }\n\n allErrors = errors;\n }\n\n const batchErrors = allErrors\n .filter((error) => {\n const err = error as Record<string, unknown>;\n return Array.isArray(err?.batchData) && err.batchData.length > 0;\n })\n .map((error) => {\n const err = error as Record<string, unknown>;\n const batchData = err?.batchData as (\n | IToRESTApiObject\n | Record<string, string | null>\n )[];\n\n // Reconstruct typed objects from plain data\n const typedErrorEntities = (batchData || []).map((entity) => {\n if (\n typeof entity === \"object\" &&\n entity !== null &&\n \"toRESTApiObject\" in entity &&\n typeof entity.toRESTApiObject === \"function\"\n ) {\n // It's already a typed object, return as-is\n return entity as IToRESTApiObject;\n } else {\n // It's plain data, reconstruct as typed object\n return EntityTransformer.reconstructFromPlainData(\n entityType,\n entity as Record<string, string | null>\n );\n }\n });\n\n return {\n message:\n typeof err?.message === \"string\" ? err.message : \"Unknown error\",\n affectedEntities: typedErrorEntities,\n };\n });\n\n const errorCount = batchErrors.reduce((total: number, batchError) => {\n return total + batchError.affectedEntities.length;\n }, 0);\n\n logger.info(\"writeEntitiesToMM: Extracted 500 error details\", {\n batchErrorsCount: batchErrors.length,\n totalErrorCount: errorCount,\n entityType,\n });\n\n return {\n errorCount,\n batchErrors,\n };\n } catch (error) {\n // If we can't even parse the structure safely, log what we can and return null\n logger.error(\n \"writeEntitiesToMM: Failed to parse 500 exception structure safely\",\n {\n error: error instanceof Error ? error.message : String(error),\n exceptionType: typeof exception,\n entityType,\n }\n );\n return null;\n }\n }\n}\n","import { ERPObjType } from \"../../types/erp-types\";\nimport { BatchCacheManager } from \"../../services/caching-service/batch-cache-manager\";\nimport {\n IToRESTApiObject,\n MMSendPerson,\n MMSendResource,\n MMSendPart,\n MMSendPartOperation,\n MMSendWorkOrder,\n MMSendWorkOrderOperation,\n MMSendLaborTicket,\n MMSendReason,\n MMApiBaseResponse,\n MM200NonLaborTicketResponse,\n MM200LaborTicketResponse,\n MM207NonLaborTicketResponse,\n MM207LaborTicketResponse,\n} from \"../../services/mm-api-service\";\nimport { MMApiClient } from \"../../services/mm-api-service/mm-api-service\";\nimport { HTTPError } from \"../http-client\";\nimport {\n WriteEntitiesToMMResult,\n MMBatchValidationError,\n} from \"./standard-process-drivers\";\nimport { ErrorProcessor } from \"./error-processor\";\n\n/**\n * Handles processing of entities to the MachineMetrics API\n */\nexport class MMEntityProcessor {\n /**\n * Writes entities to MM API with deduplication and caching\n */\n static async writeEntities(\n entityType: ERPObjType,\n mmRecords: IToRESTApiObject[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<WriteEntitiesToMMResult> {\n const { toProcess, result } = await this._prepareAndDedupe(\n entityType,\n mmRecords,\n batchCacheManager\n );\n\n if (toProcess.length === 0) {\n result.message =\n \"All records were deduplicated locally - no records sent to MM API\";\n return result;\n }\n\n let mmApiResponse: MMApiBaseResponse;\n try {\n mmApiResponse = await this._sendToAPI(entityType, toProcess);\n } catch (exception) {\n this._handleException(exception, entityType, result);\n }\n\n return await this._handleResponse(\n mmApiResponse,\n entityType,\n toProcess,\n result,\n batchCacheManager\n );\n }\n\n // ============================================================================\n // PRIVATE HELPER METHODS\n // ============================================================================\n\n /**\n * Deduplicates records against cache\n * Returns the records to process and the result object\n * If the batchCacheManager is provided, the records are deduplicated against the cache\n * If the batchCacheManager is not provided, the records are not deduplicated\n */\n private static async _prepareAndDedupe(\n entityType: ERPObjType,\n mmRecords: IToRESTApiObject[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<{\n toProcess: IToRESTApiObject[];\n result: WriteEntitiesToMMResult;\n }> {\n let toProcess: IToRESTApiObject[] = [];\n const result: WriteEntitiesToMMResult = {\n message: \"\",\n upsertedEntities: 0,\n localDedupeCount: 0,\n apiDedupeCount: 0,\n };\n\n if (batchCacheManager) {\n const { nonDuplicates, duplicates } =\n (await batchCacheManager.dedupeBatch(entityType, mmRecords)) as {\n nonDuplicates: IToRESTApiObject[];\n duplicates: IToRESTApiObject[];\n };\n toProcess = nonDuplicates;\n result.localDedupeCount = duplicates.length;\n } else {\n toProcess = mmRecords;\n }\n\n return { toProcess, result };\n }\n\n /**\n * Sends records to MM API\n */\n private static async _sendToAPI(\n entityType: ERPObjType,\n toProcess: IToRESTApiObject[]\n ): Promise<MMApiBaseResponse> {\n const mmApiClient = new MMApiClient();\n\n switch (entityType) {\n case ERPObjType.PERSONS:\n return await mmApiClient.sendPersonsToMM(toProcess as MMSendPerson[]);\n case ERPObjType.RESOURCES:\n return await mmApiClient.sendResourcesToMM(\n toProcess as MMSendResource[]\n );\n case ERPObjType.PARTS:\n return await mmApiClient.sendPartsToMM(toProcess as MMSendPart[]);\n case ERPObjType.PART_OPERATION:\n return await mmApiClient.sendPartOperationsToMM(\n toProcess as MMSendPartOperation[]\n );\n case ERPObjType.WORK_ORDERS:\n return await mmApiClient.sendWorkOrdersToMM(\n toProcess as MMSendWorkOrder[]\n );\n case ERPObjType.WORK_ORDER_OPERATIONS:\n return await mmApiClient.sendWorkOrderOperationsToMM(\n toProcess as MMSendWorkOrderOperation[]\n );\n case ERPObjType.LABOR_TICKETS:\n return await mmApiClient.sendLaborTicketsToMM(\n toProcess as MMSendLaborTicket[]\n );\n case ERPObjType.REASONS:\n return await mmApiClient.sendReasonsToMM(toProcess as MMSendReason[]);\n default:\n throw new Error(`Unknown entity type: ${entityType}`);\n }\n }\n\n /**\n * Handles exceptions from API calls, converting structured 500 errors to MMBatchValidationError\n * @throws MMBatchValidationError for structured 500 errors\n * @throws The original exception for all other errors\n */\n private static _handleException(\n exception: unknown,\n entityType: ERPObjType,\n result: WriteEntitiesToMMResult\n ): never {\n // Handle structured 500 errors that may be appropriate for partial failure\n const structuredCompleteErrorSet =\n ErrorProcessor.extractErrorDetailsFrom500Exception(exception, entityType);\n\n if (structuredCompleteErrorSet) {\n const ex = exception as Record<string, unknown>;\n const data = ex?.data as Record<string, unknown>;\n const errorMessage =\n typeof data?.error === \"string\"\n ? data.error\n : \"All entities failed to import\";\n\n throw new MMBatchValidationError({\n message: errorMessage,\n upsertedEntities: 0,\n localDedupeCount: result.localDedupeCount,\n apiDedupeCount: 0,\n errorCount: structuredCompleteErrorSet.errorCount,\n httpStatus: (exception as HTTPError).status,\n batchErrors: structuredCompleteErrorSet.batchErrors,\n });\n }\n\n // For all other exceptions, re-throw as-is\n throw exception;\n }\n\n /**\n * Handles the MM API response based on HTTP status code, caching successful records\n * and throwing exceptions for partial failures\n *\n * @returns The final result for success cases\n * @throws MMBatchValidationError for partial success cases\n * @throws Error for unknown status codes\n */\n private static async _handleResponse(\n mmApiResponse: MMApiBaseResponse,\n entityType: ERPObjType,\n toProcess: IToRESTApiObject[],\n result: WriteEntitiesToMMResult,\n batchCacheManager: BatchCacheManager | null\n ): Promise<WriteEntitiesToMMResult> {\n if (mmApiResponse.httpStatus === 200) {\n // Complete success - cache all records\n if (batchCacheManager) {\n await batchCacheManager.storeBatch(entityType, toProcess);\n }\n\n if (entityType === ERPObjType.LABOR_TICKETS) {\n const success = mmApiResponse as MM200LaborTicketResponse;\n result.message = success.message || \"Entities processed successfully\";\n result.upsertedEntities =\n (success.updated || 0) + (success.inserted || 0);\n } else {\n const success = mmApiResponse as MM200NonLaborTicketResponse;\n result.message = success.message || \"Entities processed successfully\";\n result.upsertedEntities = success.affectedRows || 0;\n }\n result.apiDedupeCount = toProcess.length - result.upsertedEntities;\n\n return result;\n } else if (mmApiResponse.httpStatus === 207) {\n // Partial success - cache only successful records before throwing exception\n const partialResponse = mmApiResponse as\n | MM207NonLaborTicketResponse\n | MM207LaborTicketResponse;\n const { errorCount, batchErrors } = ErrorProcessor.extractErrorDetails(\n partialResponse,\n entityType\n );\n\n if (batchCacheManager) {\n await ErrorProcessor.cacheSuccessfulRecordsOnPartialFailure(\n entityType,\n toProcess,\n batchErrors,\n batchCacheManager\n );\n }\n\n let upsertedEntities = 0;\n if (entityType === ERPObjType.LABOR_TICKETS) {\n const partial = partialResponse as MM207LaborTicketResponse;\n upsertedEntities =\n (partial.data.updated || 0) + (partial.data.inserted || 0);\n } else {\n const partial = partialResponse as MM207NonLaborTicketResponse;\n upsertedEntities = partial.data.affectedRows || 0;\n }\n\n throw new MMBatchValidationError({\n message:\n partialResponse.message || \"Entities processed with partial failures\",\n upsertedEntities: upsertedEntities,\n localDedupeCount: result.localDedupeCount,\n apiDedupeCount: toProcess.length - upsertedEntities - errorCount,\n errorCount: errorCount,\n httpStatus: mmApiResponse.httpStatus,\n batchErrors: batchErrors,\n });\n } else {\n throw new Error(\n `writeEntitiesToMM: Unknown HTTP status code: ${mmApiResponse.httpStatus}. An exception was expected.`\n );\n }\n }\n}\n","import { ERPType, ERPObjType } from \"../../types/erp-types\";\nimport { IERPLaborTicketHandler } from \"../../types/erp-connector\";\nimport { BatchCacheManager } from \"../../services/caching-service/batch-cache-manager\";\nimport {\n IToRESTApiObject,\n MMSendWorkOrderBatch,\n MMSendPart,\n MMSendPartOperation,\n MMSendWorkOrder,\n MMSendWorkOrderOperation,\n} from \"../../services/mm-api-service\";\nimport { LaborTicketERPSynchronizer } from \"./labor-ticket-erp-synchronizer\";\nimport { MMEntityProcessor } from \"./mm-entity-processor\";\n\n/**\n * The result of writing entities to the MachineMetrics API on complete success.\n */\nexport interface WriteEntitiesToMMResult {\n message: string;\n upsertedEntities: number;\n localDedupeCount: number;\n apiDedupeCount: number;\n}\n\nexport class MMBatchValidationError extends Error {\n public readonly upsertedEntities: number;\n public readonly localDedupeCount: number;\n public readonly apiDedupeCount: number;\n public readonly errorCount: number;\n public readonly httpStatus: number;\n public readonly batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n\n constructor(options: {\n message: string;\n upsertedEntities: number;\n localDedupeCount: number;\n apiDedupeCount: number;\n errorCount: number;\n httpStatus: number;\n batchErrors: Array<{\n message: string;\n affectedEntities: IToRESTApiObject[]; // All entities in the failing batch\n }>;\n }) {\n super(options.message);\n this.name = \"MMBatchValidationError\";\n this.upsertedEntities = options.upsertedEntities;\n this.localDedupeCount = options.localDedupeCount;\n this.apiDedupeCount = options.apiDedupeCount;\n this.errorCount = options.errorCount;\n this.httpStatus = options.httpStatus;\n this.batchErrors = options.batchErrors;\n }\n}\n\n/**\n * A collection of standardized process drivers that orchestrate various synchronization\n * and integration processes between systems. Use of these drivers is optional,\n * and useful as a reference implementation for how to implement the various processes.\n */\nexport class StandardProcessDrivers {\n /**\n * Synchronizes updated labor tickets from MachineMetrics to an ERP system:\n *\n * Initializes a checkpoint that tracks the last time labor tickets were synced,\n * fetches labor tickets from MM and converts them to the company timezone,\n * creates or updates the labor ticket in the ERP via connector-specific implementations,\n * updates the labor ticket id in MM on newly created labor tickets,\n * and saves the checkpoint\n */\n static async syncLaborTicketsToERP(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n return LaborTicketERPSynchronizer.syncToERP(connectorType, connector);\n }\n\n /**\n * Retries labor tickets that have failed to be created or updated in the ERP during the sync:\n *\n * Fetches failed labor tickets from MM, processes them, and updates the labor ticket id in MM.\n * If the labor ticket is successfully created or updated, it is added to the list of successful labor ticket ids,\n * which are then deleted from the list of failed labor ticket ids.\n */\n static async retryFailedLaborTickets(\n connectorType: ERPType,\n connector: IERPLaborTicketHandler\n ): Promise<void> {\n return LaborTicketERPSynchronizer.retryFailed(connectorType, connector);\n }\n\n /**\n * Writes a batch of records to MM for a specific entity type by:\n * 1. Deduplicating against cached records (localDedupeCount)\n * 2. Sending non-duplicate records to the MM API (apiDedupeCount)\n * 3. Storing successful records in cache\n *\n * An example usage pattern including comprehensive error handling:\n * ```\n * try {\n * const result = await StandardProcessDrivers.writeEntitiesToMM(\n * 'WorkOrders',\n * workOrderRecords,\n * batchCacheManager\n * );\n *\n * // HTTP 200 - Complete success\n * console.log(`✅ Success: ${result.message}`);\n * console.log(`📊 Metrics: ${result.upsertedEntities} upserted, ${result.localDedupeCount} locally deduplicated, ${result.apiDedupeCount} API deduplicated`);\n *\n * } catch (error) {\n * if (error instanceof MMBatchValidationError) {\n * // HTTP 207 - Partial success with some batches failing due to validation errors\n * // HTTP 500 - A specific type representing complete failure due to validation issues;\n * // other 500 types represent failure due to other issues and are not converted to MMBatchValidationError\n * // Note: Each batch error contains ALL entities from the failing batch, not necessarily just the failed ones\n *\n * console.log(`⚠️ Batch processing completed with errors (HTTP ${error.httpStatus})`);\n * console.log(`📊 Metrics: ${error.upsertedEntities} upserted, ${error.localDedupeCount} locally deduplicated, ${error.apiDedupeCount} API deduplicated`);\n * console.log(`❌ Error count: ${error.errorCount}`);\n *\n * // Process specific batch errors for retry or logging\n * error.batchErrors.forEach((batchError, index) => {\n * console.log(`Batch ${index + 1} error: ${batchError.message}`);\n * console.log(`All entities in failing batch:`, batchError.affectedEntities);\n *\n * // Example: Queue entire failing batch for retry (contains both successful and failed entities)\n * await queueForRetry(batchError.affectedEntities);\n * });\n *\n * // Decide whether to continue or halt based on httpStatus\n * if (error.httpStatus === 207) {\n * // Partial success - some batches processed successfully, others failed\n * console.log('⚠️ Continuing with partial success');\n * } else if (error.httpStatus === 500) {\n * // Complete failure - all batches failed due to validation issues\n * console.log('🛑 Complete failure - no records processed');\n * throw error; // Re-throw if complete failure should halt the process\n * }\n *\n * } else {\n * // Other underlying errors (network issues, authentication, etc.)\n * console.error('🚨 Unexpected error during MM API call:', error);\n *\n * // Example: Check for specific error types\n * if (error.message?.includes('authentication')) {\n * console.error('🔐 Authentication issue - check MM API credentials');\n * } else if (error.message?.includes('network') || error.code === 'ECONNREFUSED') {\n * console.error('🌐 Network connectivity issue - check MM API endpoint');\n * }\n *\n * throw error; // Re-throw for upstream handling\n * }\n * }\n * ```\n *\n * @param entityType The type of entity being processed\n * @param mmRecords The records to process\n * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired\n *\n * @returns WriteEntitiesToMMResult on complete success (HTTP 200)\n * @throws MMBatchValidationError on partial success (HTTP 207) or complete failure (HTTP 500) with structured error details\n * @throws Error on other underlying issues (network, authentication, etc.)\n */\n static async writeEntitiesToMM(\n entityType: ERPObjType,\n mmRecords: IToRESTApiObject[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<WriteEntitiesToMMResult> {\n return MMEntityProcessor.writeEntities(\n entityType,\n mmRecords,\n batchCacheManager\n );\n }\n\n /**\n * Writes a batch of Work Order related entities to MM maintaining referential integrity by:\n * 1. Processing parts first (base entities)\n * 2. Processing part operations (depends on parts)\n * 3. Processing work orders (depends on parts)\n * 4. Processing work order operations (depends on work orders and part operations)\n *\n * This ensures all foreign key constraints are satisfied and prevents referential integrity errors.\n *\n * @param workOrderBatch The batch containing all related entities\n * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired\n *\n * @returns Combined results from all entity processing\n * @throws MMBatchValidationError on partial success or complete failure with structured error details\n * @throws Error on other underlying issues (network, authentication, etc.)\n */\n static async writeWorkOrderBatchToMM(\n workOrderBatch: MMSendWorkOrderBatch,\n batchCacheManager: BatchCacheManager | null\n ): Promise<{\n parts: WriteEntitiesToMMResult;\n partOperations: WriteEntitiesToMMResult;\n workOrders: WriteEntitiesToMMResult;\n workOrderOperations: WriteEntitiesToMMResult;\n }> {\n // Process entities in order to maintain referential integrity\n\n // 1. Parts first (no dependencies)\n const partsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PARTS,\n workOrderBatch.parts,\n batchCacheManager\n );\n\n // 2. Part Operations (depends on parts)\n const partOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PART_OPERATION,\n workOrderBatch.partOperations,\n batchCacheManager\n );\n\n // 3. Work Orders (depends on parts)\n const workOrdersResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDERS,\n workOrderBatch.workOrders,\n batchCacheManager\n );\n\n // 4. Work Order Operations (depends on work orders and part operations)\n const workOrderOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDER_OPERATIONS,\n workOrderBatch.workOrderOperations,\n batchCacheManager\n );\n\n return {\n parts: partsResult,\n partOperations: partOperationsResult,\n workOrders: workOrdersResult,\n workOrderOperations: workOrderOperationsResult,\n };\n }\n\n /**\n * Processes flattened work order data and syncs it to MM maintaining referential integrity.\n *\n * This method expects flattened data where each row contains both work order and operation information\n * with camelCase field names matching the GraphQL schema. It will automatically extract and deduplicate\n * parts, part operations, work orders, and work order operations, then process them in the correct order\n * to maintain referential integrity.\n *\n * @param flattenedData Array of flattened rows containing both work order and operation data (camelCase fields)\n * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired\n *\n * @returns Combined results from all entity processing with detailed logging information\n * @throws MMBatchValidationError on partial success or complete failure with structured error details\n * @throws Error on other underlying issues (network, authentication, etc.)\n */\n static async syncWorkOrderBatchFromFlattened(\n flattenedData: any[],\n batchCacheManager: BatchCacheManager | null\n ): Promise<{\n parts: WriteEntitiesToMMResult;\n partOperations: WriteEntitiesToMMResult;\n workOrders: WriteEntitiesToMMResult;\n workOrderOperations: WriteEntitiesToMMResult;\n }> {\n if (!flattenedData || flattenedData.length === 0) {\n throw new Error(\"No flattened work order data provided\");\n }\n\n // Process the flattened data - each row contains both work order and operation info\n const uniqueParts = new Map();\n const uniquePartOperations = new Map();\n const uniqueWorkOrders = new Map();\n const workOrderOperations = [];\n\n // Process each flattened row to extract entities\n for (const row of flattenedData) {\n // Extract unique parts\n const partKey = `${row.partNumber}|${row.partRevision}|${row.method}`;\n if (!uniqueParts.has(partKey)) {\n uniqueParts.set(partKey, {\n partNumber: row.partNumber, // → partNumber\n partRevision: row.partRevision, // → partRevision\n method: row.method, // → method\n });\n }\n\n // Extract unique part operations\n const partOpKey = `${row.partNumber}|${row.partRevision}|${row.method}|${row.sequenceNumber}`;\n if (!uniquePartOperations.has(partOpKey)) {\n uniquePartOperations.set(partOpKey, {\n partNumber: row.partNumber, // → partNumber\n partRevision: row.partRevision, // → partRevision\n method: row.method, // → method\n sequenceNumber: row.sequenceNumber, // → sequenceNumber\n resourceId: row.resourceId, // → resourceId\n cycleTimeMs: row.cycleTimeMs, // → cycleTimeMs\n setupTimeMs: row.setupTimeMs, // → setupTimeMs\n description: row.operationDescription || \"\", // → description\n quantityPerPart: row.quantityPerPart || 1, // → quantityPerPart\n });\n }\n\n // Extract unique work orders\n const workOrderKey = row.workOrderId;\n if (!uniqueWorkOrders.has(workOrderKey)) {\n uniqueWorkOrders.set(workOrderKey, {\n workOrderId: row.workOrderId, // → workOrderId\n lot: row.lot, // → lot\n split: row.split, // → split\n sub: row.sub, // → sub\n status: row.status, // → status\n dueDate: row.dueDate, // → dueDate\n description: row.description, // → description\n scheduledStartDate: row.scheduledStartDate, // → scheduledStartDate\n scheduledEndDate: row.scheduledEndDate, // → scheduledEndDate\n closedDate: row.closedDate, // → closedDate\n quantityRequired: row.quantityRequired, // → quantityRequired\n partNumber: row.partNumber, // → partNumber\n partRevision: row.partRevision, // → partRevision\n method: row.method, // → method\n });\n }\n\n // Add each work order operation (these are not deduplicated since each operation is unique)\n workOrderOperations.push({\n workOrderId: row.workOrderId, // → workOrderId\n lot: row.lot, // → lot\n split: row.split, // → split\n sub: row.sub, // → sub\n sequenceNumber: row.sequenceNumber, // → sequenceNumber\n resourceId: row.resourceId, // → resourceId\n startQuantity: row.startQuantity, // → startQuantity\n finishQuantity: row.finishQuantity, // → finishQuantity\n expectedRejectRate: row.expectedRejectRate, // → expectedRejectRate\n scheduledStartDate: row.opScheduledStartDate, // → scheduledStartDate\n scheduledFinishDate: row.opScheduledFinishDate, // → scheduledFinishDate\n closedDate: row.opClosedDate, // → closedDate\n cycleTimeMs: row.cycleTimeMs, // → cycleTimeMs\n setupTimeMs: row.setupTimeMs, // → setupTimeMs\n productionburdenRateHourly: row.productionburdenRateHourly, // → productionburdenRateHourly\n setupburdenRatehourly: row.setupburdenRatehourly, // → setupburdenRatehourly\n operationType: row.operationType, // → operationType\n quantityPerPart: row.quantityPerPart, // → quantityPerPart\n status: row.opStatus || row.status, // → status\n });\n }\n\n // Transform all the data directly to MM entities\n const parts = Array.from(uniqueParts.values()).map(\n (item) =>\n new MMSendPart(\n item.partNumber || \"\", // partNumber\n item.partRevision || \"\", // partRevision\n item.method || \"Standard\" // method\n )\n );\n\n const partOperations = Array.from(uniquePartOperations.values()).map(\n (item) =>\n new MMSendPartOperation(\n item.partNumber || \"\", // partNumber\n item.partRevision || \"\", // partRevision\n item.method || \"Standard\", // method\n item.sequenceNumber?.toString() || \"\", // sequenceNumber\n item.resourceId?.toString() || \"\", // resourceId\n item.cycleTimeMs || 0, // cycleTimeMs\n item.setupTimeMs || 0, // setupTimeMs\n item.description || \"\", // description\n item.quantityPerPart || 1 // quantityPerPart\n )\n );\n\n const transformedWorkOrders = Array.from(uniqueWorkOrders.values()).map(\n (item) =>\n new MMSendWorkOrder(\n item.workOrderId?.toString() || \"\", // workOrderId\n item.lot || \"\", // lot\n item.split || \"\", // split\n item.sub || \"\", // sub\n item.status || \"Open\", // status\n item.dueDate ? new Date(item.dueDate).toISOString() : null, // dueDate\n item.description || \"\", // description\n item.scheduledStartDate\n ? new Date(item.scheduledStartDate).toISOString()\n : null, // scheduledStartDate\n item.scheduledEndDate\n ? new Date(item.scheduledEndDate).toISOString()\n : null, // scheduledEndDate\n item.closedDate ? new Date(item.closedDate).toISOString() : null, // closedDate\n item.quantityRequired || 0, // quantityRequired\n item.partNumber || \"\", // partNumber\n item.partRevision || \"\", // partRevision\n item.method || \"Standard\" // method\n )\n );\n\n const transformedWorkOrderOperations = workOrderOperations.map(\n (item) =>\n new MMSendWorkOrderOperation(\n item.workOrderId?.toString() || \"\", // workOrderId\n item.lot || \"\", // lot\n item.split || \"\", // split\n item.sub || \"\", // sub\n item.sequenceNumber?.toString() || \"\", // sequenceNumber\n item.resourceId?.toString() || \"\", // resourceId\n item.startQuantity || 0, // startQuantity\n item.finishQuantity || 0, // finishQuantity\n item.expectedRejectRate || 0, // expectedRejectRate\n item.scheduledStartDate\n ? new Date(item.scheduledStartDate).toISOString()\n : null, // scheduledStartDate\n item.scheduledFinishDate\n ? new Date(item.scheduledFinishDate).toISOString()\n : null, // scheduledFinishDate\n item.closedDate ? new Date(item.closedDate).toISOString() : null, // closedDate\n item.cycleTimeMs || 0, // cycleTimeMs\n item.setupTimeMs || 0, // setupTimeMs\n parseFloat(item.productionburdenRateHourly || \"0\"), // productionburdenRateHourly\n parseFloat(item.setupburdenRatehourly || \"0\"), // setupburdenRatehourly\n item.operationType || \"Production\", // operationType\n item.quantityPerPart || 1, // quantityPerPart\n item.status || \"Open\" // status\n )\n );\n\n // Send each entity type individually in the correct order for referential integrity\n const partsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PARTS,\n parts,\n batchCacheManager\n );\n\n const partOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.PART_OPERATION,\n partOperations,\n batchCacheManager\n );\n\n const workOrdersResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDERS,\n transformedWorkOrders,\n batchCacheManager\n );\n\n const workOrderOperationsResult = await MMEntityProcessor.writeEntities(\n ERPObjType.WORK_ORDER_OPERATIONS,\n transformedWorkOrderOperations,\n batchCacheManager\n );\n\n return {\n parts: partsResult,\n partOperations: partOperationsResult,\n workOrders: workOrdersResult,\n workOrderOperations: workOrderOperationsResult,\n };\n }\n}\n","import { HTTPClient, HTTPClientFactory } from \"../../../utils/http-client\";\nimport {\n QueryParams,\n buildLogicalCondition,\n Pagination,\n} from \"./get-query-params\";\nimport { ErrorHandler } from \"../errors\";\nimport { APIResponse, ERPApiConfig } from \"../types\";\n\nconst DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries\nconst DEFAULT_PAGINATION_LIMIT = 100; // Reasonable default for most APIs\n\n/**\n * RestAPIService is a utility class for making REST API requests to an ERP system.\n * Provides methods for GET, PATCH, and POST requests, with built-in pagination support.\n *\n * @param config - Configuration for the ERP API connection\n * @param retryAttempts - Optional number of retry attempts for failed requests. Defaults to 0 (no retries)\n * @param paginationLimit - Optional default limit for paginated requests. Defaults to 100 items per page\n *\n * NOTE: assumes bearertoken-based authentication.\n */\nexport class RestAPIService {\n private client: HTTPClient;\n private config: ERPApiConfig;\n private paginationLimit: number;\n\n constructor(\n config: ERPApiConfig,\n retryAttempts?: number,\n paginationLimit?: number\n ) {\n this.config = config;\n this.paginationLimit = paginationLimit ?? DEFAULT_PAGINATION_LIMIT;\n this.client = HTTPClientFactory.getInstance({\n baseUrl: config.apiUrl,\n retryAttempts: retryAttempts ?? DEFAULT_RETRY_ATTEMPTS,\n });\n }\n\n //#region Get Request Helpers\n private async getHeaders(): Promise<Record<string, string>> {\n const token = await this.config.getAuthToken();\n return {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }\n\n private buildQueryParams(query: QueryParams = {}): URLSearchParams {\n const { limit, nextPage, filter } = query;\n const queryParams: Record<string, string> = {};\n\n if (limit) {\n queryParams.take = limit.toString();\n }\n if (nextPage) {\n queryParams.skip = nextPage;\n }\n\n if (filter) {\n if (filter.in) {\n filter.in.forEach((filterIn) => {\n const query = filterIn.value.join(\"|\");\n queryParams[`${filterIn.field}[in]`] = query;\n });\n }\n\n if (filter.and) {\n queryParams[\"filter[and]\"] = buildLogicalCondition(filter.and, \"and\");\n }\n\n if (filter.or) {\n queryParams[\"filter[or]\"] = buildLogicalCondition(filter.or, \"or\");\n }\n }\n\n return new URLSearchParams(queryParams);\n }\n\n /**\n * Builds pagination metadata for API responses\n * @param limit - Optional limit for this specific request. If not provided, uses the service's default pagination limit\n * @param nextPage - Optional next page token\n * @param previousPage - Optional previous page token\n * @param dataLength - Number of items in the current response\n * @param totalCount - Total number of items available\n * @returns Pagination metadata including count, limit, and page tokens\n */\n private buildPagination(\n limit?: number,\n nextPage?: string,\n previousPage?: string,\n dataLength: number = 0,\n totalCount?: number\n ): Pagination {\n const paging: Pagination = {\n count: totalCount || 0,\n limit: limit || this.paginationLimit,\n nextPage: undefined,\n previousPage,\n };\n\n if (limit) {\n paging.limit = limit;\n const currentSkip = parseInt(nextPage || \"0\");\n\n // Only set nextPage if:\n // 1. We have data in this response\n // 2. We haven't reached the end (current skip + limit < total count)\n if (dataLength > 0 && (!totalCount || currentSkip + limit < totalCount)) {\n paging.nextPage = `${currentSkip + limit}`;\n }\n }\n\n return paging;\n }\n\n private buildUrl(endpoint: string, queryParams?: URLSearchParams): string {\n const pathParts = [this.config.apiUrl || \"\"];\n pathParts.push(endpoint);\n\n const path = pathParts.filter(Boolean).join(\"/\");\n return queryParams ? `${path}?${queryParams.toString()}` : path;\n }\n //#endregion get request helpers\n\n async get<T>(\n endpoint: string,\n query: QueryParams = {}\n ): Promise<APIResponse<T[]>> {\n try {\n const params = this.buildQueryParams(query);\n const url = this.buildUrl(endpoint, params);\n const headers = await this.getHeaders();\n\n const response = await this.client.request<{\n Data: T[];\n TotalCount: number;\n }>({\n method: \"GET\",\n url,\n headers,\n });\n\n const paging = this.buildPagination(\n query.limit,\n query.nextPage,\n query.previousPage,\n response.data.Data?.length,\n response.data.TotalCount\n );\n\n return {\n data: response.data.Data || [],\n metadata: {\n pagination: paging,\n },\n };\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n async patch<T>(\n endpoint: string,\n id: string,\n data: Partial<T>\n ): Promise<APIResponse<T>> {\n try {\n const url = this.buildUrl(`${endpoint}/${id}`);\n const headers = await this.getHeaders();\n\n const response = await this.client.request<T>({\n method: \"PATCH\",\n url,\n data,\n headers,\n });\n\n return {\n data: response.data,\n };\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n async post<TRequest, TResponse = TRequest>(\n endpoint: string,\n data: TRequest\n ): Promise<APIResponse<TResponse>> {\n try {\n const url = this.buildUrl(endpoint);\n const headers = await this.getHeaders();\n\n const response = await this.client.request<TResponse>({\n method: \"POST\",\n url,\n data,\n headers,\n });\n\n return {\n data: response.data,\n };\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Cleanup all HTTP connections and resources\n * Call this when the service is no longer needed\n */\n async destroy(): Promise<void> {\n await this.client.destroy();\n }\n}\n","import { ERPObjType } from \"../types/erp-types\";\n\nexport function getERPAPITypeFromEntity(\n entity: string,\n entityMap: Record<ERPObjType, { entity: string }>\n): ERPObjType | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const entry = Object.entries(entityMap).find(\n ([_, value]) => value.entity === entity\n );\n return entry ? (Number(entry[0]) as ERPObjType) : undefined;\n}\n","/** A utility to get the type of an error, particularly\n * useful for the purpose of error deduplication\n * \n * Note: prefers 'code' over 'name' in the expectation that this better\n * represents the error type\n */\nconst isNonEmptyString = (v: unknown): v is string => typeof v === 'string' && v.trim().length > 0;\n\nexport function getErrorType(error: unknown): string {\n if (error && typeof error === 'object') {\n const o = error as { code?: unknown; name?: unknown; constructor?: { name?: unknown } };\n if (isNonEmptyString(o.code)) return o.code;\n if (isNonEmptyString(o.name)) return o.name;\n const ctorName = o.constructor?.name;\n if (isNonEmptyString(ctorName) && ctorName !== 'Object') return ctorName;\n }\n return 'Error';\n}\n","import { MMApiClient } from '../../services/mm-api-service/mm-api-service';\nimport logger from '../../services/reporting-service/logger';\nimport type { LogDeduper } from './log-deduper';\n\nexport type LogLevelString = 'info' | 'warn' | 'error';\n\n/**\n * dedupeKey - key used to deduplicate log entries when a LogDeduper is injected into the MMConnectorLogger\n * \n * A recommended practice is to use a meaningful unique identifier for this log entry type.\n * Examples: SyncFromERPCompleted\n * SyncFromERPError:HTTPError\n */\nexport class LogEntry {\n level: LogLevelString;\n message: string;\n dedupeKey: string;\n eventTime: number;\n\n constructor(params: { level: LogLevelString; message: string; dedupeKey: string}) {\n this.level = params.level;\n this.message = params.message;\n this.dedupeKey = params.dedupeKey;\n this.eventTime = Date.now();\n }\n}\n\n/**\n * The response from the MM connector logging API\n */\nexport interface LogResponse {\n message: string;\n processed?: number;\n}\n\n/**\n * Helper function to check if a value is a LogResponse\n */\nfunction isLogResponse(value: unknown): value is LogResponse {\n if (value === null || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n if (typeof v.message !== 'string') return false;\n if ('processed' in v && typeof v.processed !== 'number') return false;\n return true;\n}\n\n/**\n * MM Connector Logger for sending progress and error updates to the MM cloud\n * \n * This class provides helper methods to send individual logs to the\n * MM connector logging API, providing support for validation, retries, and error handling\n * according to the API specification. \n * \n * By injecting a LogDeduper, the log entries are deduplicated across jobs over a specified time window\n */\nexport class MMConnectorLogger {\n private readonly MAX_MSG_LEN = 2000;\n \n private mmApiClient: MMApiClient;\n private readonly deduper?: LogDeduper;\n private readonly source: string;\n\n constructor(source: string, deduper?: LogDeduper) {\n if (source.length < 1 || source.length > 64) {\n throw new Error('source must be 1-64 characters');\n }\n\n this.mmApiClient = new MMApiClient();\n this.deduper = deduper;\n this.source = source;\n }\n\n // Deduplication helpers are delegated to injected FileLogDeduper\n\n /**\n * Send a single log entry to the MM cloud with deduplication.\n * \n * The deduplication is handled by the injected LogDeduper.\n * If no deduper is injected, the log entry is sent without deduplication.\n * \n * The standard deduper, FileLogDeduper, stores the deduplication state in a file, \n * allowing deduplication across jobs, \n * \n * @param logEntry - The log entry to send\n * @returns Promise resolving to the API response or null if suppressed\n * @throws HTTPError if the request fails or Error if the log entry is invalid\n */\n async sendLog(logEntry: LogEntry): Promise<LogResponse | null> {\n this.validateLogEntry(logEntry);\n \n const now = Date.now();\n let messageToSend = logEntry.message;\n if (this.deduper) {\n const decision = await this.deduper.decide(logEntry, now);\n if (decision === null) return null; // suppressed\n messageToSend = decision;\n }\n\n try {\n const logEntryToSend = {\n source: this.source,\n level: logEntry.level,\n message: messageToSend\n };\n\n const response = await this.mmApiClient.sendConnectorLog(logEntryToSend);\n if (this.deduper) {\n await this.deduper.onSuccess(logEntry, now);\n }\n\n if (!isLogResponse(response)) {\n logger.warn('Unexpected success response format from MM API for connector log', { response });\n return { message: 'Unexpected success response format when sending log' };\n }\n return { message: response.message };\n\n } catch (error) {\n logger.error('Failed to send log to MM cloud', { \n level: logEntry.level,\n error: error instanceof Error ? error.message : 'Unknown error'\n });\n throw error;\n }\n }\n\n /**\n * @throws Error if validation fails\n */\n private validateLogEntry(logEntry: LogEntry): void {\n const allowedLevels: ReadonlyArray<LogLevelString> = ['info', 'warn', 'error'];\n if (!logEntry.level || !allowedLevels.includes(logEntry.level)) {\n throw new Error(`level must be one of: ${allowedLevels.join(', ')}`);\n }\n\n if (!logEntry.message || typeof logEntry.message !== 'string') {\n throw new Error('message is required and must be a string');\n }\n\n // Truncate message to MAX_MSG_LEN characters\n logEntry.message = logEntry.message.slice(0, this.MAX_MSG_LEN);\n\n if (!logEntry.dedupeKey || typeof logEntry.dedupeKey !== 'string') {\n throw new Error('dedupeKey is required and must be a string');\n }\n\n if (logEntry.dedupeKey.trim().length < 1) {\n throw new Error('dedupeKey must be a non-empty string');\n }\n }\n\n /**\n * Retry all failed transmissions silently\n * This method attempts to retry all messages that failed to transmit\n * and removes them from the failed list if successful, else leaves them for the client to retry\n * \n * Expected usage is by a client to call this as part of its own retry mechanism\n */\n async retryFailedTransmissions(): Promise<void> {\n if (!this.deduper || !this.deduper.retryFailedTransmissions) {\n return;\n }\n await this.deduper.retryFailedTransmissions(async (entry, message) => {\n await this.mmApiClient.sendConnectorLog({\n source: this.source,\n level: entry.level,\n message\n });\n });\n }\n\n /**\n * Clean up resources\n */\n async destroy(): Promise<void> {\n await this.mmApiClient.destroy();\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport logger from '../../services/reporting-service/logger';\nimport type { LogEntry, LogLevelString } from './mm-connector-logger';\n\n/**\n * Implement a custom LogDeduper or use the provided FileLogDeduper\n */\nexport interface LogDeduper {\n decide(entry: LogEntry, now: number): Promise<string | null>;\n onSuccess(entry: LogEntry, now: number): Promise<void>;\n retryFailedTransmissions?(send: (entry: LogEntry, message: string) => Promise<void>): Promise<void>;\n}\n\ninterface LogDedupeEntry {\n lastTransmitted: number;\n suppressedCount: number;\n firstUnsentEventTs: number; // Earliest unsent occurrence time for the current unsent batch (if any)\n lastEventTs: number; // Most recent occurrence time (allowed or suppressed)\n level: LogLevelString;\n message: string;\n}\n\n/**\n * LogDedupeStore is the store for of the most recent log entries for each dedupeKey\n */\ninterface LogDedupeStore {\n [key: string]: LogDedupeEntry;\n}\n\n/**\n * FileLogDeduper implements the LogDeduper interface to deduplicate\n * logs by storing them in a file; this allows deduping across jobs.\n */\nexport class FileLogDeduper implements LogDeduper {\n private readonly storeFilePath: string;\n private readonly windowMs: number;\n private readonly ttlMs: number;\n private readonly sweepIntervalMs: number;\n private lastSweepTsMs: number;\n\n private readonly DEFAULT_WINDOW_TEN_MINS = 600;\n private readonly DEFAULT_TTL_ONE_HOUR = 3600;\n private readonly DEFAULT_SWEEP_INTERVAL_FIVE_MINS = 300;\n private readonly DEFAULT_STORE_FILE_PATH = path.join('/tmp', 'log-deduplication.json');\n\n /**\n * Ctor.\n * @param storeFilePath: The path to the file where the deduplication store is stored; recommended is to use the default\n * @param windowSeconds: Suppression window. Duplicates within this period are suppressed.\n * @param ttlSeconds: Eviction TTL. Store entries for keys inactive beyond this are removed. Enforced to be ≥ windowSeconds.\n * @param sweepIntervalSeconds: Efficiency parameter. How often (min interval) to run opportunistic eviction; retry always sweeps\n * The sweep is lazy, used only when the store is accessed\n */\n constructor({\n storeFilePath = this.DEFAULT_STORE_FILE_PATH,\n windowSeconds = this.DEFAULT_WINDOW_TEN_MINS,\n ttlSeconds = this.DEFAULT_TTL_ONE_HOUR,\n sweepIntervalSeconds = this.DEFAULT_SWEEP_INTERVAL_FIVE_MINS\n } : {\n storeFilePath?: string;\n windowSeconds?: number;\n ttlSeconds?: number;\n sweepIntervalSeconds?: number;\n } = {}) {\n\n this.storeFilePath = storeFilePath;\n this.windowMs = Math.max(1, windowSeconds) * 1000;\n this.ttlMs = Math.max(this.windowMs, Math.max(1, ttlSeconds) * 1000);\n this.sweepIntervalMs = Math.max(1, sweepIntervalSeconds) * 1000;\n this.lastSweepTsMs = 0;\n\n this.ensureStoreFileExists();\n }\n\n /** \n * Deduplication gating function\n * Returns the formatted message to send, or null to suppress\n * Decision is based on the dedupeKey and the time of the entry\n */\n async decide(entry: LogEntry, now: number): Promise<string | null> {\n if (!entry.dedupeKey || typeof entry.dedupeKey !== 'string' || entry.dedupeKey.trim().length === 0) {\n throw new Error('dedupeKey is required and must be a non-empty string');\n }\n const key = entry.dedupeKey;\n\n return this.withLock(async () => {\n const store = this.readStore();\n\n // Opportunistic eviction gated by sweep interval\n if (now - this.lastSweepTsMs >= this.sweepIntervalMs) {\n this.evictExpiredInStore(store, now);\n this.lastSweepTsMs = now;\n this.writeStore(store);\n }\n const existing = store[key];\n\n if (existing) {\n const withinWindow = existing.lastTransmitted > 0 && (existing.lastTransmitted + this.windowMs) > now;\n if (withinWindow) {\n // Suppress and increment count\n store[key] = {\n ...existing,\n suppressedCount: existing.suppressedCount + 1,\n firstUnsentEventTs: existing.suppressedCount === 0 ? (entry.eventTime ?? now) : existing.firstUnsentEventTs,\n lastEventTs: entry.eventTime ?? now,\n level: entry.level,\n message: entry.message\n };\n this.writeStore(store);\n return null;\n }\n\n // Outside window: allow, include timestamp and prior suppression count\n const messageToSend = this.formatMessage(entry.message, entry.eventTime ?? now, existing.suppressedCount, existing.firstUnsentEventTs);\n store[key] = {\n ...existing,\n suppressedCount: 0,\n firstUnsentEventTs: 0,\n lastEventTs: entry.eventTime ?? now,\n level: entry.level,\n message: entry.message\n };\n this.writeStore(store);\n return messageToSend;\n }\n\n // New entry: allow, timestamp, no suppression count\n const messageToSend = this.formatMessage(entry.message, entry.eventTime ?? now, 0);\n store[key] = {\n lastTransmitted: 0,\n suppressedCount: 0,\n firstUnsentEventTs: entry.eventTime ?? now,\n lastEventTs: entry.eventTime ?? now,\n level: entry.level,\n message: entry.message\n };\n this.writeStore(store);\n return messageToSend;\n });\n }\n\n async onSuccess(entry: LogEntry, now: number): Promise<void> {\n if (!entry.dedupeKey || typeof entry.dedupeKey !== 'string' || entry.dedupeKey.trim().length === 0) {\n throw new Error('dedupeKey is required and must be a non-empty string');\n }\n const key = entry.dedupeKey;\n\n await this.withLock(async () => {\n const store = this.readStore();\n const existing = store[key];\n if (existing) {\n store[key] = {\n ...existing,\n lastTransmitted: now,\n firstUnsentEventTs: 0,\n suppressedCount: 0\n };\n this.writeStore(store);\n }\n });\n }\n\n async retryFailedTransmissions(send: (entry: LogEntry, message: string) => Promise<void>): Promise<void> {\n // Best-effort retry: first sweep expired entries, then iterate over entries with lastTransmitted === 0\n const now = Date.now();\n const entries = await this.withLock(async () => {\n const store = this.readStore();\n // Always sweep on retry\n this.evictExpiredInStore(store, now);\n this.lastSweepTsMs = now;\n this.writeStore(store); \n return Object.entries(store)\n .filter(([, rec]) => rec.lastTransmitted === 0)\n .map(([key, rec]) => ({ key, rec }));\n });\n\n for (const { key, rec } of entries) {\n try {\n const message = this.formatMessage(rec.message, rec.lastEventTs, rec.suppressedCount, rec.firstUnsentEventTs);\n await send({ level: rec.level, message: rec.message, dedupeKey: key, eventTime: rec.lastEventTs }, message);\n // Mark success\n await this.withLock(async () => {\n const store = this.readStore();\n const current = store[key];\n if (current) {\n store[key] = {\n ...current,\n lastTransmitted: Date.now(),\n suppressedCount: 0\n };\n this.writeStore(store);\n }\n });\n } catch (err) {\n // Leave entry for future retries; do not throw\n logger.error('Failed to retry failed transmission', { key, rec, error: err });\n return;\n }\n }\n }\n\n // --- Internals ---\n\n private ensureStoreFileExists(): void {\n try {\n if (!fs.existsSync(this.storeFilePath)) {\n fs.writeFileSync(this.storeFilePath, JSON.stringify({}), 'utf-8');\n }\n } catch {\n // ignore\n }\n }\n\n private readStore(): LogDedupeStore {\n try {\n if (!fs.existsSync(this.storeFilePath)) return {};\n const content = fs.readFileSync(this.storeFilePath, 'utf-8');\n return content ? (JSON.parse(content) as LogDedupeStore) : {};\n } catch {\n return {};\n }\n }\n\n private writeStore(store: LogDedupeStore): void {\n try {\n fs.writeFileSync(this.storeFilePath, JSON.stringify(store, null, 2), 'utf-8');\n } catch {\n // ignore\n }\n }\n\n private formatMessage(message: string, eventTs: number, suppressedCount: number, firstUnsentEventTs?: number): string {\n const timestamp = new Date(eventTs).toISOString();\n const base = `${timestamp} | ${message}`;\n if (suppressedCount > 0) {\n const since = firstUnsentEventTs && firstUnsentEventTs > 0 ? ` since ${new Date(firstUnsentEventTs).toISOString()}` : '';\n return `${base} (${suppressedCount} suppressed${since})`;\n }\n return base;\n }\n\n private async withLock<T>(fn: () => Promise<T>): Promise<T> {\n const lockPath = `${this.storeFilePath}.lock`;\n const start = Date.now();\n\n // Try to acquire the lock with retries (best effort)\n // Avoid infinite waits; cap at ~3 seconds\n while (true) {\n try {\n const fd = fs.openSync(lockPath, 'wx');\n try {\n const result = await fn();\n return result;\n } finally {\n try { fs.closeSync(fd); } catch {/* ignore */}\n try { fs.unlinkSync(lockPath); } catch {/* ignore */}\n }\n } catch {\n // Lock exists\n if (Date.now() - start > 3000) {\n // Timed out; proceed without lock to avoid deadlock\n return await fn();\n }\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n }\n }\n\n /**\n * Evict expired entries from the store based on the TTL and the key's last transmitted time\n */\n private evictExpiredInStore(store: LogDedupeStore, now: number): void {\n const keys = Object.keys(store);\n if (keys.length === 0) return;\n for (const key of keys) {\n const rec = store[key];\n const referenceTs = rec.lastTransmitted > 0 ? rec.lastTransmitted : rec.lastEventTs;\n if (now - referenceTs > this.ttlMs) {\n delete store[key];\n }\n }\n }\n}\n","import logger from \"../services/reporting-service/logger\";\nimport { CoreConfiguration } from \"../services/data-sync-service/configuration-manager\";\nimport { SQLiteCoordinator } from \"../services/sqlite-service\";\nimport { getTimezoneOffsetAndPersist } from \"./time-utils\";\nimport knex from \"knex\";\nimport config from \"../knexfile\";\n\n/**\n * Utility class to handle application initialization tasks\n */\nexport class ApplicationInitializer {\n /**\n * Performs all necessary application initialization tasks\n * This should be called before starting any services or jobs\n */\n public static async initialize(): Promise<void> {\n try {\n logger.info(\n \"\\n================================INITIALIZING APPLICATION================================\\n\"\n );\n\n // Load and validate core configuration\n const coreConfig = CoreConfiguration.inst();\n logger.info(\"Core Configuration loaded:\", coreConfig);\n\n // Perform database startup checks\n logger.info(\"Performing database startup checks...\");\n await SQLiteCoordinator.performStartupCheck();\n logger.info(\"Database startup checks completed successfully\");\n\n // Run database migrations to ensure all tables exist\n logger.info(\"Running database migrations...\");\n await ApplicationInitializer.runMigrations();\n logger.info(\"Database migrations completed successfully\");\n\n // Required for most connectors\n await getTimezoneOffsetAndPersist();\n\n logger.info(\n \"\\n================================APPLICATION INITIALIZATION COMPLETED================================\\n\"\n );\n } catch (error) {\n logger.error(\"Critical initialization failure. Exiting.\", error);\n process.exitCode = 1;\n }\n }\n\n /**\n * Runs database migrations to ensure all required tables exist\n */\n private static async runMigrations(): Promise<void> {\n const db = knex(config.local);\n try {\n await db.migrate.latest();\n } catch (error) {\n logger.error(\"Error running migrations:\", error);\n throw error;\n } finally {\n await db.destroy();\n }\n }\n}\n","import {\n HTTPClient,\n HTTPClientFactory,\n HTTPResponse,\n} from \"../../../utils/http-client\";\nimport { GraphQLResponse } from \"./types\";\nimport { ErrorHandler } from \"../errors\";\nimport { APIResponse } from \"../types\";\nimport { ERPApiConfig } from \"../types\";\n\nconst DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries\n\nexport class GraphQLService {\n private client: HTTPClient;\n private config: ERPApiConfig;\n private endpoint: string;\n\n constructor(config: ERPApiConfig, endpoint: string, retryAttempts?: number) {\n this.config = config;\n this.endpoint = endpoint\n ? endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`\n : \"\";\n this.client = HTTPClientFactory.getInstance({\n baseUrl: config.apiUrl,\n retryAttempts: retryAttempts ?? DEFAULT_RETRY_ATTEMPTS,\n });\n }\n\n private async getHeaders(): Promise<Record<string, string>> {\n const token = await this.config.getAuthToken();\n return {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }\n\n /**\n * Handles a GraphQL response, properly handling both successful responses\n * and GraphQL-level errors (which come in a 200 HTTP response)\n * \n * From the GraphQL specification (https://spec.graphql.org/draft/#sec-Errors):\n> * \"When a GraphQL server encounters an error, it should return a response with a \n> * top-level \"errors\" field containing the error information. The response may still contain\n * a partial result in the \"data\" field if the error occurred after some data was already resolved.\"\n * \n * And specifically about HTTP status codes:\n * \"A server should return a 200 status code when a GraphQL operation successfully executes, including when \n * the operation returns errors. A server should return a 400 status code when a GraphQL operation fails to execute.\"\n */\n private handleGraphQLResponse<T>(\n response: HTTPResponse<GraphQLResponse<T>>\n ): APIResponse<T> {\n return {\n data: response.data.data as T,\n metadata: {\n errors: response.data.errors,\n extensions: response.data.extensions,\n },\n };\n }\n\n /**\n * Executes a GraphQL query\n * @param query The GraphQL query string\n * @param variables Optional variables for the query\n * @returns The query result\n * @throws {HTTPError} For HTTP/network errors only\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<APIResponse<T>> {\n try {\n const headers = await this.getHeaders();\n const response = await this.client.request<GraphQLResponse<T>>({\n method: \"POST\",\n url: this.endpoint,\n data: { query, variables },\n headers,\n });\n\n return this.handleGraphQLResponse(response);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Executes a GraphQL mutation\n * @param mutation The GraphQL mutation string\n * @param variables Optional variables for the mutation\n * @returns The mutation result\n * @throws {HTTPError} For HTTP/network errors only\n */\n async mutate<T>(\n mutation: string,\n variables?: Record<string, unknown>\n ): Promise<APIResponse<T>> {\n try {\n const headers = await this.getHeaders();\n const response = await this.client.request<GraphQLResponse<T>>({\n method: \"POST\",\n url: this.endpoint,\n data: { query: mutation, variables },\n headers,\n });\n\n return this.handleGraphQLResponse(response);\n } catch (error) {\n ErrorHandler.handle(error);\n }\n }\n\n /**\n * Cleanup all HTTP connections and resources\n * Call this when the service is no longer needed\n */\n async destroy(): Promise<void> {\n await this.client.destroy();\n }\n}\n","/**\n * Configuration for OAuth client credentials flow\n */\nexport interface OAuthConfig {\n /** The URL to request the OAuth token from */\n authUrl: string;\n /** The client ID for OAuth authentication */\n clientId: string;\n /** The client secret for OAuth authentication */\n clientSecret: string;\n /** The scope for the OAuth token. Use empty string if no scope is needed. */\n scope: string;\n}\n\n/**\n * Standard OAuth 2.0 token response format as defined in RFC 6749\n */\nexport interface OAuthTokenResponse {\n /** The access token issued by the authorization server */\n access_token: string;\n /** The type of token issued (typically \"Bearer\") */\n token_type: string;\n /** The lifetime in seconds of the access token */\n expires_in: number;\n /** The refresh token, which can be used to obtain new access tokens (optional) */\n refresh_token?: string;\n /** The scope of the access token (optional) */\n scope?: string;\n}\n\n/**\n * A utility class for handling OAuth client credentials flow.\n * This is specifically for the client credentials grant type,\n * which is used for server-to-server authentication.\n */\nexport class OAuthClient {\n constructor(private config: OAuthConfig) {}\n\n /**\n * Requests an OAuth token using the client credentials flow.\n * The request is sent as application/x-www-form-urlencoded.\n * @returns A promise that resolves to the token response containing access_token and expires_in\n * @throws Error if the token request fails\n */\n async getToken(): Promise<OAuthTokenResponse> {\n const formData = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n scope: this.config.scope,\n });\n\n const response = await fetch(this.config.authUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`OAuth token request failed: ${response.statusText}`);\n }\n\n const data = (await response.json()) as OAuthTokenResponse;\n if (data.token_type !== \"Bearer\") {\n throw new Error(`Unexpected token type: ${data.token_type}`);\n }\n\n return data;\n }\n}\n","import Bree, { Job } from \"bree\";\nimport Graceful from \"@ladjs/graceful\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { CoreConfiguration } from \"./configuration-manager\";\nimport logger from \"../reporting-service/logger\";\n\nexport const runDataSyncService = async (connectorPath: string) => {\n const config = CoreConfiguration.inst();\n\n try {\n // Find the SDK's node_modules directory and jobs path using ES module import\n const currentFileUrl = import.meta.url;\n const currentFilePath = fileURLToPath(currentFileUrl);\n\n // Navigate from current file to the SDK root and then to jobs\n // Current: /path/to/sdk/dist/mm-erp-sdk.js.js\n // Target: /path/to/sdk/dist/services/data-sync-service/jobs\n const sdkDistPath = path.dirname(currentFilePath);\n const jobsPath = path.join(\n sdkDistPath,\n \"services\",\n \"data-sync-service\",\n \"jobs\"\n );\n\n const bree = new Bree({\n root: jobsPath,\n logger,\n worker: {\n env: {\n CONNECTOR_PATH: connectorPath,\n // Pass through all required environment variables\n MM_MAPPING_SERVICE_URL: process.env.MM_MAPPING_SERVICE_URL,\n MM_MAPPING_AUTH_SERVICE_URL: process.env.MM_MAPPING_AUTH_SERVICE_URL,\n MM_MAPPING_SERVICE_TOKEN: process.env.MM_MAPPING_SERVICE_TOKEN,\n ERP_SYSTEM: process.env.ERP_SYSTEM,\n LOG_LEVEL: process.env.LOG_LEVEL,\n NODE_ENV: process.env.NODE_ENV,\n RETRY_ATTEMPTS: process.env.RETRY_ATTEMPTS,\n CACHE_TTL: process.env.CACHE_TTL,\n // Pass through all other environment variables that might be needed\n ...process.env,\n },\n },\n jobs: [\n // {\n // name: 'run-migrations', // Running this once on startup will create the tables in the sqlite database\n // },\n {\n name: \"from-erp\",\n timeout: \"10s\",\n interval: config.fromErpInterval,\n },\n {\n name: \"to-erp\",\n //timeout: '3s', // Use timeout during development to see the job in action quickly\n interval: config.toErpInterval,\n },\n {\n name: \"retry-failed-labor-tickets\",\n interval: config.retryLaborTicketsInterval,\n },\n {\n name: \"clean-up-expired-cache\",\n interval: config.cacheExpirationCheckInterval,\n },\n ],\n });\n\n logger.info(\n \"\\n================================INITIATING DATA SYNC CYCLES (Bree)================================\\n\"\n );\n const jobsConfig = bree.config.jobs.map((job: Job) => ({\n name: job.name,\n interval: job.interval,\n timeout: job.timeout,\n }));\n logger.info(\"JOBS CONFIGURATION:\", { jobs: jobsConfig });\n\n const graceful = new Graceful({ brees: [bree] });\n graceful.listen();\n\n (async () => {\n await bree.start();\n })();\n\n bree.on(\"jobStarted\", (job) => {\n console.log(\"Job \" + job.name + \" started\");\n });\n\n bree.on(\"jobCompleted\", (job) => {\n if (job.error) {\n console.error(\"Job \" + job.name + \" failed:\", job.error);\n } else {\n console.log(\"Job \" + job.name + \" completed successfully!\");\n }\n });\n\n bree.on(\"error\", (error) => {\n console.error(\"Bree error:\", error);\n });\n\n // Exit and let the jobs take over\n logger.info(\n \"\\n================================DATA SYNC CYCLES INITIATION COMPLETED================================\\n\"\n );\n } catch (error) {\n logger.error(\"startUp: Error initiating data sync cycles:\", error);\n }\n};\n","import { z } from \"zod\";\nexport const SQLServerConfigSchema = z.object({\n user: z.string().nonempty(\"User is required.\"),\n password: z.string().nonempty(\"Password is required.\"),\n database: z.string().nonempty(\"Database name is required.\"),\n server: z.string().nonempty(\"Server is required.\"),\n port: z.coerce.number().int().positive(\"Port must be a positive integer.\").default(1433),\n connectionTimeout: z.coerce\n .number()\n .int()\n .positive(\"Connection timeout must be a positive integer.\")\n .default(30000),\n requestTimeout: z.coerce\n .number()\n .int()\n .positive(\"Request timeout must be a positive integer.\")\n .default(60000),\n pool: z.object({\n max: z.coerce\n .number()\n .int()\n .positive(\"Max pool size must be a positive integer.\")\n .default(10),\n min: z.coerce\n .number()\n .int()\n .nonnegative(\"Min pool size must be a non-negative integer.\")\n .default(0),\n idleTimeoutMillis: z.coerce\n .number()\n .int()\n .nonnegative(\"Idle timeout must be a non-negative integer.\")\n .default(30000),\n }),\n options: z.object({\n encrypt: z.coerce.boolean().default(false),\n trustServerCertificate: z.coerce.boolean().default(false),\n }),\n});\n","import sql, { ConnectionPool, IRecordSet } from \"mssql\";\nimport { SQLServerConfigSchema } from \"./internal/sql-server-config\";\nimport logger from \"../reporting-service/logger\";\nimport { ERPResponse } from \"../../types/erp-types\";\nimport { SQLServerConfiguration } from \"./configuration\";\n\ntype PagingParams = {\n limit?: number;\n offset?: number;\n};\n\nexport class SqlServerService {\n private connection: ConnectionPool | null = null;\n private config: SQLServerConfiguration;\n\n constructor(config: SQLServerConfiguration) {\n this.config = config;\n }\n\n async dispose() {\n await this.closeConnection();\n }\n\n /**\n * Execute a prepared statement and return the results\n *\n * @param statementToPrepare The SQL query to prepare\n * @param params The parameters to bind to the prepared statement\n * @param paging Optional paging parameters\n * @returns The entities fetched from the database, along with paging information\n */\n public async executePreparedStatement(\n statementToPrepare: string,\n params: Record<string, string>,\n paging?: PagingParams\n ): Promise<ERPResponse | undefined> {\n const connection = await this.openConnection();\n\n const preparedStatement = new sql.PreparedStatement(connection);\n\n // Add all parameters as inputs\n Object.keys(params).forEach((key) => {\n preparedStatement.input(key, sql.VarChar);\n });\n\n // If limit is specified, try SQL paging\n const finalQuery =\n paging?.limit !== undefined\n ? `${statementToPrepare} OFFSET ${paging.offset || 0} ROWS FETCH NEXT ${paging.limit} ROWS ONLY`\n : statementToPrepare;\n\n await preparedStatement.prepare(finalQuery);\n\n let records;\n try {\n records = await preparedStatement.execute(params);\n } catch (error) {\n const errorInfo = error as Error;\n const errorMessage =\n \"Error fetching data from ERP -> \" +\n (errorInfo.cause ? `Cause: ${errorInfo.cause}. ` : \"\") +\n `Name: ${errorInfo.name}. ` +\n `Message: ${errorInfo.message}. ` +\n `Stack: ${errorInfo.stack}`;\n\n throw new Error(errorMessage);\n } finally {\n try {\n await preparedStatement.unprepare();\n } catch (unprepareError) {\n logger.error(\"Error during unprepare:\", unprepareError);\n }\n }\n\n const allRecords = SqlServerService.recordsetToRecords(records?.recordset);\n const rowsFetched = records?.rowsAffected[0] || 0;\n\n // If SQL paging failed or we need to handle offset, apply in-memory paging\n const pagedData =\n paging?.offset !== undefined\n ? allRecords.slice(\n paging.offset,\n (paging.offset || 0) + (paging.limit || allRecords.length)\n )\n : allRecords;\n\n return {\n data: pagedData,\n paging: {\n count: rowsFetched,\n limit: paging?.limit || 0,\n offset: paging?.offset || 0,\n nextPage: (() => {\n const currentPageEnd = (paging?.offset || 0) + (paging?.limit || 0);\n return paging?.limit && currentPageEnd < rowsFetched\n ? String(currentPageEnd)\n : undefined;\n })(),\n previousPage: paging?.offset\n ? String(Math.max(0, (paging.offset || 0) - (paging.limit || 10)))\n : undefined,\n },\n };\n }\n\n /**\n * Opens a connection to SQL Server\n * Caches the connection so that it can be reused.\n * On failure to connect, throws\n */\n async openConnection(): Promise<ConnectionPool> {\n // If we have a connection and it's still connected, reuse it\n if (this.connection?.connected) {\n logger.debug(\"Reusing existing SQL Server connection\");\n return this.connection;\n }\n\n // If we have a connection but it's not connected, just null it out\n if (this.connection) {\n logger.debug(\"Clearing disconnected SQL Server connection\");\n this.connection = null;\n }\n\n try {\n logger.info(\"Opening new SQL Server connection\");\n const sqlConfig = SQLServerConfigSchema.parse({\n user: this.config.username,\n password: this.config.password,\n database: this.config.database,\n server: this.config.host,\n port: parseInt(this.config.port),\n connectionTimeout: parseInt(this.config.connectionTimeout),\n requestTimeout: parseInt(this.config.requestTimeout),\n pool: {\n max: parseInt(this.config.poolMax),\n min: parseInt(this.config.poolMin),\n idleTimeoutMillis: parseInt(this.config.idleTimeoutMillis),\n },\n options: {\n encrypt: this.config.encrypt,\n trustServerCertificate: this.config.trustServer,\n },\n });\n\n this.connection = await sql.connect(sqlConfig);\n return this.connection;\n } catch (error) {\n logger.error(\"SqlServerService>>openConnection>> Connection failed\", {\n error,\n });\n throw new Error(\"SQL Server connection failed\");\n }\n }\n\n /**\n * Transform a IRecordSet from a SQL query into an array of Record<string, string> instances.\n * @param recordset IRecordSet from a SQL query\n * @returns array of Record<string, string> instances\n */\n public static recordsetToRecords(\n recordset?: IRecordSet<Record<string, unknown>>\n ): Record<string, string>[] {\n const data: Record<string, string>[] =\n recordset?.map((row) => {\n const transformedRow: Record<string, string> = {};\n Object.keys(row).forEach((key) => {\n transformedRow[key] = row[key]?.toString() || \"\";\n });\n return transformedRow;\n }) || [];\n\n return data;\n }\n\n private async closeConnection(): Promise<void> {\n if (this.connection?.connected) {\n logger.info(\"Closing SQL Server connection\");\n try {\n await this.connection.close();\n } catch (error) {\n logger.error(\n \"SqlServerService::closeConnection: Error closing connection\",\n {\n error,\n }\n );\n }\n this.connection = null;\n }\n }\n}\n","import sql from \"mssql\";\nimport logger from \"../../reporting-service/logger\";\n\nexport interface SQLTransactionConfig {\n isolationLevel?: sql.IIsolationLevel;\n}\n\nexport interface SQLTransactionOperation<T, R> {\n execute(transaction: sql.Transaction, data: T): Promise<R>;\n}\n\nexport class SQLTransactionManager {\n constructor(private connection: sql.ConnectionPool) {}\n /**\n * Executes a transaction with the given operation and data, manages rollbacks\n * @param operation The SQLTransactionOperation to execute\n * @param data The sql input parameters to pass to the operation\n * @param config The configuration for the transaction\n * @returns The result of the operation; throws exceptions on failures\n */\n async executeTransaction<T, R>(\n operation: SQLTransactionOperation<T, R>,\n data: T,\n config: SQLTransactionConfig = {}\n ): Promise<R | undefined> {\n const transaction = new sql.Transaction(this.connection);\n const isolationLevel =\n config.isolationLevel || sql.ISOLATION_LEVEL.READ_COMMITTED;\n\n try {\n await transaction.begin(isolationLevel);\n const result = await operation.execute(transaction, data);\n await transaction.commit();\n return result;\n } catch (error) {\n logger.error(\"Transaction error:\", error);\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n logger.error(\"Rollback error:\", rollbackError);\n }\n throw error;\n }\n }\n}\n","import sql from \"mssql\";\nimport { SQLInput } from \"../types/sql-input-param\";\nimport { SQLTransactionOperation } from \"./sql-transaction-manager\";\n\n/**\n * Insert a new labor ticket into the database.\n * Create a query named laborTicketsInsert in the sql_toERP folder, add its inputs to the SQLInput array\n * The laborTicketsInsert query is expected to return the NewRowUniqueId of the inserted labor ticket\n *\n * @param transaction The SQL transaction object\n * @param inputs The SQL input parameters\n * @returns The NewRowUniqueId of the inserted labor ticket\n */\nexport class SQLLaborTicketInsertOperation\n implements SQLTransactionOperation<SQLInput[], number>\n{\n constructor(private readonly sqlQuery: string) {}\n\n async execute(\n transaction: sql.Transaction,\n inputs: SQLInput[]\n ): Promise<number> {\n const request = transaction.request();\n inputs.forEach((input) => {\n request.input(input.name, input.type, input.value);\n });\n\n const result = await request.query(this.sqlQuery);\n\n if (!result.recordset[0].NewRowUniqueId) {\n throw new Error(\n \"No LaborTicketId generated by the labor ticket insert query: \" +\n JSON.stringify(request.parameters, null, 2)\n );\n }\n\n return result.recordset[0].NewRowUniqueId;\n }\n}\n\n/**\n * Update an existing labor ticket in the database.\n * Create a query named laborTicketsUpdate in the sql_toERP folder, add its inputs to the SQLInput array\n *\n * @param transaction The SQL transaction object\n * @param inputs The SQL input parameters\n * @returns The number of rows affected\n */\nexport class SQLLaborTicketUpdateOperation\n implements SQLTransactionOperation<SQLInput[], number>\n{\n constructor(private readonly sqlQuery: string) {}\n\n async execute(\n transaction: sql.Transaction,\n inputs: SQLInput[]\n ): Promise<number> {\n const request = transaction.request();\n inputs.forEach((input) => {\n request.input(input.name, input.type, input.value);\n });\n\n const result = await request.query(this.sqlQuery);\n return result.rowsAffected[0];\n }\n}\n","import { SQLTransactionManager } from \"./internal/sql-transaction-manager\";\nimport {\n SQLLaborTicketInsertOperation,\n SQLLaborTicketUpdateOperation,\n} from \"./internal/sql-labor-ticket-operations\";\nimport { MMReceiveLaborTicket } from \"../mm-api-service/types/receive-types\";\nimport { SqlServerService } from \"./sql-server-service\";\nimport logger from \"../reporting-service/logger\";\nimport { SQLInput } from \"./types/sql-input-param\";\n\nexport class SqlServerHelper {\n /**\n * Creates a new labor ticket in the SQL Server database\n * Opens but does not close the connection\n *\n * @param sqlServerService The SQL Server service to use for connections\n * @param laborTicket The labor ticket to create\n * @param sqlInputs The SQL query parameters\n * @param insertQuery The SQL query to execute for insertion\n *\n * @returns The processed labor ticket, with the ERP's laborTicketId set\n * Throws exceptions on failures, including if the query does not return a laborTicketId\n */\n static async createLaborTicket(\n sqlServerService: SqlServerService,\n laborTicket: MMReceiveLaborTicket,\n sqlInputs: SQLInput[],\n insertQuery: string\n ): Promise<MMReceiveLaborTicket> {\n const connection = await sqlServerService.openConnection();\n if (!connection) {\n throw new Error(\n \"Unable to establish database connection to create labor ticket.\"\n );\n }\n\n const transactionManager = new SQLTransactionManager(connection);\n const laborTicketId = await transactionManager.executeTransaction(\n new SQLLaborTicketInsertOperation(insertQuery),\n sqlInputs\n );\n\n if (laborTicketId) {\n laborTicket.laborTicketId = laborTicketId.toString();\n return laborTicket;\n } else {\n throw new Error(\n `The query did not return the labor ticket id for labor ticket ref: ${laborTicket.laborTicketRef}`\n );\n }\n }\n\n /**\n * Updates an existing labor ticket in the SQL Server database\n * Opens but does not close the connection\n * @param sqlServerService The SQL Server service to use for connections\n * @param laborTicket The labor ticket to update\n * @param sqlInputs The SQL query parameters\n * @param updateQuery The SQL query to execute for update\n *\n * @returns The processed labor ticket\n * Throws exceptions on failures\n */\n static async updateLaborTicket(\n sqlServerService: SqlServerService,\n laborTicket: MMReceiveLaborTicket,\n sqlInputs: SQLInput[],\n updateQuery: string\n ): Promise<MMReceiveLaborTicket> {\n const connection = await sqlServerService.openConnection();\n if (!connection) {\n throw new Error(\n \"Unable to establish database connection to update labor ticket.\"\n );\n }\n\n const transactionManager = new SQLTransactionManager(connection);\n await transactionManager.executeTransaction(\n new SQLLaborTicketUpdateOperation(updateQuery),\n sqlInputs\n );\n\n return laborTicket;\n }\n\n /**\n * Logs the SQL input parameters for debugging\n */\n static logQueryInputs(inputs: SQLInput[]): void {\n logger.info(\"SQL Input Variables:\");\n logger.info(\"----------------------------------------\");\n logger.info(\"Variable Name | Value\");\n logger.info(\"----------------------------------------\");\n inputs.forEach((input) => {\n logger.info(`${input.name.padEnd(20)} | ${input.value}`);\n });\n logger.info(\"----------------------------------------\");\n }\n}\n","'use strict';\n\nmodule.exports = exports;\n\nconst url = require('url');\nconst fs = require('fs');\nconst path = require('path');\n\nmodule.exports.detect = function(opts, config) {\n const to = opts.hosted_path;\n const uri = url.parse(to);\n config.prefix = (!uri.pathname || uri.pathname === '/') ? '' : uri.pathname.replace('/', '');\n if (opts.bucket && opts.region) {\n config.bucket = opts.bucket;\n config.region = opts.region;\n config.endpoint = opts.host;\n config.s3ForcePathStyle = opts.s3ForcePathStyle;\n } else {\n const parts = uri.hostname.split('.s3');\n const bucket = parts[0];\n if (!bucket) {\n return;\n }\n if (!config.bucket) {\n config.bucket = bucket;\n }\n if (!config.region) {\n const region = parts[1].slice(1).split('.')[0];\n if (region === 'amazonaws') {\n config.region = 'us-east-1';\n } else {\n config.region = region;\n }\n }\n }\n};\n\nmodule.exports.get_s3 = function(config) {\n\n if (process.env.node_pre_gyp_mock_s3) {\n // here we're mocking. node_pre_gyp_mock_s3 is the scratch directory\n // for the mock code.\n const AWSMock = require('mock-aws-s3');\n const os = require('os');\n\n AWSMock.config.basePath = `${os.tmpdir()}/mock`;\n\n const s3 = AWSMock.S3();\n\n // wrapped callback maker. fs calls return code of ENOENT but AWS.S3 returns\n // NotFound.\n const wcb = (fn) => (err, ...args) => {\n if (err && err.code === 'ENOENT') {\n err.code = 'NotFound';\n }\n return fn(err, ...args);\n };\n\n return {\n listObjects(params, callback) {\n return s3.listObjects(params, wcb(callback));\n },\n headObject(params, callback) {\n return s3.headObject(params, wcb(callback));\n },\n deleteObject(params, callback) {\n return s3.deleteObject(params, wcb(callback));\n },\n putObject(params, callback) {\n return s3.putObject(params, wcb(callback));\n }\n };\n }\n\n // if not mocking then setup real s3.\n const AWS = require('aws-sdk');\n\n AWS.config.update(config);\n const s3 = new AWS.S3();\n\n // need to change if additional options need to be specified.\n return {\n listObjects(params, callback) {\n return s3.listObjects(params, callback);\n },\n headObject(params, callback) {\n return s3.headObject(params, callback);\n },\n deleteObject(params, callback) {\n return s3.deleteObject(params, callback);\n },\n putObject(params, callback) {\n return s3.putObject(params, callback);\n }\n };\n\n\n\n};\n\n//\n// function to get the mocking control function. if not mocking it returns a no-op.\n//\n// if mocking it sets up the mock http interceptors that use the mocked s3 file system\n// to fulfill reponses.\nmodule.exports.get_mockS3Http = function() {\n let mock_s3 = false;\n if (!process.env.node_pre_gyp_mock_s3) {\n return () => mock_s3;\n }\n\n const nock = require('nock');\n // the bucket used for testing, as addressed by https.\n const host = 'https://mapbox-node-pre-gyp-public-testing-bucket.s3.us-east-1.amazonaws.com';\n const mockDir = process.env.node_pre_gyp_mock_s3 + '/mapbox-node-pre-gyp-public-testing-bucket';\n\n // function to setup interceptors. they are \"turned off\" by setting mock_s3 to false.\n const mock_http = () => {\n // eslint-disable-next-line no-unused-vars\n function get(uri, requestBody) {\n const filepath = path.join(mockDir, uri.replace('%2B', '+'));\n\n try {\n fs.accessSync(filepath, fs.constants.R_OK);\n } catch (e) {\n return [404, 'not found\\n'];\n }\n\n // the mock s3 functions just write to disk, so just read from it.\n return [200, fs.createReadStream(filepath)];\n }\n\n // eslint-disable-next-line no-unused-vars\n return nock(host)\n .persist()\n .get(() => mock_s3) // mock any uri for s3 when true\n .reply(get);\n };\n\n // setup interceptors. they check the mock_s3 flag to determine whether to intercept.\n mock_http(nock, host, mockDir);\n // function to turn matching all requests to s3 on/off.\n const mockS3Http = (action) => {\n const previous = mock_s3;\n if (action === 'off') {\n mock_s3 = false;\n } else if (action === 'on') {\n mock_s3 = true;\n } else if (action !== 'get') {\n throw new Error(`illegal action for setMockHttp ${action}`);\n }\n return previous;\n };\n\n // call mockS3Http with the argument\n // - 'on' - turn it on\n // - 'off' - turn it off (used by fetch.test.js so it doesn't interfere with redirects)\n // - 'get' - return true or false for 'on' or 'off'\n return mockS3Http;\n};\n\n\n\n","module.exports = exports = abbrev.abbrev = abbrev\n\nabbrev.monkeyPatch = monkeyPatch\n\nfunction monkeyPatch () {\n Object.defineProperty(Array.prototype, 'abbrev', {\n value: function () { return abbrev(this) },\n enumerable: false, configurable: true, writable: true\n })\n\n Object.defineProperty(Object.prototype, 'abbrev', {\n value: function () { return abbrev(Object.keys(this)) },\n enumerable: false, configurable: true, writable: true\n })\n}\n\nfunction abbrev (list) {\n if (arguments.length !== 1 || !Array.isArray(list)) {\n list = Array.prototype.slice.call(arguments, 0)\n }\n for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {\n args[i] = typeof list[i] === \"string\" ? list[i] : String(list[i])\n }\n\n // sort them lexicographically, so that they're next to their nearest kin\n args = args.sort(lexSort)\n\n // walk through each, seeing how much it has in common with the next and previous\n var abbrevs = {}\n , prev = \"\"\n for (var i = 0, l = args.length ; i < l ; i ++) {\n var current = args[i]\n , next = args[i + 1] || \"\"\n , nextMatches = true\n , prevMatches = true\n if (current === next) continue\n for (var j = 0, cl = current.length ; j < cl ; j ++) {\n var curChar = current.charAt(j)\n nextMatches = nextMatches && curChar === next.charAt(j)\n prevMatches = prevMatches && curChar === prev.charAt(j)\n if (!nextMatches && !prevMatches) {\n j ++\n break\n }\n }\n prev = current\n if (j === cl) {\n abbrevs[current] = current\n continue\n }\n for (var a = current.substr(0, j) ; j <= cl ; j ++) {\n abbrevs[a] = current\n a += current.charAt(j)\n }\n }\n return abbrevs\n}\n\nfunction lexSort (a, b) {\n return a === b ? 0 : a > b ? 1 : -1\n}\n","// info about each config option.\n\nvar debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG\n ? function () { console.error.apply(console, arguments) }\n : function () {}\n\nvar url = require(\"url\")\n , path = require(\"path\")\n , Stream = require(\"stream\").Stream\n , abbrev = require(\"abbrev\")\n , os = require(\"os\")\n\nmodule.exports = exports = nopt\nexports.clean = clean\n\nexports.typeDefs =\n { String : { type: String, validate: validateString }\n , Boolean : { type: Boolean, validate: validateBoolean }\n , url : { type: url, validate: validateUrl }\n , Number : { type: Number, validate: validateNumber }\n , path : { type: path, validate: validatePath }\n , Stream : { type: Stream, validate: validateStream }\n , Date : { type: Date, validate: validateDate }\n }\n\nfunction nopt (types, shorthands, args, slice) {\n args = args || process.argv\n types = types || {}\n shorthands = shorthands || {}\n if (typeof slice !== \"number\") slice = 2\n\n debug(types, shorthands, args, slice)\n\n args = args.slice(slice)\n var data = {}\n , key\n , argv = {\n remain: [],\n cooked: args,\n original: args.slice(0)\n }\n\n parse(args, data, argv.remain, types, shorthands)\n // now data is full\n clean(data, types, exports.typeDefs)\n data.argv = argv\n Object.defineProperty(data.argv, 'toString', { value: function () {\n return this.original.map(JSON.stringify).join(\" \")\n }, enumerable: false })\n return data\n}\n\nfunction clean (data, types, typeDefs) {\n typeDefs = typeDefs || exports.typeDefs\n var remove = {}\n , typeDefault = [false, true, null, String, Array]\n\n Object.keys(data).forEach(function (k) {\n if (k === \"argv\") return\n var val = data[k]\n , isArray = Array.isArray(val)\n , type = types[k]\n if (!isArray) val = [val]\n if (!type) type = typeDefault\n if (type === Array) type = typeDefault.concat(Array)\n if (!Array.isArray(type)) type = [type]\n\n debug(\"val=%j\", val)\n debug(\"types=\", type)\n val = val.map(function (val) {\n // if it's an unknown value, then parse false/true/null/numbers/dates\n if (typeof val === \"string\") {\n debug(\"string %j\", val)\n val = val.trim()\n if ((val === \"null\" && ~type.indexOf(null))\n || (val === \"true\" &&\n (~type.indexOf(true) || ~type.indexOf(Boolean)))\n || (val === \"false\" &&\n (~type.indexOf(false) || ~type.indexOf(Boolean)))) {\n val = JSON.parse(val)\n debug(\"jsonable %j\", val)\n } else if (~type.indexOf(Number) && !isNaN(val)) {\n debug(\"convert to number\", val)\n val = +val\n } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {\n debug(\"convert to date\", val)\n val = new Date(val)\n }\n }\n\n if (!types.hasOwnProperty(k)) {\n return val\n }\n\n // allow `--no-blah` to set 'blah' to null if null is allowed\n if (val === false && ~type.indexOf(null) &&\n !(~type.indexOf(false) || ~type.indexOf(Boolean))) {\n val = null\n }\n\n var d = {}\n d[k] = val\n debug(\"prevalidated val\", d, val, types[k])\n if (!validate(d, k, val, types[k], typeDefs)) {\n if (exports.invalidHandler) {\n exports.invalidHandler(k, val, types[k], data)\n } else if (exports.invalidHandler !== false) {\n debug(\"invalid: \"+k+\"=\"+val, types[k])\n }\n return remove\n }\n debug(\"validated val\", d, val, types[k])\n return d[k]\n }).filter(function (val) { return val !== remove })\n\n // if we allow Array specifically, then an empty array is how we\n // express 'no value here', not null. Allow it.\n if (!val.length && type.indexOf(Array) === -1) {\n debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(Array))\n delete data[k]\n }\n else if (isArray) {\n debug(isArray, data[k], val)\n data[k] = val\n } else data[k] = val[0]\n\n debug(\"k=%s val=%j\", k, val, data[k])\n })\n}\n\nfunction validateString (data, k, val) {\n data[k] = String(val)\n}\n\nfunction validatePath (data, k, val) {\n if (val === true) return false\n if (val === null) return true\n\n val = String(val)\n\n var isWin = process.platform === 'win32'\n , homePattern = isWin ? /^~(\\/|\\\\)/ : /^~\\//\n , home = os.homedir()\n\n if (home && val.match(homePattern)) {\n data[k] = path.resolve(home, val.substr(2))\n } else {\n data[k] = path.resolve(val)\n }\n return true\n}\n\nfunction validateNumber (data, k, val) {\n debug(\"validate Number %j %j %j\", k, val, isNaN(val))\n if (isNaN(val)) return false\n data[k] = +val\n}\n\nfunction validateDate (data, k, val) {\n var s = Date.parse(val)\n debug(\"validate Date %j %j %j\", k, val, s)\n if (isNaN(s)) return false\n data[k] = new Date(val)\n}\n\nfunction validateBoolean (data, k, val) {\n if (val instanceof Boolean) val = val.valueOf()\n else if (typeof val === \"string\") {\n if (!isNaN(val)) val = !!(+val)\n else if (val === \"null\" || val === \"false\") val = false\n else val = true\n } else val = !!val\n data[k] = val\n}\n\nfunction validateUrl (data, k, val) {\n val = url.parse(String(val))\n if (!val.host) return false\n data[k] = val.href\n}\n\nfunction validateStream (data, k, val) {\n if (!(val instanceof Stream)) return false\n data[k] = val\n}\n\nfunction validate (data, k, val, type, typeDefs) {\n // arrays are lists of types.\n if (Array.isArray(type)) {\n for (var i = 0, l = type.length; i < l; i ++) {\n if (type[i] === Array) continue\n if (validate(data, k, val, type[i], typeDefs)) return true\n }\n delete data[k]\n return false\n }\n\n // an array of anything?\n if (type === Array) return true\n\n // NaN is poisonous. Means that something is not allowed.\n if (type !== type) {\n debug(\"Poison NaN\", k, val, type)\n delete data[k]\n return false\n }\n\n // explicit list of values\n if (val === type) {\n debug(\"Explicitly allowed %j\", val)\n // if (isArray) (data[k] = data[k] || []).push(val)\n // else data[k] = val\n data[k] = val\n return true\n }\n\n // now go through the list of typeDefs, validate against each one.\n var ok = false\n , types = Object.keys(typeDefs)\n for (var i = 0, l = types.length; i < l; i ++) {\n debug(\"test type %j %j %j\", k, val, types[i])\n var t = typeDefs[types[i]]\n if (t &&\n ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {\n var d = {}\n ok = false !== t.validate(d, k, val)\n val = d[k]\n if (ok) {\n // if (isArray) (data[k] = data[k] || []).push(val)\n // else data[k] = val\n data[k] = val\n break\n }\n }\n }\n debug(\"OK? %j (%j %j %j)\", ok, k, val, types[i])\n\n if (!ok) delete data[k]\n return ok\n}\n\nfunction parse (args, data, remain, types, shorthands) {\n debug(\"parse\", args, data, remain)\n\n var key = null\n , abbrevs = abbrev(Object.keys(types))\n , shortAbbr = abbrev(Object.keys(shorthands))\n\n for (var i = 0; i < args.length; i ++) {\n var arg = args[i]\n debug(\"arg\", arg)\n\n if (arg.match(/^-{2,}$/)) {\n // done with keys.\n // the rest are args.\n remain.push.apply(remain, args.slice(i + 1))\n args[i] = \"--\"\n break\n }\n var hadEq = false\n if (arg.charAt(0) === \"-\" && arg.length > 1) {\n var at = arg.indexOf('=')\n if (at > -1) {\n hadEq = true\n var v = arg.substr(at + 1)\n arg = arg.substr(0, at)\n args.splice(i, 1, arg, v)\n }\n\n // see if it's a shorthand\n // if so, splice and back up to re-parse it.\n var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)\n debug(\"arg=%j shRes=%j\", arg, shRes)\n if (shRes) {\n debug(arg, shRes)\n args.splice.apply(args, [i, 1].concat(shRes))\n if (arg !== shRes[0]) {\n i --\n continue\n }\n }\n arg = arg.replace(/^-+/, \"\")\n var no = null\n while (arg.toLowerCase().indexOf(\"no-\") === 0) {\n no = !no\n arg = arg.substr(3)\n }\n\n if (abbrevs[arg]) arg = abbrevs[arg]\n\n var argType = types[arg]\n var isTypeArray = Array.isArray(argType)\n if (isTypeArray && argType.length === 1) {\n isTypeArray = false\n argType = argType[0]\n }\n\n var isArray = argType === Array ||\n isTypeArray && argType.indexOf(Array) !== -1\n\n // allow unknown things to be arrays if specified multiple times.\n if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {\n if (!Array.isArray(data[arg]))\n data[arg] = [data[arg]]\n isArray = true\n }\n\n var val\n , la = args[i + 1]\n\n var isBool = typeof no === 'boolean' ||\n argType === Boolean ||\n isTypeArray && argType.indexOf(Boolean) !== -1 ||\n (typeof argType === 'undefined' && !hadEq) ||\n (la === \"false\" &&\n (argType === null ||\n isTypeArray && ~argType.indexOf(null)))\n\n if (isBool) {\n // just set and move along\n val = !no\n // however, also support --bool true or --bool false\n if (la === \"true\" || la === \"false\") {\n val = JSON.parse(la)\n la = null\n if (no) val = !val\n i ++\n }\n\n // also support \"foo\":[Boolean, \"bar\"] and \"--foo bar\"\n if (isTypeArray && la) {\n if (~argType.indexOf(la)) {\n // an explicit type\n val = la\n i ++\n } else if ( la === \"null\" && ~argType.indexOf(null) ) {\n // null allowed\n val = null\n i ++\n } else if ( !la.match(/^-{2,}[^-]/) &&\n !isNaN(la) &&\n ~argType.indexOf(Number) ) {\n // number\n val = +la\n i ++\n } else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) {\n // string\n val = la\n i ++\n }\n }\n\n if (isArray) (data[arg] = data[arg] || []).push(val)\n else data[arg] = val\n\n continue\n }\n\n if (argType === String) {\n if (la === undefined) {\n la = \"\"\n } else if (la.match(/^-{1,2}[^-]+/)) {\n la = \"\"\n i --\n }\n }\n\n if (la && la.match(/^-{2,}$/)) {\n la = undefined\n i --\n }\n\n val = la === undefined ? true : la\n if (isArray) (data[arg] = data[arg] || []).push(val)\n else data[arg] = val\n\n i ++\n continue\n }\n remain.push(arg)\n }\n}\n\nfunction resolveShort (arg, shorthands, shortAbbr, abbrevs) {\n // handle single-char shorthands glommed together, like\n // npm ls -glp, but only if there is one dash, and only if\n // all of the chars are single-char shorthands, and it's\n // not a match to some other abbrev.\n arg = arg.replace(/^-+/, '')\n\n // if it's an exact known option, then don't go any further\n if (abbrevs[arg] === arg)\n return null\n\n // if it's an exact known shortopt, same deal\n if (shorthands[arg]) {\n // make it an array, if it's a list of words\n if (shorthands[arg] && !Array.isArray(shorthands[arg]))\n shorthands[arg] = shorthands[arg].split(/\\s+/)\n\n return shorthands[arg]\n }\n\n // first check to see if this arg is a set of single-char shorthands\n var singles = shorthands.___singles\n if (!singles) {\n singles = Object.keys(shorthands).filter(function (s) {\n return s.length === 1\n }).reduce(function (l,r) {\n l[r] = true\n return l\n }, {})\n shorthands.___singles = singles\n debug('shorthand singles', singles)\n }\n\n var chrs = arg.split(\"\").filter(function (c) {\n return singles[c]\n })\n\n if (chrs.join(\"\") === arg) return chrs.map(function (c) {\n return shorthands[c]\n }).reduce(function (l, r) {\n return l.concat(r)\n }, [])\n\n\n // if it's an arg abbrev, and not a literal shorthand, then prefer the arg\n if (abbrevs[arg] && !shorthands[arg])\n return null\n\n // if it's an abbr for a shorthand, then use that\n if (shortAbbr[arg])\n arg = shortAbbr[arg]\n\n // make it an array, if it's a list of words\n if (shorthands[arg] && !Array.isArray(shorthands[arg]))\n shorthands[arg] = shorthands[arg].split(/\\s+/)\n\n return shorthands[arg]\n}\n","'use strict'\nvar EventEmitter = require('events').EventEmitter\nvar util = require('util')\n\nvar trackerId = 0\nvar TrackerBase = module.exports = function (name) {\n EventEmitter.call(this)\n this.id = ++trackerId\n this.name = name\n}\nutil.inherits(TrackerBase, EventEmitter)\n","'use strict'\nvar util = require('util')\nvar TrackerBase = require('./tracker-base.js')\n\nvar Tracker = module.exports = function (name, todo) {\n TrackerBase.call(this, name)\n this.workDone = 0\n this.workTodo = todo || 0\n}\nutil.inherits(Tracker, TrackerBase)\n\nTracker.prototype.completed = function () {\n return this.workTodo === 0 ? 0 : this.workDone / this.workTodo\n}\n\nTracker.prototype.addWork = function (work) {\n this.workTodo += work\n this.emit('change', this.name, this.completed(), this)\n}\n\nTracker.prototype.completeWork = function (work) {\n this.workDone += work\n if (this.workDone > this.workTodo) {\n this.workDone = this.workTodo\n }\n this.emit('change', this.name, this.completed(), this)\n}\n\nTracker.prototype.finish = function () {\n this.workTodo = this.workDone = 1\n this.emit('change', this.name, 1, this)\n}\n","\n/**\n * Expose `Delegator`.\n */\n\nmodule.exports = Delegator;\n\n/**\n * Initialize a delegator.\n *\n * @param {Object} proto\n * @param {String} target\n * @api public\n */\n\nfunction Delegator(proto, target) {\n if (!(this instanceof Delegator)) return new Delegator(proto, target);\n this.proto = proto;\n this.target = target;\n this.methods = [];\n this.getters = [];\n this.setters = [];\n this.fluents = [];\n}\n\n/**\n * Delegate method `name`.\n *\n * @param {String} name\n * @return {Delegator} self\n * @api public\n */\n\nDelegator.prototype.method = function(name){\n var proto = this.proto;\n var target = this.target;\n this.methods.push(name);\n\n proto[name] = function(){\n return this[target][name].apply(this[target], arguments);\n };\n\n return this;\n};\n\n/**\n * Delegator accessor `name`.\n *\n * @param {String} name\n * @return {Delegator} self\n * @api public\n */\n\nDelegator.prototype.access = function(name){\n return this.getter(name).setter(name);\n};\n\n/**\n * Delegator getter `name`.\n *\n * @param {String} name\n * @return {Delegator} self\n * @api public\n */\n\nDelegator.prototype.getter = function(name){\n var proto = this.proto;\n var target = this.target;\n this.getters.push(name);\n\n proto.__defineGetter__(name, function(){\n return this[target][name];\n });\n\n return this;\n};\n\n/**\n * Delegator setter `name`.\n *\n * @param {String} name\n * @return {Delegator} self\n * @api public\n */\n\nDelegator.prototype.setter = function(name){\n var proto = this.proto;\n var target = this.target;\n this.setters.push(name);\n\n proto.__defineSetter__(name, function(val){\n return this[target][name] = val;\n });\n\n return this;\n};\n\n/**\n * Delegator fluent accessor\n *\n * @param {String} name\n * @return {Delegator} self\n * @api public\n */\n\nDelegator.prototype.fluent = function (name) {\n var proto = this.proto;\n var target = this.target;\n this.fluents.push(name);\n\n proto[name] = function(val){\n if ('undefined' != typeof val) {\n this[target][name] = val;\n return this;\n } else {\n return this[target][name];\n }\n };\n\n return this;\n};\n","'use strict'\nvar util = require('util')\nvar stream = require('readable-stream')\nvar delegate = require('delegates')\nvar Tracker = require('./tracker.js')\n\nvar TrackerStream = module.exports = function (name, size, options) {\n stream.Transform.call(this, options)\n this.tracker = new Tracker(name, size)\n this.name = name\n this.id = this.tracker.id\n this.tracker.on('change', delegateChange(this))\n}\nutil.inherits(TrackerStream, stream.Transform)\n\nfunction delegateChange (trackerStream) {\n return function (name, completion, tracker) {\n trackerStream.emit('change', name, completion, trackerStream)\n }\n}\n\nTrackerStream.prototype._transform = function (data, encoding, cb) {\n this.tracker.completeWork(data.length ? data.length : 1)\n this.push(data)\n cb()\n}\n\nTrackerStream.prototype._flush = function (cb) {\n this.tracker.finish()\n cb()\n}\n\ndelegate(TrackerStream.prototype, 'tracker')\n .method('completed')\n .method('addWork')\n .method('finish')\n","'use strict'\nvar util = require('util')\nvar TrackerBase = require('./tracker-base.js')\nvar Tracker = require('./tracker.js')\nvar TrackerStream = require('./tracker-stream.js')\n\nvar TrackerGroup = module.exports = function (name) {\n TrackerBase.call(this, name)\n this.parentGroup = null\n this.trackers = []\n this.completion = {}\n this.weight = {}\n this.totalWeight = 0\n this.finished = false\n this.bubbleChange = bubbleChange(this)\n}\nutil.inherits(TrackerGroup, TrackerBase)\n\nfunction bubbleChange (trackerGroup) {\n return function (name, completed, tracker) {\n trackerGroup.completion[tracker.id] = completed\n if (trackerGroup.finished) {\n return\n }\n trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup)\n }\n}\n\nTrackerGroup.prototype.nameInTree = function () {\n var names = []\n var from = this\n while (from) {\n names.unshift(from.name)\n from = from.parentGroup\n }\n return names.join('/')\n}\n\nTrackerGroup.prototype.addUnit = function (unit, weight) {\n if (unit.addUnit) {\n var toTest = this\n while (toTest) {\n if (unit === toTest) {\n throw new Error(\n 'Attempted to add tracker group ' +\n unit.name + ' to tree that already includes it ' +\n this.nameInTree(this))\n }\n toTest = toTest.parentGroup\n }\n unit.parentGroup = this\n }\n this.weight[unit.id] = weight || 1\n this.totalWeight += this.weight[unit.id]\n this.trackers.push(unit)\n this.completion[unit.id] = unit.completed()\n unit.on('change', this.bubbleChange)\n if (!this.finished) {\n this.emit('change', unit.name, this.completion[unit.id], unit)\n }\n return unit\n}\n\nTrackerGroup.prototype.completed = function () {\n if (this.trackers.length === 0) {\n return 0\n }\n var valPerWeight = 1 / this.totalWeight\n var completed = 0\n for (var ii = 0; ii < this.trackers.length; ii++) {\n var trackerId = this.trackers[ii].id\n completed +=\n valPerWeight * this.weight[trackerId] * this.completion[trackerId]\n }\n return completed\n}\n\nTrackerGroup.prototype.newGroup = function (name, weight) {\n return this.addUnit(new TrackerGroup(name), weight)\n}\n\nTrackerGroup.prototype.newItem = function (name, todo, weight) {\n return this.addUnit(new Tracker(name, todo), weight)\n}\n\nTrackerGroup.prototype.newStream = function (name, todo, weight) {\n return this.addUnit(new TrackerStream(name, todo), weight)\n}\n\nTrackerGroup.prototype.finish = function () {\n this.finished = true\n if (!this.trackers.length) {\n this.addUnit(new Tracker(), 1, true)\n }\n for (var ii = 0; ii < this.trackers.length; ii++) {\n var tracker = this.trackers[ii]\n tracker.finish()\n tracker.removeListener('change', this.bubbleChange)\n }\n this.emit('change', this.name, 1, this)\n}\n\nvar buffer = ' '\nTrackerGroup.prototype.debug = function (depth) {\n depth = depth || 0\n var indent = depth ? buffer.substr(0, depth) : ''\n var output = indent + (this.name || 'top') + ': ' + this.completed() + '\\n'\n this.trackers.forEach(function (tracker) {\n if (tracker instanceof TrackerGroup) {\n output += tracker.debug(depth + 1)\n } else {\n output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\\n'\n }\n })\n return output\n}\n","'use strict'\nexports.TrackerGroup = require('./tracker-group.js')\nexports.Tracker = require('./tracker.js')\nexports.TrackerStream = require('./tracker-stream.js')\n","'use strict'\n\n// These tables borrowed from `ansi`\n\nvar prefix = '\\x1b['\n\nexports.up = function up (num) {\n return prefix + (num || '') + 'A'\n}\n\nexports.down = function down (num) {\n return prefix + (num || '') + 'B'\n}\n\nexports.forward = function forward (num) {\n return prefix + (num || '') + 'C'\n}\n\nexports.back = function back (num) {\n return prefix + (num || '') + 'D'\n}\n\nexports.nextLine = function nextLine (num) {\n return prefix + (num || '') + 'E'\n}\n\nexports.previousLine = function previousLine (num) {\n return prefix + (num || '') + 'F'\n}\n\nexports.horizontalAbsolute = function horizontalAbsolute (num) {\n if (num == null) throw new Error('horizontalAboslute requires a column to position to')\n return prefix + num + 'G'\n}\n\nexports.eraseData = function eraseData () {\n return prefix + 'J'\n}\n\nexports.eraseLine = function eraseLine () {\n return prefix + 'K'\n}\n\nexports.goto = function (x, y) {\n return prefix + y + ';' + x + 'H'\n}\n\nexports.gotoSOL = function () {\n return '\\r'\n}\n\nexports.beep = function () {\n return '\\x07'\n}\n\nexports.hideCursor = function hideCursor () {\n return prefix + '?25l'\n}\n\nexports.showCursor = function showCursor () {\n return prefix + '?25h'\n}\n\nvar colors = {\n reset: 0,\n// styles\n bold: 1,\n italic: 3,\n underline: 4,\n inverse: 7,\n// resets\n stopBold: 22,\n stopItalic: 23,\n stopUnderline: 24,\n stopInverse: 27,\n// colors\n white: 37,\n black: 30,\n blue: 34,\n cyan: 36,\n green: 32,\n magenta: 35,\n red: 31,\n yellow: 33,\n bgWhite: 47,\n bgBlack: 40,\n bgBlue: 44,\n bgCyan: 46,\n bgGreen: 42,\n bgMagenta: 45,\n bgRed: 41,\n bgYellow: 43,\n\n grey: 90,\n brightBlack: 90,\n brightRed: 91,\n brightGreen: 92,\n brightYellow: 93,\n brightBlue: 94,\n brightMagenta: 95,\n brightCyan: 96,\n brightWhite: 97,\n\n bgGrey: 100,\n bgBrightBlack: 100,\n bgBrightRed: 101,\n bgBrightGreen: 102,\n bgBrightYellow: 103,\n bgBrightBlue: 104,\n bgBrightMagenta: 105,\n bgBrightCyan: 106,\n bgBrightWhite: 107\n}\n\nexports.color = function color (colorWith) {\n if (arguments.length !== 1 || !Array.isArray(colorWith)) {\n colorWith = Array.prototype.slice.call(arguments)\n }\n return prefix + colorWith.map(colorNameToCode).join(';') + 'm'\n}\n\nfunction colorNameToCode (color) {\n if (colors[color] != null) return colors[color]\n throw new Error('Unknown color or style name: ' + color)\n}\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","'use strict'\nvar stringWidth = require('string-width')\n\nexports.center = alignCenter\nexports.left = alignLeft\nexports.right = alignRight\n\n// lodash's way of generating pad characters.\n\nfunction createPadding (width) {\n var result = ''\n var string = ' '\n var n = width\n do {\n if (n % 2) {\n result += string;\n }\n n = Math.floor(n / 2);\n string += string;\n } while (n);\n\n return result;\n}\n\nfunction alignLeft (str, width) {\n var trimmed = str.trimRight()\n if (trimmed.length === 0 && str.length >= width) return str\n var padding = ''\n var strWidth = stringWidth(trimmed)\n\n if (strWidth < width) {\n padding = createPadding(width - strWidth)\n }\n\n return trimmed + padding\n}\n\nfunction alignRight (str, width) {\n var trimmed = str.trimLeft()\n if (trimmed.length === 0 && str.length >= width) return str\n var padding = ''\n var strWidth = stringWidth(trimmed)\n\n if (strWidth < width) {\n padding = createPadding(width - strWidth)\n }\n\n return padding + trimmed\n}\n\nfunction alignCenter (str, width) {\n var trimmed = str.trim()\n if (trimmed.length === 0 && str.length >= width) return str\n var padLeft = ''\n var padRight = ''\n var strWidth = stringWidth(trimmed)\n\n if (strWidth < width) {\n var padLeftBy = parseInt((width - strWidth) / 2, 10) \n padLeft = createPadding(padLeftBy)\n padRight = createPadding(width - (strWidth + padLeftBy))\n }\n\n return padLeft + trimmed + padRight\n}\n","'use strict'\nmodule.exports = validate\n\nfunction isArguments (thingy) {\n return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee')\n}\n\nconst types = {\n '*': {label: 'any', check: () => true},\n A: {label: 'array', check: _ => Array.isArray(_) || isArguments(_)},\n S: {label: 'string', check: _ => typeof _ === 'string'},\n N: {label: 'number', check: _ => typeof _ === 'number'},\n F: {label: 'function', check: _ => typeof _ === 'function'},\n O: {label: 'object', check: _ => typeof _ === 'object' && _ != null && !types.A.check(_) && !types.E.check(_)},\n B: {label: 'boolean', check: _ => typeof _ === 'boolean'},\n E: {label: 'error', check: _ => _ instanceof Error},\n Z: {label: 'null', check: _ => _ == null}\n}\n\nfunction addSchema (schema, arity) {\n const group = arity[schema.length] = arity[schema.length] || []\n if (group.indexOf(schema) === -1) group.push(schema)\n}\n\nfunction validate (rawSchemas, args) {\n if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length)\n if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas')\n if (!args) throw missingRequiredArg(1, 'args')\n if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas)\n if (!types.A.check(args)) throw invalidType(1, ['array'], args)\n const schemas = rawSchemas.split('|')\n const arity = {}\n\n schemas.forEach(schema => {\n for (let ii = 0; ii < schema.length; ++ii) {\n const type = schema[ii]\n if (!types[type]) throw unknownType(ii, type)\n }\n if (/E.*E/.test(schema)) throw moreThanOneError(schema)\n addSchema(schema, arity)\n if (/E/.test(schema)) {\n addSchema(schema.replace(/E.*$/, 'E'), arity)\n addSchema(schema.replace(/E/, 'Z'), arity)\n if (schema.length === 1) addSchema('', arity)\n }\n })\n let matching = arity[args.length]\n if (!matching) {\n throw wrongNumberOfArgs(Object.keys(arity), args.length)\n }\n for (let ii = 0; ii < args.length; ++ii) {\n let newMatching = matching.filter(schema => {\n const type = schema[ii]\n const typeCheck = types[type].check\n return typeCheck(args[ii])\n })\n if (!newMatching.length) {\n const labels = matching.map(_ => types[_[ii]].label).filter(_ => _ != null)\n throw invalidType(ii, labels, args[ii])\n }\n matching = newMatching\n }\n}\n\nfunction missingRequiredArg (num) {\n return newException('EMISSINGARG', 'Missing required argument #' + (num + 1))\n}\n\nfunction unknownType (num, type) {\n return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1))\n}\n\nfunction invalidType (num, expectedTypes, value) {\n let valueType\n Object.keys(types).forEach(typeCode => {\n if (types[typeCode].check(value)) valueType = types[typeCode].label\n })\n return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' +\n englishList(expectedTypes) + ' but got ' + valueType)\n}\n\nfunction englishList (list) {\n return list.join(', ').replace(/, ([^,]+)$/, ' or $1')\n}\n\nfunction wrongNumberOfArgs (expected, got) {\n const english = englishList(expected)\n const args = expected.every(ex => ex.length === 1)\n ? 'argument'\n : 'arguments'\n return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got)\n}\n\nfunction moreThanOneError (schema) {\n return newException('ETOOMANYERRORTYPES',\n 'Only one error type per argument signature is allowed, more than one found in \"' + schema + '\"')\n}\n\nfunction newException (code, msg) {\n const err = new TypeError(msg)\n err.code = code\n /* istanbul ignore else */\n if (Error.captureStackTrace) Error.captureStackTrace(err, validate)\n return err\n}\n","'use strict'\nvar stringWidth = require('string-width')\nvar stripAnsi = require('strip-ansi')\n\nmodule.exports = wideTruncate\n\nfunction wideTruncate (str, target) {\n if (stringWidth(str) === 0) return str\n if (target <= 0) return ''\n if (stringWidth(str) <= target) return str\n\n // We compute the number of bytes of ansi sequences here and add\n // that to our initial truncation to ensure that we don't slice one\n // that we want to keep in half.\n var noAnsi = stripAnsi(str)\n var ansiSize = str.length + noAnsi.length\n var truncated = str.slice(0, target + ansiSize)\n\n // we have to shrink the result to account for our ansi sequence buffer\n // (if an ansi sequence was truncated) and double width characters.\n while (stringWidth(truncated) > target) {\n truncated = truncated.slice(0, -1)\n }\n return truncated\n}\n","'use strict'\nvar util = require('util')\n\nvar User = exports.User = function User (msg) {\n var err = new Error(msg)\n Error.captureStackTrace(err, User)\n err.code = 'EGAUGE'\n return err\n}\n\nexports.MissingTemplateValue = function MissingTemplateValue (item, values) {\n var err = new User(util.format('Missing template value \"%s\"', item.type))\n Error.captureStackTrace(err, MissingTemplateValue)\n err.template = item\n err.values = values\n return err\n}\n\nexports.Internal = function Internal (msg) {\n var err = new Error(msg)\n Error.captureStackTrace(err, Internal)\n err.code = 'EGAUGEINTERNAL'\n return err\n}\n","'use strict'\nvar stringWidth = require('string-width')\n\nmodule.exports = TemplateItem\n\nfunction isPercent (num) {\n if (typeof num !== 'string') return false\n return num.slice(-1) === '%'\n}\n\nfunction percent (num) {\n return Number(num.slice(0, -1)) / 100\n}\n\nfunction TemplateItem (values, outputLength) {\n this.overallOutputLength = outputLength\n this.finished = false\n this.type = null\n this.value = null\n this.length = null\n this.maxLength = null\n this.minLength = null\n this.kerning = null\n this.align = 'left'\n this.padLeft = 0\n this.padRight = 0\n this.index = null\n this.first = null\n this.last = null\n if (typeof values === 'string') {\n this.value = values\n } else {\n for (var prop in values) this[prop] = values[prop]\n }\n // Realize percents\n if (isPercent(this.length)) {\n this.length = Math.round(this.overallOutputLength * percent(this.length))\n }\n if (isPercent(this.minLength)) {\n this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))\n }\n if (isPercent(this.maxLength)) {\n this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))\n }\n return this\n}\n\nTemplateItem.prototype = {}\n\nTemplateItem.prototype.getBaseLength = function () {\n var length = this.length\n if (length == null && typeof this.value === 'string' && this.maxLength == null && this.minLength == null) {\n length = stringWidth(this.value)\n }\n return length\n}\n\nTemplateItem.prototype.getLength = function () {\n var length = this.getBaseLength()\n if (length == null) return null\n return length + this.padLeft + this.padRight\n}\n\nTemplateItem.prototype.getMaxLength = function () {\n if (this.maxLength == null) return null\n return this.maxLength + this.padLeft + this.padRight\n}\n\nTemplateItem.prototype.getMinLength = function () {\n if (this.minLength == null) return null\n return this.minLength + this.padLeft + this.padRight\n}\n","'use strict'\nvar align = require('wide-align')\nvar validate = require('aproba')\nvar wideTruncate = require('./wide-truncate')\nvar error = require('./error')\nvar TemplateItem = require('./template-item')\n\nfunction renderValueWithValues (values) {\n return function (item) {\n return renderValue(item, values)\n }\n}\n\nvar renderTemplate = module.exports = function (width, template, values) {\n var items = prepareItems(width, template, values)\n var rendered = items.map(renderValueWithValues(values)).join('')\n return align.left(wideTruncate(rendered, width), width)\n}\n\nfunction preType (item) {\n var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)\n return 'pre' + cappedTypeName\n}\n\nfunction postType (item) {\n var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)\n return 'post' + cappedTypeName\n}\n\nfunction hasPreOrPost (item, values) {\n if (!item.type) return\n return values[preType(item)] || values[postType(item)]\n}\n\nfunction generatePreAndPost (baseItem, parentValues) {\n var item = Object.assign({}, baseItem)\n var values = Object.create(parentValues)\n var template = []\n var pre = preType(item)\n var post = postType(item)\n if (values[pre]) {\n template.push({value: values[pre]})\n values[pre] = null\n }\n item.minLength = null\n item.length = null\n item.maxLength = null\n template.push(item)\n values[item.type] = values[item.type]\n if (values[post]) {\n template.push({value: values[post]})\n values[post] = null\n }\n return function ($1, $2, length) {\n return renderTemplate(length, template, values)\n }\n}\n\nfunction prepareItems (width, template, values) {\n function cloneAndObjectify (item, index, arr) {\n var cloned = new TemplateItem(item, width)\n var type = cloned.type\n if (cloned.value == null) {\n if (!(type in values)) {\n if (cloned.default == null) {\n throw new error.MissingTemplateValue(cloned, values)\n } else {\n cloned.value = cloned.default\n }\n } else {\n cloned.value = values[type]\n }\n }\n if (cloned.value == null || cloned.value === '') return null\n cloned.index = index\n cloned.first = index === 0\n cloned.last = index === arr.length - 1\n if (hasPreOrPost(cloned, values)) cloned.value = generatePreAndPost(cloned, values)\n return cloned\n }\n\n var output = template.map(cloneAndObjectify).filter(function (item) { return item != null })\n\n var remainingSpace = width\n var variableCount = output.length\n\n function consumeSpace (length) {\n if (length > remainingSpace) length = remainingSpace\n remainingSpace -= length\n }\n\n function finishSizing (item, length) {\n if (item.finished) throw new error.Internal('Tried to finish template item that was already finished')\n if (length === Infinity) throw new error.Internal('Length of template item cannot be infinity')\n if (length != null) item.length = length\n item.minLength = null\n item.maxLength = null\n --variableCount\n item.finished = true\n if (item.length == null) item.length = item.getBaseLength()\n if (item.length == null) throw new error.Internal('Finished template items must have a length')\n consumeSpace(item.getLength())\n }\n\n output.forEach(function (item) {\n if (!item.kerning) return\n var prevPadRight = item.first ? 0 : output[item.index - 1].padRight\n if (!item.first && prevPadRight < item.kerning) item.padLeft = item.kerning - prevPadRight\n if (!item.last) item.padRight = item.kerning\n })\n\n // Finish any that have a fixed (literal or intuited) length\n output.forEach(function (item) {\n if (item.getBaseLength() == null) return\n finishSizing(item)\n })\n\n var resized = 0\n var resizing\n var hunkSize\n do {\n resizing = false\n hunkSize = Math.round(remainingSpace / variableCount)\n output.forEach(function (item) {\n if (item.finished) return\n if (!item.maxLength) return\n if (item.getMaxLength() < hunkSize) {\n finishSizing(item, item.maxLength)\n resizing = true\n }\n })\n } while (resizing && resized++ < output.length)\n if (resizing) throw new error.Internal('Resize loop iterated too many times while determining maxLength')\n\n resized = 0\n do {\n resizing = false\n hunkSize = Math.round(remainingSpace / variableCount)\n output.forEach(function (item) {\n if (item.finished) return\n if (!item.minLength) return\n if (item.getMinLength() >= hunkSize) {\n finishSizing(item, item.minLength)\n resizing = true\n }\n })\n } while (resizing && resized++ < output.length)\n if (resizing) throw new error.Internal('Resize loop iterated too many times while determining minLength')\n\n hunkSize = Math.round(remainingSpace / variableCount)\n output.forEach(function (item) {\n if (item.finished) return\n finishSizing(item, hunkSize)\n })\n\n return output\n}\n\nfunction renderFunction (item, values, length) {\n validate('OON', arguments)\n if (item.type) {\n return item.value(values, values[item.type + 'Theme'] || {}, length)\n } else {\n return item.value(values, {}, length)\n }\n}\n\nfunction renderValue (item, values) {\n var length = item.getBaseLength()\n var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value\n if (value == null || value === '') return ''\n var alignWith = align[item.align] || align.left\n var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''\n var rightPadding = item.padRight ? align.right('', item.padRight) : ''\n var truncated = wideTruncate(String(value), length)\n var aligned = alignWith(truncated, length)\n return leftPadding + aligned + rightPadding\n}\n","'use strict'\nvar consoleControl = require('console-control-strings')\nvar renderTemplate = require('./render-template.js')\nvar validate = require('aproba')\n\nvar Plumbing = module.exports = function (theme, template, width) {\n if (!width) width = 80\n validate('OAN', [theme, template, width])\n this.showing = false\n this.theme = theme\n this.width = width\n this.template = template\n}\nPlumbing.prototype = {}\n\nPlumbing.prototype.setTheme = function (theme) {\n validate('O', [theme])\n this.theme = theme\n}\n\nPlumbing.prototype.setTemplate = function (template) {\n validate('A', [template])\n this.template = template\n}\n\nPlumbing.prototype.setWidth = function (width) {\n validate('N', [width])\n this.width = width\n}\n\nPlumbing.prototype.hide = function () {\n return consoleControl.gotoSOL() + consoleControl.eraseLine()\n}\n\nPlumbing.prototype.hideCursor = consoleControl.hideCursor\n\nPlumbing.prototype.showCursor = consoleControl.showCursor\n\nPlumbing.prototype.show = function (status) {\n var values = Object.create(this.theme)\n for (var key in status) {\n values[key] = status[key]\n }\n\n return renderTemplate(this.width, this.template, values).trim() +\n consoleControl.color('reset') +\n consoleControl.eraseLine() + consoleControl.gotoSOL()\n}\n","\"use strict\"\nvar os = require(\"os\")\n\nvar hasUnicode = module.exports = function () {\n // Recent Win32 platforms (>XP) CAN support unicode in the console but\n // don't have to, and in non-english locales often use traditional local\n // code pages. There's no way, short of windows system calls or execing\n // the chcp command line program to figure this out. As such, we default\n // this to false and encourage your users to override it via config if\n // appropriate.\n if (os.type() == \"Windows_NT\") { return false }\n\n var isUTF8 = /UTF-?8$/i\n var ctype = process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG\n return isUTF8.test(ctype)\n}\n","module.exports = colorSupport({ alwaysReturn: true }, colorSupport)\n\nfunction colorSupport(options, obj) {\n obj = obj || {}\n options = options || {}\n obj.level = 0\n obj.hasBasic = false\n obj.has256 = false\n obj.has16m = false\n if (!options.alwaysReturn) {\n return false\n }\n return obj\n}\n","'use strict'\nvar colorSupport = require('color-support')\n\nmodule.exports = colorSupport().hasBasic\n","// This is not the set of all possible signals.\n//\n// It IS, however, the set of all signals that trigger\n// an exit on either Linux or BSD systems. Linux is a\n// superset of the signal names supported on BSD, and\n// the unknown signals just fail to register, so we can\n// catch that easily enough.\n//\n// Don't bother with SIGKILL. It's uncatchable, which\n// means that we can't fire any callbacks anyway.\n//\n// If a user does happen to register a handler on a non-\n// fatal signal like SIGWINCH or something, and then\n// exit, it'll end up firing `process.emit('exit')`, so\n// the handler will be fired anyway.\n//\n// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised\n// artificially, inherently leave the process in a\n// state from which it is not safe to try and enter JS\n// listeners.\nmodule.exports = [\n 'SIGABRT',\n 'SIGALRM',\n 'SIGHUP',\n 'SIGINT',\n 'SIGTERM'\n]\n\nif (process.platform !== 'win32') {\n module.exports.push(\n 'SIGVTALRM',\n 'SIGXCPU',\n 'SIGXFSZ',\n 'SIGUSR2',\n 'SIGTRAP',\n 'SIGSYS',\n 'SIGQUIT',\n 'SIGIOT'\n // should detect profiler and enable/disable accordingly.\n // see #21\n // 'SIGPROF'\n )\n}\n\nif (process.platform === 'linux') {\n module.exports.push(\n 'SIGIO',\n 'SIGPOLL',\n 'SIGPWR',\n 'SIGSTKFLT',\n 'SIGUNUSED'\n )\n}\n","// Note: since nyc uses this module to output coverage, any lines\n// that are in the direct sync flow of nyc's outputCoverage are\n// ignored, since we can never get coverage for them.\n// grab a reference to node's real process object right away\nvar process = global.process\n\nconst processOk = function (process) {\n return process &&\n typeof process === 'object' &&\n typeof process.removeListener === 'function' &&\n typeof process.emit === 'function' &&\n typeof process.reallyExit === 'function' &&\n typeof process.listeners === 'function' &&\n typeof process.kill === 'function' &&\n typeof process.pid === 'number' &&\n typeof process.on === 'function'\n}\n\n// some kind of non-node environment, just no-op\n/* istanbul ignore if */\nif (!processOk(process)) {\n module.exports = function () {\n return function () {}\n }\n} else {\n var assert = require('assert')\n var signals = require('./signals.js')\n var isWin = /^win/i.test(process.platform)\n\n var EE = require('events')\n /* istanbul ignore if */\n if (typeof EE !== 'function') {\n EE = EE.EventEmitter\n }\n\n var emitter\n if (process.__signal_exit_emitter__) {\n emitter = process.__signal_exit_emitter__\n } else {\n emitter = process.__signal_exit_emitter__ = new EE()\n emitter.count = 0\n emitter.emitted = {}\n }\n\n // Because this emitter is a global, we have to check to see if a\n // previous version of this library failed to enable infinite listeners.\n // I know what you're about to say. But literally everything about\n // signal-exit is a compromise with evil. Get used to it.\n if (!emitter.infinite) {\n emitter.setMaxListeners(Infinity)\n emitter.infinite = true\n }\n\n module.exports = function (cb, opts) {\n /* istanbul ignore if */\n if (!processOk(global.process)) {\n return function () {}\n }\n assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')\n\n if (loaded === false) {\n load()\n }\n\n var ev = 'exit'\n if (opts && opts.alwaysLast) {\n ev = 'afterexit'\n }\n\n var remove = function () {\n emitter.removeListener(ev, cb)\n if (emitter.listeners('exit').length === 0 &&\n emitter.listeners('afterexit').length === 0) {\n unload()\n }\n }\n emitter.on(ev, cb)\n\n return remove\n }\n\n var unload = function unload () {\n if (!loaded || !processOk(global.process)) {\n return\n }\n loaded = false\n\n signals.forEach(function (sig) {\n try {\n process.removeListener(sig, sigListeners[sig])\n } catch (er) {}\n })\n process.emit = originalProcessEmit\n process.reallyExit = originalProcessReallyExit\n emitter.count -= 1\n }\n module.exports.unload = unload\n\n var emit = function emit (event, code, signal) {\n /* istanbul ignore if */\n if (emitter.emitted[event]) {\n return\n }\n emitter.emitted[event] = true\n emitter.emit(event, code, signal)\n }\n\n // { <signal>: <listener fn>, ... }\n var sigListeners = {}\n signals.forEach(function (sig) {\n sigListeners[sig] = function listener () {\n /* istanbul ignore if */\n if (!processOk(global.process)) {\n return\n }\n // If there are no other listeners, an exit is coming!\n // Simplest way: remove us and then re-send the signal.\n // We know that this will kill the process, so we can\n // safely emit now.\n var listeners = process.listeners(sig)\n if (listeners.length === emitter.count) {\n unload()\n emit('exit', null, sig)\n /* istanbul ignore next */\n emit('afterexit', null, sig)\n /* istanbul ignore next */\n if (isWin && sig === 'SIGHUP') {\n // \"SIGHUP\" throws an `ENOSYS` error on Windows,\n // so use a supported signal instead\n sig = 'SIGINT'\n }\n /* istanbul ignore next */\n process.kill(process.pid, sig)\n }\n }\n })\n\n module.exports.signals = function () {\n return signals\n }\n\n var loaded = false\n\n var load = function load () {\n if (loaded || !processOk(global.process)) {\n return\n }\n loaded = true\n\n // This is the number of onSignalExit's that are in play.\n // It's important so that we can count the correct number of\n // listeners on signals, and don't wait for the other one to\n // handle it instead of us.\n emitter.count += 1\n\n signals = signals.filter(function (sig) {\n try {\n process.on(sig, sigListeners[sig])\n return true\n } catch (er) {\n return false\n }\n })\n\n process.emit = processEmit\n process.reallyExit = processReallyExit\n }\n module.exports.load = load\n\n var originalProcessReallyExit = process.reallyExit\n var processReallyExit = function processReallyExit (code) {\n /* istanbul ignore if */\n if (!processOk(global.process)) {\n return\n }\n process.exitCode = code || /* istanbul ignore next */ 0\n emit('exit', process.exitCode, null)\n /* istanbul ignore next */\n emit('afterexit', process.exitCode, null)\n /* istanbul ignore next */\n originalProcessReallyExit.call(process, process.exitCode)\n }\n\n var originalProcessEmit = process.emit\n var processEmit = function processEmit (ev, arg) {\n if (ev === 'exit' && processOk(global.process)) {\n /* istanbul ignore else */\n if (arg !== undefined) {\n process.exitCode = arg\n }\n var ret = originalProcessEmit.apply(this, arguments)\n /* istanbul ignore next */\n emit('exit', process.exitCode, null)\n /* istanbul ignore next */\n emit('afterexit', process.exitCode, null)\n /* istanbul ignore next */\n return ret\n } else {\n return originalProcessEmit.apply(this, arguments)\n }\n }\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","'use strict'\n\nmodule.exports = function spin (spinstr, spun) {\n return spinstr[spun % spinstr.length]\n}\n","'use strict'\nvar validate = require('aproba')\nvar renderTemplate = require('./render-template.js')\nvar wideTruncate = require('./wide-truncate')\nvar stringWidth = require('string-width')\n\nmodule.exports = function (theme, width, completed) {\n validate('ONN', [theme, width, completed])\n if (completed < 0) completed = 0\n if (completed > 1) completed = 1\n if (width <= 0) return ''\n var sofar = Math.round(width * completed)\n var rest = width - sofar\n var template = [\n {type: 'complete', value: repeat(theme.complete, sofar), length: sofar},\n {type: 'remaining', value: repeat(theme.remaining, rest), length: rest}\n ]\n return renderTemplate(width, template, theme)\n}\n\n// lodash's way of repeating\nfunction repeat (string, width) {\n var result = ''\n var n = width\n do {\n if (n % 2) {\n result += string\n }\n n = Math.floor(n / 2)\n /* eslint no-self-assign: 0 */\n string += string\n } while (n && stringWidth(result) < width)\n\n return wideTruncate(result, width)\n}\n","'use strict'\nvar spin = require('./spin.js')\nvar progressBar = require('./progress-bar.js')\n\nmodule.exports = {\n activityIndicator: function (values, theme, width) {\n if (values.spun == null) return\n return spin(theme, values.spun)\n },\n progressbar: function (values, theme, width) {\n if (values.completed == null) return\n return progressBar(theme, width, values.completed)\n }\n}\n","'use strict'\nvar objectAssign = require('object-assign')\n\nmodule.exports = function () {\n return ThemeSetProto.newThemeSet()\n}\n\nvar ThemeSetProto = {}\n\nThemeSetProto.baseTheme = require('./base-theme.js')\n\nThemeSetProto.newTheme = function (parent, theme) {\n if (!theme) {\n theme = parent\n parent = this.baseTheme\n }\n return objectAssign({}, parent, theme)\n}\n\nThemeSetProto.getThemeNames = function () {\n return Object.keys(this.themes)\n}\n\nThemeSetProto.addTheme = function (name, parent, theme) {\n this.themes[name] = this.newTheme(parent, theme)\n}\n\nThemeSetProto.addToAllThemes = function (theme) {\n var themes = this.themes\n Object.keys(themes).forEach(function (name) {\n objectAssign(themes[name], theme)\n })\n objectAssign(this.baseTheme, theme)\n}\n\nThemeSetProto.getTheme = function (name) {\n if (!this.themes[name]) throw this.newMissingThemeError(name)\n return this.themes[name]\n}\n\nThemeSetProto.setDefault = function (opts, name) {\n if (name == null) {\n name = opts\n opts = {}\n }\n var platform = opts.platform == null ? 'fallback' : opts.platform\n var hasUnicode = !!opts.hasUnicode\n var hasColor = !!opts.hasColor\n if (!this.defaults[platform]) this.defaults[platform] = {true: {}, false: {}}\n this.defaults[platform][hasUnicode][hasColor] = name\n}\n\nThemeSetProto.getDefault = function (opts) {\n if (!opts) opts = {}\n var platformName = opts.platform || process.platform\n var platform = this.defaults[platformName] || this.defaults.fallback\n var hasUnicode = !!opts.hasUnicode\n var hasColor = !!opts.hasColor\n if (!platform) throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)\n if (!platform[hasUnicode][hasColor]) {\n if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {\n hasUnicode = false\n } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {\n hasColor = false\n } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {\n hasUnicode = false\n hasColor = false\n } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {\n hasUnicode = false\n } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {\n hasColor = false\n } else if (platform === this.defaults.fallback) {\n throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)\n }\n }\n if (platform[hasUnicode][hasColor]) {\n return this.getTheme(platform[hasUnicode][hasColor])\n } else {\n return this.getDefault(objectAssign({}, opts, {platform: 'fallback'}))\n }\n}\n\nThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {\n var err = new Error('Could not find a gauge theme named \"' + name + '\"')\n Error.captureStackTrace.call(err, newMissingThemeError)\n err.theme = name\n err.code = 'EMISSINGTHEME'\n return err\n}\n\nThemeSetProto.newMissingDefaultThemeError = function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {\n var err = new Error(\n 'Could not find a gauge theme for your platform/unicode/color use combo:\\n' +\n ' platform = ' + platformName + '\\n' +\n ' hasUnicode = ' + hasUnicode + '\\n' +\n ' hasColor = ' + hasColor)\n Error.captureStackTrace.call(err, newMissingDefaultThemeError)\n err.platform = platformName\n err.hasUnicode = hasUnicode\n err.hasColor = hasColor\n err.code = 'EMISSINGTHEME'\n return err\n}\n\nThemeSetProto.newThemeSet = function () {\n var themeset = function (opts) {\n return themeset.getDefault(opts)\n }\n return objectAssign(themeset, ThemeSetProto, {\n themes: objectAssign({}, this.themes),\n baseTheme: objectAssign({}, this.baseTheme),\n defaults: JSON.parse(JSON.stringify(this.defaults || {}))\n })\n}\n","'use strict'\nvar color = require('console-control-strings').color\nvar ThemeSet = require('./theme-set.js')\n\nvar themes = module.exports = new ThemeSet()\n\nthemes.addTheme('ASCII', {\n preProgressbar: '[',\n postProgressbar: ']',\n progressbarTheme: {\n complete: '#',\n remaining: '.'\n },\n activityIndicatorTheme: '-\\\\|/',\n preSubsection: '>'\n})\n\nthemes.addTheme('colorASCII', themes.getTheme('ASCII'), {\n progressbarTheme: {\n preComplete: color('bgBrightWhite', 'brightWhite'),\n complete: '#',\n postComplete: color('reset'),\n preRemaining: color('bgBrightBlack', 'brightBlack'),\n remaining: '.',\n postRemaining: color('reset')\n }\n})\n\nthemes.addTheme('brailleSpinner', {\n preProgressbar: '⸨',\n postProgressbar: '⸩',\n progressbarTheme: {\n complete: '#',\n remaining: '⠂'\n },\n activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',\n preSubsection: '>'\n})\n\nthemes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {\n progressbarTheme: {\n preComplete: color('bgBrightWhite', 'brightWhite'),\n complete: '#',\n postComplete: color('reset'),\n preRemaining: color('bgBrightBlack', 'brightBlack'),\n remaining: '⠂',\n postRemaining: color('reset')\n }\n})\n\nthemes.setDefault({}, 'ASCII')\nthemes.setDefault({hasColor: true}, 'colorASCII')\nthemes.setDefault({platform: 'darwin', hasUnicode: true}, 'brailleSpinner')\nthemes.setDefault({platform: 'darwin', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')\nthemes.setDefault({platform: 'linux', hasUnicode: true}, 'brailleSpinner')\nthemes.setDefault({platform: 'linux', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')\n","'use strict'\n// this exists so we can replace it during testing\nmodule.exports = setInterval\n","'use strict'\n// this exists so we can replace it during testing\nmodule.exports = process\n","'use strict'\nvar process = require('./process')\ntry {\n module.exports = setImmediate\n} catch (ex) {\n module.exports = process.nextTick\n}\n","'use strict'\nvar Plumbing = require('./plumbing.js')\nvar hasUnicode = require('has-unicode')\nvar hasColor = require('./has-color.js')\nvar onExit = require('signal-exit')\nvar defaultThemes = require('./themes')\nvar setInterval = require('./set-interval.js')\nvar process = require('./process.js')\nvar setImmediate = require('./set-immediate')\n\nmodule.exports = Gauge\n\nfunction callWith (obj, method) {\n return function () {\n return method.call(obj)\n }\n}\n\nfunction Gauge (arg1, arg2) {\n var options, writeTo\n if (arg1 && arg1.write) {\n writeTo = arg1\n options = arg2 || {}\n } else if (arg2 && arg2.write) {\n writeTo = arg2\n options = arg1 || {}\n } else {\n writeTo = process.stderr\n options = arg1 || arg2 || {}\n }\n\n this._status = {\n spun: 0,\n section: '',\n subsection: ''\n }\n this._paused = false // are we paused for back pressure?\n this._disabled = true // are all progress bar updates disabled?\n this._showing = false // do we WANT the progress bar on screen\n this._onScreen = false // IS the progress bar on screen\n this._needsRedraw = false // should we print something at next tick?\n this._hideCursor = options.hideCursor == null ? true : options.hideCursor\n this._fixedFramerate = options.fixedFramerate == null\n ? !(/^v0\\.8\\./.test(process.version))\n : options.fixedFramerate\n this._lastUpdateAt = null\n this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval\n\n this._themes = options.themes || defaultThemes\n this._theme = options.theme\n var theme = this._computeTheme(options.theme)\n var template = options.template || [\n {type: 'progressbar', length: 20},\n {type: 'activityIndicator', kerning: 1, length: 1},\n {type: 'section', kerning: 1, default: ''},\n {type: 'subsection', kerning: 1, default: ''}\n ]\n this.setWriteTo(writeTo, options.tty)\n var PlumbingClass = options.Plumbing || Plumbing\n this._gauge = new PlumbingClass(theme, template, this.getWidth())\n\n this._$$doRedraw = callWith(this, this._doRedraw)\n this._$$handleSizeChange = callWith(this, this._handleSizeChange)\n\n this._cleanupOnExit = options.cleanupOnExit == null || options.cleanupOnExit\n this._removeOnExit = null\n\n if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {\n this.enable()\n } else {\n this.disable()\n }\n}\nGauge.prototype = {}\n\nGauge.prototype.isEnabled = function () {\n return !this._disabled\n}\n\nGauge.prototype.setTemplate = function (template) {\n this._gauge.setTemplate(template)\n if (this._showing) this._requestRedraw()\n}\n\nGauge.prototype._computeTheme = function (theme) {\n if (!theme) theme = {}\n if (typeof theme === 'string') {\n theme = this._themes.getTheme(theme)\n } else if (theme && (Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null)) {\n var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode\n var useColor = theme.hasColor == null ? hasColor : theme.hasColor\n theme = this._themes.getDefault({hasUnicode: useUnicode, hasColor: useColor, platform: theme.platform})\n }\n return theme\n}\n\nGauge.prototype.setThemeset = function (themes) {\n this._themes = themes\n this.setTheme(this._theme)\n}\n\nGauge.prototype.setTheme = function (theme) {\n this._gauge.setTheme(this._computeTheme(theme))\n if (this._showing) this._requestRedraw()\n this._theme = theme\n}\n\nGauge.prototype._requestRedraw = function () {\n this._needsRedraw = true\n if (!this._fixedFramerate) this._doRedraw()\n}\n\nGauge.prototype.getWidth = function () {\n return ((this._tty && this._tty.columns) || 80) - 1\n}\n\nGauge.prototype.setWriteTo = function (writeTo, tty) {\n var enabled = !this._disabled\n if (enabled) this.disable()\n this._writeTo = writeTo\n this._tty = tty ||\n (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||\n (writeTo.isTTY && writeTo) ||\n this._tty\n if (this._gauge) this._gauge.setWidth(this.getWidth())\n if (enabled) this.enable()\n}\n\nGauge.prototype.enable = function () {\n if (!this._disabled) return\n this._disabled = false\n if (this._tty) this._enableEvents()\n if (this._showing) this.show()\n}\n\nGauge.prototype.disable = function () {\n if (this._disabled) return\n if (this._showing) {\n this._lastUpdateAt = null\n this._showing = false\n this._doRedraw()\n this._showing = true\n }\n this._disabled = true\n if (this._tty) this._disableEvents()\n}\n\nGauge.prototype._enableEvents = function () {\n if (this._cleanupOnExit) {\n this._removeOnExit = onExit(callWith(this, this.disable))\n }\n this._tty.on('resize', this._$$handleSizeChange)\n if (this._fixedFramerate) {\n this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)\n if (this.redrawTracker.unref) this.redrawTracker.unref()\n }\n}\n\nGauge.prototype._disableEvents = function () {\n this._tty.removeListener('resize', this._$$handleSizeChange)\n if (this._fixedFramerate) clearInterval(this.redrawTracker)\n if (this._removeOnExit) this._removeOnExit()\n}\n\nGauge.prototype.hide = function (cb) {\n if (this._disabled) return cb && process.nextTick(cb)\n if (!this._showing) return cb && process.nextTick(cb)\n this._showing = false\n this._doRedraw()\n cb && setImmediate(cb)\n}\n\nGauge.prototype.show = function (section, completed) {\n this._showing = true\n if (typeof section === 'string') {\n this._status.section = section\n } else if (typeof section === 'object') {\n var sectionKeys = Object.keys(section)\n for (var ii = 0; ii < sectionKeys.length; ++ii) {\n var key = sectionKeys[ii]\n this._status[key] = section[key]\n }\n }\n if (completed != null) this._status.completed = completed\n if (this._disabled) return\n this._requestRedraw()\n}\n\nGauge.prototype.pulse = function (subsection) {\n this._status.subsection = subsection || ''\n this._status.spun++\n if (this._disabled) return\n if (!this._showing) return\n this._requestRedraw()\n}\n\nGauge.prototype._handleSizeChange = function () {\n this._gauge.setWidth(this._tty.columns - 1)\n this._requestRedraw()\n}\n\nGauge.prototype._doRedraw = function () {\n if (this._disabled || this._paused) return\n if (!this._fixedFramerate) {\n var now = Date.now()\n if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) return\n this._lastUpdateAt = now\n }\n if (!this._showing && this._onScreen) {\n this._onScreen = false\n var result = this._gauge.hide()\n if (this._hideCursor) {\n result += this._gauge.showCursor()\n }\n return this._writeTo.write(result)\n }\n if (!this._showing && !this._onScreen) return\n if (this._showing && !this._onScreen) {\n this._onScreen = true\n this._needsRedraw = true\n if (this._hideCursor) {\n this._writeTo.write(this._gauge.hideCursor())\n }\n }\n if (!this._needsRedraw) return\n if (!this._writeTo.write(this._gauge.show(this._status))) {\n this._paused = true\n this._writeTo.on('drain', callWith(this, function () {\n this._paused = false\n this._doRedraw()\n }))\n }\n}\n","module.exports = function (blocking) {\n [process.stdout, process.stderr].forEach(function (stream) {\n if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {\n stream._handle.setBlocking(blocking)\n }\n })\n}\n","'use strict'\nvar Progress = require('are-we-there-yet')\nvar Gauge = require('gauge')\nvar EE = require('events').EventEmitter\nvar log = exports = module.exports = new EE()\nvar util = require('util')\n\nvar setBlocking = require('set-blocking')\nvar consoleControl = require('console-control-strings')\n\nsetBlocking(true)\nvar stream = process.stderr\nObject.defineProperty(log, 'stream', {\n set: function (newStream) {\n stream = newStream\n if (this.gauge) {\n this.gauge.setWriteTo(stream, stream)\n }\n },\n get: function () {\n return stream\n },\n})\n\n// by default, decide based on tty-ness.\nvar colorEnabled\nlog.useColor = function () {\n return colorEnabled != null ? colorEnabled : stream.isTTY\n}\n\nlog.enableColor = function () {\n colorEnabled = true\n this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})\n}\nlog.disableColor = function () {\n colorEnabled = false\n this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})\n}\n\n// default level\nlog.level = 'info'\n\nlog.gauge = new Gauge(stream, {\n enabled: false, // no progress bars unless asked\n theme: {hasColor: log.useColor()},\n template: [\n {type: 'progressbar', length: 20},\n {type: 'activityIndicator', kerning: 1, length: 1},\n {type: 'section', default: ''},\n ':',\n {type: 'logline', kerning: 1, default: ''},\n ],\n})\n\nlog.tracker = new Progress.TrackerGroup()\n\n// we track this separately as we may need to temporarily disable the\n// display of the status bar for our own loggy purposes.\nlog.progressEnabled = log.gauge.isEnabled()\n\nvar unicodeEnabled\n\nlog.enableUnicode = function () {\n unicodeEnabled = true\n this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})\n}\n\nlog.disableUnicode = function () {\n unicodeEnabled = false\n this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})\n}\n\nlog.setGaugeThemeset = function (themes) {\n this.gauge.setThemeset(themes)\n}\n\nlog.setGaugeTemplate = function (template) {\n this.gauge.setTemplate(template)\n}\n\nlog.enableProgress = function () {\n if (this.progressEnabled) {\n return\n }\n\n this.progressEnabled = true\n this.tracker.on('change', this.showProgress)\n if (this._paused) {\n return\n }\n\n this.gauge.enable()\n}\n\nlog.disableProgress = function () {\n if (!this.progressEnabled) {\n return\n }\n this.progressEnabled = false\n this.tracker.removeListener('change', this.showProgress)\n this.gauge.disable()\n}\n\nvar trackerConstructors = ['newGroup', 'newItem', 'newStream']\n\nvar mixinLog = function (tracker) {\n // mixin the public methods from log into the tracker\n // (except: conflicts and one's we handle specially)\n Object.keys(log).forEach(function (P) {\n if (P[0] === '_') {\n return\n }\n\n if (trackerConstructors.filter(function (C) {\n return C === P\n }).length) {\n return\n }\n\n if (tracker[P]) {\n return\n }\n\n if (typeof log[P] !== 'function') {\n return\n }\n\n var func = log[P]\n tracker[P] = function () {\n return func.apply(log, arguments)\n }\n })\n // if the new tracker is a group, make sure any subtrackers get\n // mixed in too\n if (tracker instanceof Progress.TrackerGroup) {\n trackerConstructors.forEach(function (C) {\n var func = tracker[C]\n tracker[C] = function () {\n return mixinLog(func.apply(tracker, arguments))\n }\n })\n }\n return tracker\n}\n\n// Add tracker constructors to the top level log object\ntrackerConstructors.forEach(function (C) {\n log[C] = function () {\n return mixinLog(this.tracker[C].apply(this.tracker, arguments))\n }\n})\n\nlog.clearProgress = function (cb) {\n if (!this.progressEnabled) {\n return cb && process.nextTick(cb)\n }\n\n this.gauge.hide(cb)\n}\n\nlog.showProgress = function (name, completed) {\n if (!this.progressEnabled) {\n return\n }\n\n var values = {}\n if (name) {\n values.section = name\n }\n\n var last = log.record[log.record.length - 1]\n if (last) {\n values.subsection = last.prefix\n var disp = log.disp[last.level] || last.level\n var logline = this._format(disp, log.style[last.level])\n if (last.prefix) {\n logline += ' ' + this._format(last.prefix, this.prefixStyle)\n }\n\n logline += ' ' + last.message.split(/\\r?\\n/)[0]\n values.logline = logline\n }\n values.completed = completed || this.tracker.completed()\n this.gauge.show(values)\n}.bind(log) // bind for use in tracker's on-change listener\n\n// temporarily stop emitting, but don't drop\nlog.pause = function () {\n this._paused = true\n if (this.progressEnabled) {\n this.gauge.disable()\n }\n}\n\nlog.resume = function () {\n if (!this._paused) {\n return\n }\n\n this._paused = false\n\n var b = this._buffer\n this._buffer = []\n b.forEach(function (m) {\n this.emitLog(m)\n }, this)\n if (this.progressEnabled) {\n this.gauge.enable()\n }\n}\n\nlog._buffer = []\n\nvar id = 0\nlog.record = []\nlog.maxRecordSize = 10000\nlog.log = function (lvl, prefix, message) {\n var l = this.levels[lvl]\n if (l === undefined) {\n return this.emit('error', new Error(util.format(\n 'Undefined log level: %j', lvl)))\n }\n\n var a = new Array(arguments.length - 2)\n var stack = null\n for (var i = 2; i < arguments.length; i++) {\n var arg = a[i - 2] = arguments[i]\n\n // resolve stack traces to a plain string.\n if (typeof arg === 'object' && arg instanceof Error && arg.stack) {\n Object.defineProperty(arg, 'stack', {\n value: stack = arg.stack + '',\n enumerable: true,\n writable: true,\n })\n }\n }\n if (stack) {\n a.unshift(stack + '\\n')\n }\n message = util.format.apply(util, a)\n\n var m = {\n id: id++,\n level: lvl,\n prefix: String(prefix || ''),\n message: message,\n messageRaw: a,\n }\n\n this.emit('log', m)\n this.emit('log.' + lvl, m)\n if (m.prefix) {\n this.emit(m.prefix, m)\n }\n\n this.record.push(m)\n var mrs = this.maxRecordSize\n var n = this.record.length - mrs\n if (n > mrs / 10) {\n var newSize = Math.floor(mrs * 0.9)\n this.record = this.record.slice(-1 * newSize)\n }\n\n this.emitLog(m)\n}.bind(log)\n\nlog.emitLog = function (m) {\n if (this._paused) {\n this._buffer.push(m)\n return\n }\n if (this.progressEnabled) {\n this.gauge.pulse(m.prefix)\n }\n\n var l = this.levels[m.level]\n if (l === undefined) {\n return\n }\n\n if (l < this.levels[this.level]) {\n return\n }\n\n if (l > 0 && !isFinite(l)) {\n return\n }\n\n // If 'disp' is null or undefined, use the lvl as a default\n // Allows: '', 0 as valid disp\n var disp = log.disp[m.level] != null ? log.disp[m.level] : m.level\n this.clearProgress()\n m.message.split(/\\r?\\n/).forEach(function (line) {\n if (this.heading) {\n this.write(this.heading, this.headingStyle)\n this.write(' ')\n }\n this.write(disp, log.style[m.level])\n var p = m.prefix || ''\n if (p) {\n this.write(' ')\n }\n\n this.write(p, this.prefixStyle)\n this.write(' ' + line + '\\n')\n }, this)\n this.showProgress()\n}\n\nlog._format = function (msg, style) {\n if (!stream) {\n return\n }\n\n var output = ''\n if (this.useColor()) {\n style = style || {}\n var settings = []\n if (style.fg) {\n settings.push(style.fg)\n }\n\n if (style.bg) {\n settings.push('bg' + style.bg[0].toUpperCase() + style.bg.slice(1))\n }\n\n if (style.bold) {\n settings.push('bold')\n }\n\n if (style.underline) {\n settings.push('underline')\n }\n\n if (style.inverse) {\n settings.push('inverse')\n }\n\n if (settings.length) {\n output += consoleControl.color(settings)\n }\n\n if (style.beep) {\n output += consoleControl.beep()\n }\n }\n output += msg\n if (this.useColor()) {\n output += consoleControl.color('reset')\n }\n\n return output\n}\n\nlog.write = function (msg, style) {\n if (!stream) {\n return\n }\n\n stream.write(this._format(msg, style))\n}\n\nlog.addLevel = function (lvl, n, style, disp) {\n // If 'disp' is null or undefined, use the lvl as a default\n if (disp == null) {\n disp = lvl\n }\n\n this.levels[lvl] = n\n this.style[lvl] = style\n if (!this[lvl]) {\n this[lvl] = function () {\n var a = new Array(arguments.length + 1)\n a[0] = lvl\n for (var i = 0; i < arguments.length; i++) {\n a[i + 1] = arguments[i]\n }\n\n return this.log.apply(this, a)\n }.bind(this)\n }\n this.disp[lvl] = disp\n}\n\nlog.prefixStyle = { fg: 'magenta' }\nlog.headingStyle = { fg: 'white', bg: 'black' }\n\nlog.style = {}\nlog.levels = {}\nlog.disp = {}\nlog.addLevel('silly', -Infinity, { inverse: true }, 'sill')\nlog.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb')\nlog.addLevel('info', 2000, { fg: 'green' })\nlog.addLevel('timing', 2500, { fg: 'green', bg: 'black' })\nlog.addLevel('http', 3000, { fg: 'green', bg: 'black' })\nlog.addLevel('notice', 3500, { fg: 'blue', bg: 'black' })\nlog.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')\nlog.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')\nlog.addLevel('silent', Infinity)\n\n// allow 'error' prefix\nlog.on('error', function () {})\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar pathModule = require('path');\nvar isWindows = process.platform === 'win32';\nvar fs = require('fs');\n\n// JavaScript implementation of realpath, ported from node pre-v6\n\nvar DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);\n\nfunction rethrow() {\n // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and\n // is fairly slow to generate.\n var callback;\n if (DEBUG) {\n var backtrace = new Error;\n callback = debugCallback;\n } else\n callback = missingCallback;\n\n return callback;\n\n function debugCallback(err) {\n if (err) {\n backtrace.message = err.message;\n err = backtrace;\n missingCallback(err);\n }\n }\n\n function missingCallback(err) {\n if (err) {\n if (process.throwDeprecation)\n throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs\n else if (!process.noDeprecation) {\n var msg = 'fs: missing callback ' + (err.stack || err.message);\n if (process.traceDeprecation)\n console.trace(msg);\n else\n console.error(msg);\n }\n }\n }\n}\n\nfunction maybeCallback(cb) {\n return typeof cb === 'function' ? cb : rethrow();\n}\n\nvar normalize = pathModule.normalize;\n\n// Regexp that finds the next partion of a (partial) path\n// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']\nif (isWindows) {\n var nextPartRe = /(.*?)(?:[\\/\\\\]+|$)/g;\n} else {\n var nextPartRe = /(.*?)(?:[\\/]+|$)/g;\n}\n\n// Regex to find the device root, including trailing slash. E.g. 'c:\\\\'.\nif (isWindows) {\n var splitRootRe = /^(?:[a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/][^\\\\\\/]+)?[\\\\\\/]*/;\n} else {\n var splitRootRe = /^[\\/]*/;\n}\n\nexports.realpathSync = function realpathSync(p, cache) {\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return cache[p];\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstatSync(base);\n knownHard[base] = true;\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n // NB: p.length changes.\n while (pos < p.length) {\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n continue;\n }\n\n var resolvedLink;\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // some known symbolic link. no need to stat again.\n resolvedLink = cache[base];\n } else {\n var stat = fs.lstatSync(base);\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n continue;\n }\n\n // read the link if it wasn't read before\n // dev/ino always return 0 on windows, so skip the check.\n var linkTarget = null;\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n linkTarget = seenLinks[id];\n }\n }\n if (linkTarget === null) {\n fs.statSync(base);\n linkTarget = fs.readlinkSync(base);\n }\n resolvedLink = pathModule.resolve(previous, linkTarget);\n // track this, if given a cache.\n if (cache) cache[base] = resolvedLink;\n if (!isWindows) seenLinks[id] = linkTarget;\n }\n\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n\n if (cache) cache[original] = p;\n\n return p;\n};\n\n\nexports.realpath = function realpath(p, cache, cb) {\n if (typeof cb !== 'function') {\n cb = maybeCallback(cache);\n cache = null;\n }\n\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return process.nextTick(cb.bind(null, null, cache[p]));\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstat(base, function(err) {\n if (err) return cb(err);\n knownHard[base] = true;\n LOOP();\n });\n } else {\n process.nextTick(LOOP);\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n function LOOP() {\n // stop if scanned past end of path\n if (pos >= p.length) {\n if (cache) cache[original] = p;\n return cb(null, p);\n }\n\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n return process.nextTick(LOOP);\n }\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // known symbolic link. no need to stat again.\n return gotResolvedLink(cache[base]);\n }\n\n return fs.lstat(base, gotStat);\n }\n\n function gotStat(err, stat) {\n if (err) return cb(err);\n\n // if not a symlink, skip to the next path part\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n return process.nextTick(LOOP);\n }\n\n // stat & read the link if not read before\n // call gotTarget as soon as the link target is known\n // dev/ino always return 0 on windows, so skip the check.\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n return gotTarget(null, seenLinks[id], base);\n }\n }\n fs.stat(base, function(err) {\n if (err) return cb(err);\n\n fs.readlink(base, function(err, target) {\n if (!isWindows) seenLinks[id] = target;\n gotTarget(err, target);\n });\n });\n }\n\n function gotTarget(err, target, base) {\n if (err) return cb(err);\n\n var resolvedLink = pathModule.resolve(previous, target);\n if (cache) cache[base] = resolvedLink;\n gotResolvedLink(resolvedLink);\n }\n\n function gotResolvedLink(resolvedLink) {\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n};\n","module.exports = realpath\nrealpath.realpath = realpath\nrealpath.sync = realpathSync\nrealpath.realpathSync = realpathSync\nrealpath.monkeypatch = monkeypatch\nrealpath.unmonkeypatch = unmonkeypatch\n\nvar fs = require('fs')\nvar origRealpath = fs.realpath\nvar origRealpathSync = fs.realpathSync\n\nvar version = process.version\nvar ok = /^v[0-5]\\./.test(version)\nvar old = require('./old.js')\n\nfunction newError (er) {\n return er && er.syscall === 'realpath' && (\n er.code === 'ELOOP' ||\n er.code === 'ENOMEM' ||\n er.code === 'ENAMETOOLONG'\n )\n}\n\nfunction realpath (p, cache, cb) {\n if (ok) {\n return origRealpath(p, cache, cb)\n }\n\n if (typeof cache === 'function') {\n cb = cache\n cache = null\n }\n origRealpath(p, cache, function (er, result) {\n if (newError(er)) {\n old.realpath(p, cache, cb)\n } else {\n cb(er, result)\n }\n })\n}\n\nfunction realpathSync (p, cache) {\n if (ok) {\n return origRealpathSync(p, cache)\n }\n\n try {\n return origRealpathSync(p, cache)\n } catch (er) {\n if (newError(er)) {\n return old.realpathSync(p, cache)\n } else {\n throw er\n }\n }\n}\n\nfunction monkeypatch () {\n fs.realpath = realpath\n fs.realpathSync = realpathSync\n}\n\nfunction unmonkeypatch () {\n fs.realpath = origRealpath\n fs.realpathSync = origRealpathSync\n}\n","module.exports = function (xs, fn) {\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n var x = fn(xs[i], i);\n if (isArray(x)) res.push.apply(res, x);\n else res.push(x);\n }\n return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n","'use strict';\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n if(a===b) {\n return [ai, bi];\n }\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n","var concatMap = require('concat-map');\nvar balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n return e;\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m || /\\$$/.test(m.pre)) return [str];\n\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = concatMap(n, function(el) { return expand(el, false) });\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n\n return expansions;\n}\n\n","module.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = (function () { try { return require('path') } catch (e) {}}()) || {\n sep: '/'\n}\nminimatch.sep = path.sep\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = require('brace-expansion')\n\nvar plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n return s.split('').reduce(function (set, c) {\n set[c] = true\n return set\n }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n options = options || {}\n return function (p, i, list) {\n return minimatch(p, pattern, options)\n }\n}\n\nfunction ext (a, b) {\n b = b || {}\n var t = {}\n Object.keys(a).forEach(function (k) {\n t[k] = a[k]\n })\n Object.keys(b).forEach(function (k) {\n t[k] = b[k]\n })\n return t\n}\n\nminimatch.defaults = function (def) {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n var orig = minimatch\n\n var m = function minimatch (p, pattern, options) {\n return orig(p, pattern, ext(def, options))\n }\n\n m.Minimatch = function Minimatch (pattern, options) {\n return new orig.Minimatch(pattern, ext(def, options))\n }\n m.Minimatch.defaults = function defaults (options) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n\n m.filter = function filter (pattern, options) {\n return orig.filter(pattern, ext(def, options))\n }\n\n m.defaults = function defaults (options) {\n return orig.defaults(ext(def, options))\n }\n\n m.makeRe = function makeRe (pattern, options) {\n return orig.makeRe(pattern, ext(def, options))\n }\n\n m.braceExpand = function braceExpand (pattern, options) {\n return orig.braceExpand(pattern, ext(def, options))\n }\n\n m.match = function (list, pattern, options) {\n return orig.match(list, pattern, ext(def, options))\n }\n\n return m\n}\n\nMinimatch.defaults = function (def) {\n return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n if (!(this instanceof Minimatch)) {\n return new Minimatch(pattern, options)\n }\n\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n pattern = pattern.trim()\n\n // windows support: need to use /, not \\\n if (!options.allowWindowsEscape && path.sep !== '/') {\n pattern = pattern.split(path.sep).join('/')\n }\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n\n // make the set of regexps etc.\n this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n var pattern = this.pattern\n var options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n var set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(function (s) {\n return s.split(slashSplit)\n })\n\n this.debug(this.pattern, set)\n\n // glob --> regexps\n set = set.map(function (s, si, set) {\n return s.map(this.parse, this)\n }, this)\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(function (s) {\n return s.indexOf(false) === -1\n })\n\n this.debug(this.pattern, set)\n\n this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n var pattern = this.pattern\n var negate = false\n var options = this.options\n var negateOffset = 0\n\n if (options.nonegate) return\n\n for (var i = 0, l = pattern.length\n ; i < l && pattern.charAt(i) === '!'\n ; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.substr(negateOffset)\n this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n if (!options) {\n if (this instanceof Minimatch) {\n options = this.options\n } else {\n options = {}\n }\n }\n\n pattern = typeof pattern === 'undefined'\n ? this.pattern : pattern\n\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\nvar MAX_PATTERN_LENGTH = 1024 * 64\nvar assertValidPattern = function (pattern) {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n assertValidPattern(pattern)\n\n var options = this.options\n\n // shortcuts\n if (pattern === '**') {\n if (!options.noglobstar)\n return GLOBSTAR\n else\n pattern = '*'\n }\n if (pattern === '') return ''\n\n var re = ''\n var hasMagic = !!options.nocase\n var escaping = false\n // ? => one single character\n var patternListStack = []\n var negativeLists = []\n var stateChar\n var inClass = false\n var reClassStart = -1\n var classStart = -1\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set.\n var patternStart = pattern.charAt(0) === '.' ? '' // anything\n // not (start or / followed by . or .. followed by / or end)\n : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n : '(?!\\\\.)'\n var self = this\n\n function clearStateChar () {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n self.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (var i = 0, len = pattern.length, c\n ; (i < len) && (c = pattern.charAt(i))\n ; i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping && reSpecials[c]) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n switch (c) {\n /* istanbul ignore next */\n case '/': {\n // completely not allowed, even escaped.\n // Should already be path-split by now.\n return false\n }\n\n case '\\\\':\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n self.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(':\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n patternListStack.push({\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close\n })\n // negation is (?:(?!js)[^/]*)\n re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n\n case ')':\n if (inClass || !patternListStack.length) {\n re += '\\\\)'\n continue\n }\n\n clearStateChar()\n hasMagic = true\n var pl = patternListStack.pop()\n // negation is (?:(?!js)[^/]*)\n // The others are (?:<pattern>)<type>\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(pl)\n }\n pl.reEnd = re.length\n continue\n\n case '|':\n if (inClass || !patternListStack.length || escaping) {\n re += '\\\\|'\n escaping = false\n continue\n }\n\n clearStateChar()\n re += '|'\n continue\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n // handle the case where we left a class open.\n // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n var cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + cs + ']')\n } catch (er) {\n // not a valid class!\n var sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n hasMagic = hasMagic || sp[1]\n inClass = false\n continue\n }\n\n // finish up the class.\n hasMagic = true\n inClass = false\n re += c\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (escaping) {\n // no need\n escaping = false\n } else if (reSpecials[c]\n && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.substr(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n var tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n var t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n var addPatternStart = false\n switch (re.charAt(0)) {\n case '[': case '.': case '(': addPatternStart = true\n }\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (var n = negativeLists.length - 1; n > -1; n--) {\n var nl = negativeLists[n]\n\n var nlBefore = re.slice(0, nl.reStart)\n var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n var nlAfter = re.slice(nl.reEnd)\n\n nlLast += nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n var openParensBefore = nlBefore.split('(').length - 1\n var cleanAfter = nlAfter\n for (i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n var dollar = ''\n if (nlAfter === '' && isSub !== SUBPARSE) {\n dollar = '$'\n }\n var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n re = newRe\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n var flags = options.nocase ? 'i' : ''\n try {\n var regExp = new RegExp('^' + re + '$', flags)\n } catch (er) /* istanbul ignore next - should be impossible */ {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n\n regExp._glob = pattern\n regExp._src = re\n\n return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n var set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n var options = this.options\n\n var twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n var flags = options.nocase ? 'i' : ''\n\n var re = set.map(function (pattern) {\n return pattern.map(function (p) {\n return (p === GLOBSTAR) ? twoStar\n : (typeof p === 'string') ? regExpEscape(p)\n : p._src\n }).join('\\\\\\/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) /* istanbul ignore next - should be impossible */ {\n this.regexp = false\n }\n return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n options = options || {}\n var mm = new Minimatch(pattern, options)\n list = list.filter(function (f) {\n return mm.match(f)\n })\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\nMinimatch.prototype.match = function match (f, partial) {\n if (typeof partial === 'undefined') partial = this.partial\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n var options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n var set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n var filename\n var i\n for (i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (i = 0; i < set.length; i++) {\n var pattern = set[i]\n var file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n var hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* istanbul ignore if */\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n /* istanbul ignore if */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else /* istanbul ignore else */ if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return (fi === fl - 1) && (file[fi] === '')\n }\n\n // should be unreachable.\n /* istanbul ignore next */\n throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n","'use strict';\n\nfunction posix(path) {\n\treturn path.charAt(0) === '/';\n}\n\nfunction win32(path) {\n\t// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56\n\tvar splitDeviceRe = /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\tvar result = splitDeviceRe.exec(path);\n\tvar device = result[1] || '';\n\tvar isUnc = Boolean(device && device.charAt(1) !== ':');\n\n\t// UNC paths are always absolute\n\treturn Boolean(result[2] || isUnc);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n","exports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar fs = require(\"fs\")\nvar path = require(\"path\")\nvar minimatch = require(\"minimatch\")\nvar isAbsolute = require(\"path-is-absolute\")\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasort (a, b) {\n return a.localeCompare(b, 'en')\n}\n\nfunction setupIgnores (self, options) {\n self.ignore = options.ignore || []\n\n if (!Array.isArray(self.ignore))\n self.ignore = [self.ignore]\n\n if (self.ignore.length) {\n self.ignore = self.ignore.map(ignoreMap)\n }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n var gmatcher = null\n if (pattern.slice(-3) === '/**') {\n var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n gmatcher = new Minimatch(gpattern, { dot: true })\n }\n\n return {\n matcher: new Minimatch(pattern, { dot: true }),\n gmatcher: gmatcher\n }\n}\n\nfunction setopts (self, pattern, options) {\n if (!options)\n options = {}\n\n // base-matching: just use globstar for that.\n if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n if (options.noglobstar) {\n throw new Error(\"base matching requires globstar\")\n }\n pattern = \"**/\" + pattern\n }\n\n self.silent = !!options.silent\n self.pattern = pattern\n self.strict = options.strict !== false\n self.realpath = !!options.realpath\n self.realpathCache = options.realpathCache || Object.create(null)\n self.follow = !!options.follow\n self.dot = !!options.dot\n self.mark = !!options.mark\n self.nodir = !!options.nodir\n if (self.nodir)\n self.mark = true\n self.sync = !!options.sync\n self.nounique = !!options.nounique\n self.nonull = !!options.nonull\n self.nosort = !!options.nosort\n self.nocase = !!options.nocase\n self.stat = !!options.stat\n self.noprocess = !!options.noprocess\n self.absolute = !!options.absolute\n self.fs = options.fs || fs\n\n self.maxLength = options.maxLength || Infinity\n self.cache = options.cache || Object.create(null)\n self.statCache = options.statCache || Object.create(null)\n self.symlinks = options.symlinks || Object.create(null)\n\n setupIgnores(self, options)\n\n self.changedCwd = false\n var cwd = process.cwd()\n if (!ownProp(options, \"cwd\"))\n self.cwd = cwd\n else {\n self.cwd = path.resolve(options.cwd)\n self.changedCwd = self.cwd !== cwd\n }\n\n self.root = options.root || path.resolve(self.cwd, \"/\")\n self.root = path.resolve(self.root)\n if (process.platform === \"win32\")\n self.root = self.root.replace(/\\\\/g, \"/\")\n\n // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n if (process.platform === \"win32\")\n self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n self.nomount = !!options.nomount\n\n // disable comments and negation in Minimatch.\n // Note that they are not supported in Glob itself anyway.\n options.nonegate = true\n options.nocomment = true\n // always treat \\ in patterns as escapes, not path separators\n options.allowWindowsEscape = false\n\n self.minimatch = new Minimatch(pattern, options)\n self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n var nou = self.nounique\n var all = nou ? [] : Object.create(null)\n\n for (var i = 0, l = self.matches.length; i < l; i ++) {\n var matches = self.matches[i]\n if (!matches || Object.keys(matches).length === 0) {\n if (self.nonull) {\n // do like the shell, and spit out the literal glob\n var literal = self.minimatch.globSet[i]\n if (nou)\n all.push(literal)\n else\n all[literal] = true\n }\n } else {\n // had matches\n var m = Object.keys(matches)\n if (nou)\n all.push.apply(all, m)\n else\n m.forEach(function (m) {\n all[m] = true\n })\n }\n }\n\n if (!nou)\n all = Object.keys(all)\n\n if (!self.nosort)\n all = all.sort(alphasort)\n\n // at *some* point we statted all of these\n if (self.mark) {\n for (var i = 0; i < all.length; i++) {\n all[i] = self._mark(all[i])\n }\n if (self.nodir) {\n all = all.filter(function (e) {\n var notDir = !(/\\/$/.test(e))\n var c = self.cache[e] || self.cache[makeAbs(self, e)]\n if (notDir && c)\n notDir = c !== 'DIR' && !Array.isArray(c)\n return notDir\n })\n }\n }\n\n if (self.ignore.length)\n all = all.filter(function(m) {\n return !isIgnored(self, m)\n })\n\n self.found = all\n}\n\nfunction mark (self, p) {\n var abs = makeAbs(self, p)\n var c = self.cache[abs]\n var m = p\n if (c) {\n var isDir = c === 'DIR' || Array.isArray(c)\n var slash = p.slice(-1) === '/'\n\n if (isDir && !slash)\n m += '/'\n else if (!isDir && slash)\n m = m.slice(0, -1)\n\n if (m !== p) {\n var mabs = makeAbs(self, m)\n self.statCache[mabs] = self.statCache[abs]\n self.cache[mabs] = self.cache[abs]\n }\n }\n\n return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n var abs = f\n if (f.charAt(0) === '/') {\n abs = path.join(self.root, f)\n } else if (isAbsolute(f) || f === '') {\n abs = f\n } else if (self.changedCwd) {\n abs = path.resolve(self.cwd, f)\n } else {\n abs = path.resolve(f)\n }\n\n if (process.platform === 'win32')\n abs = abs.replace(/\\\\/g, '/')\n\n return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n\nfunction childrenIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n","module.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar Glob = require('./glob.js').Glob\nvar util = require('util')\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n if (!pattern)\n throw new Error('must provide pattern')\n\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n if (!(this instanceof GlobSync))\n return new GlobSync(pattern, options)\n\n setopts(this, pattern, options)\n\n if (this.noprocess)\n return this\n\n var n = this.minimatch.set.length\n this.matches = new Array(n)\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false)\n }\n this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n assert.ok(this instanceof GlobSync)\n if (this.realpath) {\n var self = this\n this.matches.forEach(function (matchset, index) {\n var set = self.matches[index] = Object.create(null)\n for (var p in matchset) {\n try {\n p = self._makeAbs(p)\n var real = rp.realpathSync(p, self.realpathCache)\n set[real] = true\n } catch (er) {\n if (er.syscall === 'stat')\n set[self._makeAbs(p)] = true\n else\n throw er\n }\n }\n })\n }\n common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n assert.ok(this instanceof GlobSync)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // See if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip processing\n if (childrenIgnored(this, read))\n return\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n var entries = this._readdir(abs, inGlobStar)\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix.slice(-1) !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix)\n newPattern = [prefix, e]\n else\n newPattern = [e]\n this._process(newPattern.concat(remain), index, inGlobStar)\n }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n if (isIgnored(this, e))\n return\n\n var abs = this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute) {\n e = abs\n }\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n if (this.stat)\n this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false)\n\n var entries\n var lstat\n var stat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er.code === 'ENOENT') {\n // lstat failed, doesn't exist\n return null\n }\n }\n\n var isSym = lstat && lstat.isSymbolicLink()\n this.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory())\n this.cache[abs] = 'FILE'\n else\n entries = this._readdir(abs, false)\n\n return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n var entries\n\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return null\n\n if (Array.isArray(c))\n return c\n }\n\n try {\n return this._readdirEntries(abs, this.fs.readdirSync(abs))\n } catch (er) {\n this._readdirError(abs, er)\n return null\n }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n\n // mark and cache dir-ness\n return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n throw error\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict)\n throw er\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n var entries = this._readdir(abs, inGlobStar)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false)\n\n var len = entries.length\n var isSym = this.symlinks[abs]\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true)\n }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var exists = this._stat(prefix)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return false\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return c\n\n if (needDir && c === 'FILE')\n return false\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (!stat) {\n var lstat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return false\n }\n }\n\n if (lstat && lstat.isSymbolicLink()) {\n try {\n stat = this.fs.statSync(abs)\n } catch (er) {\n stat = lstat\n }\n } else {\n stat = lstat\n }\n }\n\n this.statCache[abs] = stat\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return false\n\n return c\n}\n\nGlobSync.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n","// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n","var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n","var wrappy = require('wrappy')\nvar reqs = Object.create(null)\nvar once = require('once')\n\nmodule.exports = wrappy(inflight)\n\nfunction inflight (key, cb) {\n if (reqs[key]) {\n reqs[key].push(cb)\n return null\n } else {\n reqs[key] = [cb]\n return makeres(key)\n }\n}\n\nfunction makeres (key) {\n return once(function RES () {\n var cbs = reqs[key]\n var len = cbs.length\n var args = slice(arguments)\n\n // XXX It's somewhat ambiguous whether a new callback added in this\n // pass should be queued for later execution if something in the\n // list of callbacks throws, or if it should just be discarded.\n // However, it's such an edge case that it hardly matters, and either\n // choice is likely as surprising as the other.\n // As it happens, we do go ahead and schedule it for later execution.\n try {\n for (var i = 0; i < len; i++) {\n cbs[i].apply(null, args)\n }\n } finally {\n if (cbs.length > len) {\n // added more in the interim.\n // de-zalgo, just in case, but don't call again.\n cbs.splice(0, len)\n process.nextTick(function () {\n RES.apply(null, args)\n })\n } else {\n delete reqs[key]\n }\n }\n })\n}\n\nfunction slice (args) {\n var length = args.length\n var array = []\n\n for (var i = 0; i < length; i++) array[i] = args[i]\n return array\n}\n","// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together. This is PREFIX.\n// If there is no more remaining, then stat(PREFIX) and\n// add to matches if it succeeds. END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n// set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n// If fail, END\n//\n// with ENTRIES\n// If pattern[n] is GLOBSTAR\n// // handle the case where the globstar match is empty\n// // by pruning it out, and testing the resulting pattern\n// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n// // handle other cases.\n// for ENTRY in ENTRIES (not dotfiles)\n// // attach globstar + tail onto the entry\n// // Mark that this entry is a globstar match\n// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n// else // not globstar\n// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n// Test ENTRY against pattern[n]\n// If fails, continue\n// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n// Cache all stats and readdirs results to minimize syscall. Since all\n// we ever care about is existence and directory-ness, we can just keep\n// `true` for files, and [children,...] for directories, or `false` for\n// things that don't exist.\n\nmodule.exports = glob\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar inherits = require('inherits')\nvar EE = require('events').EventEmitter\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar globSync = require('./sync.js')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = require('inflight')\nvar util = require('util')\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = require('once')\n\nfunction glob (pattern, options, cb) {\n if (typeof options === 'function') cb = options, options = {}\n if (!options) options = {}\n\n if (options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return globSync(pattern, options)\n }\n\n return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n if (add === null || typeof add !== 'object') {\n return origin\n }\n\n var keys = Object.keys(add)\n var i = keys.length\n while (i--) {\n origin[keys[i]] = add[keys[i]]\n }\n return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n var options = extend({}, options_)\n options.noprocess = true\n\n var g = new Glob(pattern, options)\n var set = g.minimatch.set\n\n if (!pattern)\n return false\n\n if (set.length > 1)\n return true\n\n for (var j = 0; j < set[0].length; j++) {\n if (typeof set[0][j] !== 'string')\n return true\n }\n\n return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n\n if (options && options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return new GlobSync(pattern, options)\n }\n\n if (!(this instanceof Glob))\n return new Glob(pattern, options, cb)\n\n setopts(this, pattern, options)\n this._didRealPath = false\n\n // process each pattern in the minimatch set\n var n = this.minimatch.set.length\n\n // The matches are stored as {<filename>: true,...} so that\n // duplicates are automagically pruned.\n // Later, we do an Object.keys() on these.\n // Keep them as a list so we can fill in when nonull is set.\n this.matches = new Array(n)\n\n if (typeof cb === 'function') {\n cb = once(cb)\n this.on('error', cb)\n this.on('end', function (matches) {\n cb(null, matches)\n })\n }\n\n var self = this\n this._processing = 0\n\n this._emitQueue = []\n this._processQueue = []\n this.paused = false\n\n if (this.noprocess)\n return this\n\n if (n === 0)\n return done()\n\n var sync = true\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false, done)\n }\n sync = false\n\n function done () {\n --self._processing\n if (self._processing <= 0) {\n if (sync) {\n process.nextTick(function () {\n self._finish()\n })\n } else {\n self._finish()\n }\n }\n }\n}\n\nGlob.prototype._finish = function () {\n assert(this instanceof Glob)\n if (this.aborted)\n return\n\n if (this.realpath && !this._didRealpath)\n return this._realpath()\n\n common.finish(this)\n this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n if (this._didRealpath)\n return\n\n this._didRealpath = true\n\n var n = this.matches.length\n if (n === 0)\n return this._finish()\n\n var self = this\n for (var i = 0; i < this.matches.length; i++)\n this._realpathSet(i, next)\n\n function next () {\n if (--n === 0)\n self._finish()\n }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n var matchset = this.matches[index]\n if (!matchset)\n return cb()\n\n var found = Object.keys(matchset)\n var self = this\n var n = found.length\n\n if (n === 0)\n return cb()\n\n var set = this.matches[index] = Object.create(null)\n found.forEach(function (p, i) {\n // If there's a problem with the stat, then it means that\n // one or more of the links in the realpath couldn't be\n // resolved. just return the abs value in that case.\n p = self._makeAbs(p)\n rp.realpath(p, self.realpathCache, function (er, real) {\n if (!er)\n set[real] = true\n else if (er.syscall === 'stat')\n set[p] = true\n else\n self.emit('error', er) // srsly wtf right here\n\n if (--n === 0) {\n self.matches[index] = set\n cb()\n }\n })\n })\n}\n\nGlob.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n this.aborted = true\n this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n if (!this.paused) {\n this.paused = true\n this.emit('pause')\n }\n}\n\nGlob.prototype.resume = function () {\n if (this.paused) {\n this.emit('resume')\n this.paused = false\n if (this._emitQueue.length) {\n var eq = this._emitQueue.slice(0)\n this._emitQueue.length = 0\n for (var i = 0; i < eq.length; i ++) {\n var e = eq[i]\n this._emitMatch(e[0], e[1])\n }\n }\n if (this._processQueue.length) {\n var pq = this._processQueue.slice(0)\n this._processQueue.length = 0\n for (var i = 0; i < pq.length; i ++) {\n var p = pq[i]\n this._processing--\n this._process(p[0], p[1], p[2], p[3])\n }\n }\n }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n assert(this instanceof Glob)\n assert(typeof cb === 'function')\n\n if (this.aborted)\n return\n\n this._processing++\n if (this.paused) {\n this._processQueue.push([pattern, index, inGlobStar, cb])\n return\n }\n\n //console.error('PROCESS %d', this._processing, pattern)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // see if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index, cb)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip _processing\n if (childrenIgnored(this, read))\n return cb()\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return cb()\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return cb()\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return cb()\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n this._process([e].concat(remain), index, inGlobStar, cb)\n }\n cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n if (this.aborted)\n return\n\n if (isIgnored(this, e))\n return\n\n if (this.paused) {\n this._emitQueue.push([index, e])\n return\n }\n\n var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute)\n e = abs\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n var st = this.statCache[abs]\n if (st)\n this.emit('stat', e, st)\n\n this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n if (this.aborted)\n return\n\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false, cb)\n\n var lstatkey = 'lstat\\0' + abs\n var self = this\n var lstatcb = inflight(lstatkey, lstatcb_)\n\n if (lstatcb)\n self.fs.lstat(abs, lstatcb)\n\n function lstatcb_ (er, lstat) {\n if (er && er.code === 'ENOENT')\n return cb()\n\n var isSym = lstat && lstat.isSymbolicLink()\n self.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory()) {\n self.cache[abs] = 'FILE'\n cb()\n } else\n self._readdir(abs, false, cb)\n }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n if (this.aborted)\n return\n\n cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n if (!cb)\n return\n\n //console.error('RD %j %j', +inGlobStar, abs)\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs, cb)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return cb()\n\n if (Array.isArray(c))\n return cb(null, c)\n }\n\n var self = this\n self.fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n return function (er, entries) {\n if (er)\n self._readdirError(abs, er, cb)\n else\n self._readdirEntries(abs, entries, cb)\n }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n if (this.aborted)\n return\n\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n if (this.aborted)\n return\n\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n this.emit('error', error)\n this.abort()\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict) {\n this.emit('error', er)\n // If the error is handled, then we abort\n // if not, we threw out of here\n this.abort()\n }\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n\n return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n //console.error('pgs2', prefix, remain[0], entries)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return cb()\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false, cb)\n\n var isSym = this.symlinks[abs]\n var len = entries.length\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return cb()\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true, cb)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true, cb)\n }\n\n cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var self = this\n this._stat(prefix, function (er, exists) {\n self._processSimple2(prefix, index, er, exists, cb)\n })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n //console.error('ps2', prefix, exists)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return cb()\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return cb()\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return cb(null, c)\n\n if (needDir && c === 'FILE')\n return cb()\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (stat !== undefined) {\n if (stat === false)\n return cb(null, stat)\n else {\n var type = stat.isDirectory() ? 'DIR' : 'FILE'\n if (needDir && type === 'FILE')\n return cb()\n else\n return cb(null, type, stat)\n }\n }\n\n var self = this\n var statcb = inflight('stat\\0' + abs, lstatcb_)\n if (statcb)\n self.fs.lstat(abs, statcb)\n\n function lstatcb_ (er, lstat) {\n if (lstat && lstat.isSymbolicLink()) {\n // If it's a symlink, then treat it as the target, unless\n // the target does not exist, then treat it as a file.\n return self.fs.stat(abs, function (er, stat) {\n if (er)\n self._stat2(f, abs, null, lstat, cb)\n else\n self._stat2(f, abs, er, stat, cb)\n })\n } else {\n self._stat2(f, abs, er, lstat, cb)\n }\n }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return cb()\n }\n\n var needDir = f.slice(-1) === '/'\n this.statCache[abs] = stat\n\n if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n return cb(null, false, stat)\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return cb()\n\n return cb(null, c, stat)\n}\n","const assert = require(\"assert\")\nconst path = require(\"path\")\nconst fs = require(\"fs\")\nlet glob = undefined\ntry {\n glob = require(\"glob\")\n} catch (_err) {\n // treat glob as optional.\n}\n\nconst defaultGlobOpts = {\n nosort: true,\n silent: true\n}\n\n// for EMFILE handling\nlet timeout = 0\n\nconst isWindows = (process.platform === \"win32\")\n\nconst defaults = options => {\n const methods = [\n 'unlink',\n 'chmod',\n 'stat',\n 'lstat',\n 'rmdir',\n 'readdir'\n ]\n methods.forEach(m => {\n options[m] = options[m] || fs[m]\n m = m + 'Sync'\n options[m] = options[m] || fs[m]\n })\n\n options.maxBusyTries = options.maxBusyTries || 3\n options.emfileWait = options.emfileWait || 1000\n if (options.glob === false) {\n options.disableGlob = true\n }\n if (options.disableGlob !== true && glob === undefined) {\n throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')\n }\n options.disableGlob = options.disableGlob || false\n options.glob = options.glob || defaultGlobOpts\n}\n\nconst rimraf = (p, options, cb) => {\n if (typeof options === 'function') {\n cb = options\n options = {}\n }\n\n assert(p, 'rimraf: missing path')\n assert.equal(typeof p, 'string', 'rimraf: path should be a string')\n assert.equal(typeof cb, 'function', 'rimraf: callback function required')\n assert(options, 'rimraf: invalid options argument provided')\n assert.equal(typeof options, 'object', 'rimraf: options should be object')\n\n defaults(options)\n\n let busyTries = 0\n let errState = null\n let n = 0\n\n const next = (er) => {\n errState = errState || er\n if (--n === 0)\n cb(errState)\n }\n\n const afterGlob = (er, results) => {\n if (er)\n return cb(er)\n\n n = results.length\n if (n === 0)\n return cb()\n\n results.forEach(p => {\n const CB = (er) => {\n if (er) {\n if ((er.code === \"EBUSY\" || er.code === \"ENOTEMPTY\" || er.code === \"EPERM\") &&\n busyTries < options.maxBusyTries) {\n busyTries ++\n // try again, with the same exact callback as this one.\n return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)\n }\n\n // this one won't happen if graceful-fs is used.\n if (er.code === \"EMFILE\" && timeout < options.emfileWait) {\n return setTimeout(() => rimraf_(p, options, CB), timeout ++)\n }\n\n // already gone\n if (er.code === \"ENOENT\") er = null\n }\n\n timeout = 0\n next(er)\n }\n rimraf_(p, options, CB)\n })\n }\n\n if (options.disableGlob || !glob.hasMagic(p))\n return afterGlob(null, [p])\n\n options.lstat(p, (er, stat) => {\n if (!er)\n return afterGlob(null, [p])\n\n glob(p, options.glob, afterGlob)\n })\n\n}\n\n// Two possible strategies.\n// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR\n// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR\n//\n// Both result in an extra syscall when you guess wrong. However, there\n// are likely far more normal files in the world than directories. This\n// is based on the assumption that a the average number of files per\n// directory is >= 1.\n//\n// If anyone ever complains about this, then I guess the strategy could\n// be made configurable somehow. But until then, YAGNI.\nconst rimraf_ = (p, options, cb) => {\n assert(p)\n assert(options)\n assert(typeof cb === 'function')\n\n // sunos lets the root user unlink directories, which is... weird.\n // so we have to lstat here and make sure it's not a dir.\n options.lstat(p, (er, st) => {\n if (er && er.code === \"ENOENT\")\n return cb(null)\n\n // Windows can EPERM on stat. Life is suffering.\n if (er && er.code === \"EPERM\" && isWindows)\n fixWinEPERM(p, options, er, cb)\n\n if (st && st.isDirectory())\n return rmdir(p, options, er, cb)\n\n options.unlink(p, er => {\n if (er) {\n if (er.code === \"ENOENT\")\n return cb(null)\n if (er.code === \"EPERM\")\n return (isWindows)\n ? fixWinEPERM(p, options, er, cb)\n : rmdir(p, options, er, cb)\n if (er.code === \"EISDIR\")\n return rmdir(p, options, er, cb)\n }\n return cb(er)\n })\n })\n}\n\nconst fixWinEPERM = (p, options, er, cb) => {\n assert(p)\n assert(options)\n assert(typeof cb === 'function')\n\n options.chmod(p, 0o666, er2 => {\n if (er2)\n cb(er2.code === \"ENOENT\" ? null : er)\n else\n options.stat(p, (er3, stats) => {\n if (er3)\n cb(er3.code === \"ENOENT\" ? null : er)\n else if (stats.isDirectory())\n rmdir(p, options, er, cb)\n else\n options.unlink(p, cb)\n })\n })\n}\n\nconst fixWinEPERMSync = (p, options, er) => {\n assert(p)\n assert(options)\n\n try {\n options.chmodSync(p, 0o666)\n } catch (er2) {\n if (er2.code === \"ENOENT\")\n return\n else\n throw er\n }\n\n let stats\n try {\n stats = options.statSync(p)\n } catch (er3) {\n if (er3.code === \"ENOENT\")\n return\n else\n throw er\n }\n\n if (stats.isDirectory())\n rmdirSync(p, options, er)\n else\n options.unlinkSync(p)\n}\n\nconst rmdir = (p, options, originalEr, cb) => {\n assert(p)\n assert(options)\n assert(typeof cb === 'function')\n\n // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)\n // if we guessed wrong, and it's not a directory, then\n // raise the original error.\n options.rmdir(p, er => {\n if (er && (er.code === \"ENOTEMPTY\" || er.code === \"EEXIST\" || er.code === \"EPERM\"))\n rmkids(p, options, cb)\n else if (er && er.code === \"ENOTDIR\")\n cb(originalEr)\n else\n cb(er)\n })\n}\n\nconst rmkids = (p, options, cb) => {\n assert(p)\n assert(options)\n assert(typeof cb === 'function')\n\n options.readdir(p, (er, files) => {\n if (er)\n return cb(er)\n let n = files.length\n if (n === 0)\n return options.rmdir(p, cb)\n let errState\n files.forEach(f => {\n rimraf(path.join(p, f), options, er => {\n if (errState)\n return\n if (er)\n return cb(errState = er)\n if (--n === 0)\n options.rmdir(p, cb)\n })\n })\n })\n}\n\n// this looks simpler, and is strictly *faster*, but will\n// tie up the JavaScript thread and fail on excessively\n// deep directory trees.\nconst rimrafSync = (p, options) => {\n options = options || {}\n defaults(options)\n\n assert(p, 'rimraf: missing path')\n assert.equal(typeof p, 'string', 'rimraf: path should be a string')\n assert(options, 'rimraf: missing options')\n assert.equal(typeof options, 'object', 'rimraf: options should be object')\n\n let results\n\n if (options.disableGlob || !glob.hasMagic(p)) {\n results = [p]\n } else {\n try {\n options.lstatSync(p)\n results = [p]\n } catch (er) {\n results = glob.sync(p, options.glob)\n }\n }\n\n if (!results.length)\n return\n\n for (let i = 0; i < results.length; i++) {\n const p = results[i]\n\n let st\n try {\n st = options.lstatSync(p)\n } catch (er) {\n if (er.code === \"ENOENT\")\n return\n\n // Windows can EPERM on stat. Life is suffering.\n if (er.code === \"EPERM\" && isWindows)\n fixWinEPERMSync(p, options, er)\n }\n\n try {\n // sunos lets the root user unlink directories, which is... weird.\n if (st && st.isDirectory())\n rmdirSync(p, options, null)\n else\n options.unlinkSync(p)\n } catch (er) {\n if (er.code === \"ENOENT\")\n return\n if (er.code === \"EPERM\")\n return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)\n if (er.code !== \"EISDIR\")\n throw er\n\n rmdirSync(p, options, er)\n }\n }\n}\n\nconst rmdirSync = (p, options, originalEr) => {\n assert(p)\n assert(options)\n\n try {\n options.rmdirSync(p)\n } catch (er) {\n if (er.code === \"ENOENT\")\n return\n if (er.code === \"ENOTDIR\")\n throw originalEr\n if (er.code === \"ENOTEMPTY\" || er.code === \"EEXIST\" || er.code === \"EPERM\")\n rmkidsSync(p, options)\n }\n}\n\nconst rmkidsSync = (p, options) => {\n assert(p)\n assert(options)\n options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))\n\n // We only end up here once we got ENOTEMPTY at least once, and\n // at this point, we are guaranteed to have removed all the kids.\n // So, we know that it won't be ENOENT or ENOTDIR or anything else.\n // try really hard to delete stuff on windows, because it has a\n // PROFOUNDLY annoying habit of not closing handles promptly when\n // files are deleted, resulting in spurious ENOTEMPTY errors.\n const retries = isWindows ? 100 : 1\n let i = 0\n do {\n let threw = true\n try {\n const ret = options.rmdirSync(p, options)\n threw = false\n return ret\n } finally {\n if (++i < retries && threw)\n continue\n }\n } while (true)\n}\n\nmodule.exports = rimraf\nrimraf.sync = rimrafSync\n","'use strict';\n\nconst fs = require('fs');\n\nmodule.exports = exports;\n\nconst versionArray = process.version\n .substr(1)\n .replace(/-.*$/, '')\n .split('.')\n .map((item) => {\n return +item;\n });\n\nconst napi_multiple_commands = [\n 'build',\n 'clean',\n 'configure',\n 'package',\n 'publish',\n 'reveal',\n 'testbinary',\n 'testpackage',\n 'unpublish'\n];\n\nconst napi_build_version_tag = 'napi_build_version=';\n\nmodule.exports.get_napi_version = function() {\n // returns the non-zero numeric napi version or undefined if napi is not supported.\n // correctly supporting target requires an updated cross-walk\n let version = process.versions.napi; // can be undefined\n if (!version) { // this code should never need to be updated\n if (versionArray[0] === 9 && versionArray[1] >= 3) version = 2; // 9.3.0+\n else if (versionArray[0] === 8) version = 1; // 8.0.0+\n }\n return version;\n};\n\nmodule.exports.get_napi_version_as_string = function(target) {\n // returns the napi version as a string or an empty string if napi is not supported.\n const version = module.exports.get_napi_version(target);\n return version ? '' + version : '';\n};\n\nmodule.exports.validate_package_json = function(package_json, opts) { // throws Error\n\n const binary = package_json.binary;\n const module_path_ok = pathOK(binary.module_path);\n const remote_path_ok = pathOK(binary.remote_path);\n const package_name_ok = pathOK(binary.package_name);\n const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts, true);\n const napi_build_versions_raw = module.exports.get_napi_build_versions_raw(package_json);\n\n if (napi_build_versions) {\n napi_build_versions.forEach((napi_build_version)=> {\n if (!(parseInt(napi_build_version, 10) === napi_build_version && napi_build_version > 0)) {\n throw new Error('All values specified in napi_versions must be positive integers.');\n }\n });\n }\n\n if (napi_build_versions && (!module_path_ok || (!remote_path_ok && !package_name_ok))) {\n throw new Error('When napi_versions is specified; module_path and either remote_path or ' +\n\t\t\t\"package_name must contain the substitution string '{napi_build_version}`.\");\n }\n\n if ((module_path_ok || remote_path_ok || package_name_ok) && !napi_build_versions_raw) {\n throw new Error(\"When the substitution string '{napi_build_version}` is specified in \" +\n\t\t\t'module_path, remote_path, or package_name; napi_versions must also be specified.');\n }\n\n if (napi_build_versions && !module.exports.get_best_napi_build_version(package_json, opts) &&\n\tmodule.exports.build_napi_only(package_json)) {\n throw new Error(\n 'The Node-API version of this Node instance is ' + module.exports.get_napi_version(opts ? opts.target : undefined) + '. ' +\n\t\t\t'This module supports Node-API version(s) ' + module.exports.get_napi_build_versions_raw(package_json) + '. ' +\n\t\t\t'This Node instance cannot run this module.');\n }\n\n if (napi_build_versions_raw && !napi_build_versions && module.exports.build_napi_only(package_json)) {\n throw new Error(\n 'The Node-API version of this Node instance is ' + module.exports.get_napi_version(opts ? opts.target : undefined) + '. ' +\n\t\t\t'This module supports Node-API version(s) ' + module.exports.get_napi_build_versions_raw(package_json) + '. ' +\n\t\t\t'This Node instance cannot run this module.');\n }\n\n};\n\nfunction pathOK(path) {\n return path && (path.indexOf('{napi_build_version}') !== -1 || path.indexOf('{node_napi_label}') !== -1);\n}\n\nmodule.exports.expand_commands = function(package_json, opts, commands) {\n const expanded_commands = [];\n const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts);\n commands.forEach((command)=> {\n if (napi_build_versions && command.name === 'install') {\n const napi_build_version = module.exports.get_best_napi_build_version(package_json, opts);\n const args = napi_build_version ? [napi_build_version_tag + napi_build_version] : [];\n expanded_commands.push({ name: command.name, args: args });\n } else if (napi_build_versions && napi_multiple_commands.indexOf(command.name) !== -1) {\n napi_build_versions.forEach((napi_build_version)=> {\n const args = command.args.slice();\n args.push(napi_build_version_tag + napi_build_version);\n expanded_commands.push({ name: command.name, args: args });\n });\n } else {\n expanded_commands.push(command);\n }\n });\n return expanded_commands;\n};\n\nmodule.exports.get_napi_build_versions = function(package_json, opts, warnings) { // opts may be undefined\n const log = require('npmlog');\n let napi_build_versions = [];\n const supported_napi_version = module.exports.get_napi_version(opts ? opts.target : undefined);\n // remove duplicates, verify each napi version can actaully be built\n if (package_json.binary && package_json.binary.napi_versions) {\n package_json.binary.napi_versions.forEach((napi_version) => {\n const duplicated = napi_build_versions.indexOf(napi_version) !== -1;\n if (!duplicated && supported_napi_version && napi_version <= supported_napi_version) {\n napi_build_versions.push(napi_version);\n } else if (warnings && !duplicated && supported_napi_version) {\n log.info('This Node instance does not support builds for Node-API version', napi_version);\n }\n });\n }\n if (opts && opts['build-latest-napi-version-only']) {\n let latest_version = 0;\n napi_build_versions.forEach((napi_version) => {\n if (napi_version > latest_version) latest_version = napi_version;\n });\n napi_build_versions = latest_version ? [latest_version] : [];\n }\n return napi_build_versions.length ? napi_build_versions : undefined;\n};\n\nmodule.exports.get_napi_build_versions_raw = function(package_json) {\n const napi_build_versions = [];\n // remove duplicates\n if (package_json.binary && package_json.binary.napi_versions) {\n package_json.binary.napi_versions.forEach((napi_version) => {\n if (napi_build_versions.indexOf(napi_version) === -1) {\n napi_build_versions.push(napi_version);\n }\n });\n }\n return napi_build_versions.length ? napi_build_versions : undefined;\n};\n\nmodule.exports.get_command_arg = function(napi_build_version) {\n return napi_build_version_tag + napi_build_version;\n};\n\nmodule.exports.get_napi_build_version_from_command_args = function(command_args) {\n for (let i = 0; i < command_args.length; i++) {\n const arg = command_args[i];\n if (arg.indexOf(napi_build_version_tag) === 0) {\n return parseInt(arg.substr(napi_build_version_tag.length), 10);\n }\n }\n return undefined;\n};\n\nmodule.exports.swap_build_dir_out = function(napi_build_version) {\n if (napi_build_version) {\n const rm = require('rimraf');\n rm.sync(module.exports.get_build_dir(napi_build_version));\n fs.renameSync('build', module.exports.get_build_dir(napi_build_version));\n }\n};\n\nmodule.exports.swap_build_dir_in = function(napi_build_version) {\n if (napi_build_version) {\n const rm = require('rimraf');\n rm.sync('build');\n fs.renameSync(module.exports.get_build_dir(napi_build_version), 'build');\n }\n};\n\nmodule.exports.get_build_dir = function(napi_build_version) {\n return 'build-tmp-napi-v' + napi_build_version;\n};\n\nmodule.exports.get_best_napi_build_version = function(package_json, opts) {\n let best_napi_build_version = 0;\n const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts);\n if (napi_build_versions) {\n const our_napi_version = module.exports.get_napi_version(opts ? opts.target : undefined);\n napi_build_versions.forEach((napi_build_version)=> {\n if (napi_build_version > best_napi_build_version &&\n\t\t\t\tnapi_build_version <= our_napi_version) {\n best_napi_build_version = napi_build_version;\n }\n });\n }\n return best_napi_build_version === 0 ? undefined : best_napi_build_version;\n};\n\nmodule.exports.build_napi_only = function(package_json) {\n return package_json.binary && package_json.binary.package_name &&\n\tpackage_json.binary.package_name.indexOf('{node_napi_label}') === -1;\n};\n","'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst isLinux = () => process.platform === 'linux';\n\nlet report = null;\nconst getReport = () => {\n if (!report) {\n /* istanbul ignore next */\n if (isLinux() && process.report) {\n const orig = process.report.excludeNetwork;\n process.report.excludeNetwork = true;\n report = process.report.getReport();\n process.report.excludeNetwork = orig;\n } else {\n report = {};\n }\n }\n return report;\n};\n\nmodule.exports = { isLinux, getReport };\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst fs = require('fs');\n\n/**\n * The path where we can find the ldd\n */\nconst LDD_PATH = '/usr/bin/ldd';\n\n/**\n * Read the content of a file synchronous\n *\n * @param {string} path\n * @returns {string}\n */\nconst readFileSync = (path) => fs.readFileSync(path, 'utf-8');\n\n/**\n * Read the content of a file\n *\n * @param {string} path\n * @returns {Promise<string>}\n */\nconst readFile = (path) => new Promise((resolve, reject) => {\n fs.readFile(path, 'utf-8', (err, data) => {\n if (err) {\n reject(err);\n } else {\n resolve(data);\n }\n });\n});\n\nmodule.exports = {\n LDD_PATH,\n readFileSync,\n readFile\n};\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst childProcess = require('child_process');\nconst { isLinux, getReport } = require('./process');\nconst { LDD_PATH, readFile, readFileSync } = require('./filesystem');\n\nlet cachedFamilyFilesystem;\nlet cachedVersionFilesystem;\n\nconst command = 'getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true';\nlet commandOut = '';\n\nconst safeCommand = () => {\n if (!commandOut) {\n return new Promise((resolve) => {\n childProcess.exec(command, (err, out) => {\n commandOut = err ? ' ' : out;\n resolve(commandOut);\n });\n });\n }\n return commandOut;\n};\n\nconst safeCommandSync = () => {\n if (!commandOut) {\n try {\n commandOut = childProcess.execSync(command, { encoding: 'utf8' });\n } catch (_err) {\n commandOut = ' ';\n }\n }\n return commandOut;\n};\n\n/**\n * A String constant containing the value `glibc`.\n * @type {string}\n * @public\n */\nconst GLIBC = 'glibc';\n\n/**\n * A Regexp constant to get the GLIBC Version.\n * @type {string}\n */\nconst RE_GLIBC_VERSION = /LIBC[a-z0-9 \\-).]*?(\\d+\\.\\d+)/i;\n\n/**\n * A String constant containing the value `musl`.\n * @type {string}\n * @public\n */\nconst MUSL = 'musl';\n\nconst isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-');\n\nconst familyFromReport = () => {\n const report = getReport();\n if (report.header && report.header.glibcVersionRuntime) {\n return GLIBC;\n }\n if (Array.isArray(report.sharedObjects)) {\n if (report.sharedObjects.some(isFileMusl)) {\n return MUSL;\n }\n }\n return null;\n};\n\nconst familyFromCommand = (out) => {\n const [getconf, ldd1] = out.split(/[\\r\\n]+/);\n if (getconf && getconf.includes(GLIBC)) {\n return GLIBC;\n }\n if (ldd1 && ldd1.includes(MUSL)) {\n return MUSL;\n }\n return null;\n};\n\nconst getFamilyFromLddContent = (content) => {\n if (content.includes('musl')) {\n return MUSL;\n }\n if (content.includes('GNU C Library')) {\n return GLIBC;\n }\n return null;\n};\n\nconst familyFromFilesystem = async () => {\n if (cachedFamilyFilesystem !== undefined) {\n return cachedFamilyFilesystem;\n }\n cachedFamilyFilesystem = null;\n try {\n const lddContent = await readFile(LDD_PATH);\n cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);\n } catch (e) {}\n return cachedFamilyFilesystem;\n};\n\nconst familyFromFilesystemSync = () => {\n if (cachedFamilyFilesystem !== undefined) {\n return cachedFamilyFilesystem;\n }\n cachedFamilyFilesystem = null;\n try {\n const lddContent = readFileSync(LDD_PATH);\n cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);\n } catch (e) {}\n return cachedFamilyFilesystem;\n};\n\n/**\n * Resolves with the libc family when it can be determined, `null` otherwise.\n * @returns {Promise<?string>}\n */\nconst family = async () => {\n let family = null;\n if (isLinux()) {\n family = await familyFromFilesystem();\n if (!family) {\n family = familyFromReport();\n }\n if (!family) {\n const out = await safeCommand();\n family = familyFromCommand(out);\n }\n }\n return family;\n};\n\n/**\n * Returns the libc family when it can be determined, `null` otherwise.\n * @returns {?string}\n */\nconst familySync = () => {\n let family = null;\n if (isLinux()) {\n family = familyFromFilesystemSync();\n if (!family) {\n family = familyFromReport();\n }\n if (!family) {\n const out = safeCommandSync();\n family = familyFromCommand(out);\n }\n }\n return family;\n};\n\n/**\n * Resolves `true` only when the platform is Linux and the libc family is not `glibc`.\n * @returns {Promise<boolean>}\n */\nconst isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;\n\n/**\n * Returns `true` only when the platform is Linux and the libc family is not `glibc`.\n * @returns {boolean}\n */\nconst isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;\n\nconst versionFromFilesystem = async () => {\n if (cachedVersionFilesystem !== undefined) {\n return cachedVersionFilesystem;\n }\n cachedVersionFilesystem = null;\n try {\n const lddContent = await readFile(LDD_PATH);\n const versionMatch = lddContent.match(RE_GLIBC_VERSION);\n if (versionMatch) {\n cachedVersionFilesystem = versionMatch[1];\n }\n } catch (e) {}\n return cachedVersionFilesystem;\n};\n\nconst versionFromFilesystemSync = () => {\n if (cachedVersionFilesystem !== undefined) {\n return cachedVersionFilesystem;\n }\n cachedVersionFilesystem = null;\n try {\n const lddContent = readFileSync(LDD_PATH);\n const versionMatch = lddContent.match(RE_GLIBC_VERSION);\n if (versionMatch) {\n cachedVersionFilesystem = versionMatch[1];\n }\n } catch (e) {}\n return cachedVersionFilesystem;\n};\n\nconst versionFromReport = () => {\n const report = getReport();\n if (report.header && report.header.glibcVersionRuntime) {\n return report.header.glibcVersionRuntime;\n }\n return null;\n};\n\nconst versionSuffix = (s) => s.trim().split(/\\s+/)[1];\n\nconst versionFromCommand = (out) => {\n const [getconf, ldd1, ldd2] = out.split(/[\\r\\n]+/);\n if (getconf && getconf.includes(GLIBC)) {\n return versionSuffix(getconf);\n }\n if (ldd1 && ldd2 && ldd1.includes(MUSL)) {\n return versionSuffix(ldd2);\n }\n return null;\n};\n\n/**\n * Resolves with the libc version when it can be determined, `null` otherwise.\n * @returns {Promise<?string>}\n */\nconst version = async () => {\n let version = null;\n if (isLinux()) {\n version = await versionFromFilesystem();\n if (!version) {\n version = versionFromReport();\n }\n if (!version) {\n const out = await safeCommand();\n version = versionFromCommand(out);\n }\n }\n return version;\n};\n\n/**\n * Returns the libc version when it can be determined, `null` otherwise.\n * @returns {?string}\n */\nconst versionSync = () => {\n let version = null;\n if (isLinux()) {\n version = versionFromFilesystemSync();\n if (!version) {\n version = versionFromReport();\n }\n if (!version) {\n const out = safeCommandSync();\n version = versionFromCommand(out);\n }\n }\n return version;\n};\n\nmodule.exports = {\n GLIBC,\n MUSL,\n family,\n familySync,\n isNonGlibcLinux,\n isNonGlibcLinuxSync,\n version,\n versionSync\n};\n","'use strict';\n\nmodule.exports = exports;\n\nconst path = require('path');\nconst semver = require('semver');\nconst url = require('url');\nconst detect_libc = require('detect-libc');\nconst napi = require('./napi.js');\n\nlet abi_crosswalk;\n\n// This is used for unit testing to provide a fake\n// ABI crosswalk that emulates one that is not updated\n// for the current version\nif (process.env.NODE_PRE_GYP_ABI_CROSSWALK) {\n abi_crosswalk = require(process.env.NODE_PRE_GYP_ABI_CROSSWALK);\n} else {\n abi_crosswalk = require('./abi_crosswalk.json');\n}\n\nconst major_versions = {};\nObject.keys(abi_crosswalk).forEach((v) => {\n const major = v.split('.')[0];\n if (!major_versions[major]) {\n major_versions[major] = v;\n }\n});\n\nfunction get_electron_abi(runtime, target_version) {\n if (!runtime) {\n throw new Error('get_electron_abi requires valid runtime arg');\n }\n if (typeof target_version === 'undefined') {\n // erroneous CLI call\n throw new Error('Empty target version is not supported if electron is the target.');\n }\n // Electron guarantees that patch version update won't break native modules.\n const sem_ver = semver.parse(target_version);\n return runtime + '-v' + sem_ver.major + '.' + sem_ver.minor;\n}\nmodule.exports.get_electron_abi = get_electron_abi;\n\nfunction get_node_webkit_abi(runtime, target_version) {\n if (!runtime) {\n throw new Error('get_node_webkit_abi requires valid runtime arg');\n }\n if (typeof target_version === 'undefined') {\n // erroneous CLI call\n throw new Error('Empty target version is not supported if node-webkit is the target.');\n }\n return runtime + '-v' + target_version;\n}\nmodule.exports.get_node_webkit_abi = get_node_webkit_abi;\n\nfunction get_node_abi(runtime, versions) {\n if (!runtime) {\n throw new Error('get_node_abi requires valid runtime arg');\n }\n if (!versions) {\n throw new Error('get_node_abi requires valid process.versions object');\n }\n const sem_ver = semver.parse(versions.node);\n if (sem_ver.major === 0 && sem_ver.minor % 2) { // odd series\n // https://github.com/mapbox/node-pre-gyp/issues/124\n return runtime + '-v' + versions.node;\n } else {\n // process.versions.modules added in >= v0.10.4 and v0.11.7\n // https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e\n return versions.modules ? runtime + '-v' + (+versions.modules) :\n 'v8-' + versions.v8.split('.').slice(0, 2).join('.');\n }\n}\nmodule.exports.get_node_abi = get_node_abi;\n\nfunction get_runtime_abi(runtime, target_version) {\n if (!runtime) {\n throw new Error('get_runtime_abi requires valid runtime arg');\n }\n if (runtime === 'node-webkit') {\n return get_node_webkit_abi(runtime, target_version || process.versions['node-webkit']);\n } else if (runtime === 'electron') {\n return get_electron_abi(runtime, target_version || process.versions.electron);\n } else {\n if (runtime !== 'node') {\n throw new Error(\"Unknown Runtime: '\" + runtime + \"'\");\n }\n if (!target_version) {\n return get_node_abi(runtime, process.versions);\n } else {\n let cross_obj;\n // abi_crosswalk generated with ./scripts/abi_crosswalk.js\n if (abi_crosswalk[target_version]) {\n cross_obj = abi_crosswalk[target_version];\n } else {\n const target_parts = target_version.split('.').map((i) => { return +i; });\n if (target_parts.length !== 3) { // parse failed\n throw new Error('Unknown target version: ' + target_version);\n }\n /*\n The below code tries to infer the last known ABI compatible version\n that we have recorded in the abi_crosswalk.json when an exact match\n is not possible. The reasons for this to exist are complicated:\n\n - We support passing --target to be able to allow developers to package binaries for versions of node\n that are not the same one as they are running. This might also be used in combination with the\n --target_arch or --target_platform flags to also package binaries for alternative platforms\n - When --target is passed we can't therefore determine the ABI (process.versions.modules) from the node\n version that is running in memory\n - So, therefore node-pre-gyp keeps an \"ABI crosswalk\" (lib/util/abi_crosswalk.json) to be able to look\n this info up for all versions\n - But we cannot easily predict what the future ABI will be for released versions\n - And node-pre-gyp needs to be a `bundledDependency` in apps that depend on it in order to work correctly\n by being fully available at install time.\n - So, the speed of node releases and the bundled nature of node-pre-gyp mean that a new node-pre-gyp release\n need to happen for every node.js/io.js/node-webkit/nw.js/atom-shell/etc release that might come online if\n you want the `--target` flag to keep working for the latest version\n - Which is impractical ^^\n - Hence the below code guesses about future ABI to make the need to update node-pre-gyp less demanding.\n\n In practice then you can have a dependency of your app like `node-sqlite3` that bundles a `node-pre-gyp` that\n only knows about node v0.10.33 in the `abi_crosswalk.json` but target node v0.10.34 (which is assumed to be\n ABI compatible with v0.10.33).\n\n TODO: use semver module instead of custom version parsing\n */\n const major = target_parts[0];\n let minor = target_parts[1];\n let patch = target_parts[2];\n // io.js: yeah if node.js ever releases 1.x this will break\n // but that is unlikely to happen: https://github.com/iojs/io.js/pull/253#issuecomment-69432616\n if (major === 1) {\n // look for last release that is the same major version\n // e.g. we assume io.js 1.x is ABI compatible with >= 1.0.0\n while (true) {\n if (minor > 0) --minor;\n if (patch > 0) --patch;\n const new_iojs_target = '' + major + '.' + minor + '.' + patch;\n if (abi_crosswalk[new_iojs_target]) {\n cross_obj = abi_crosswalk[new_iojs_target];\n console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);\n console.log('Warning: but node-pre-gyp successfully choose ' + new_iojs_target + ' as ABI compatible target');\n break;\n }\n if (minor === 0 && patch === 0) {\n break;\n }\n }\n } else if (major >= 2) {\n // look for last release that is the same major version\n if (major_versions[major]) {\n cross_obj = abi_crosswalk[major_versions[major]];\n console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);\n console.log('Warning: but node-pre-gyp successfully choose ' + major_versions[major] + ' as ABI compatible target');\n }\n } else if (major === 0) { // node.js\n if (target_parts[1] % 2 === 0) { // for stable/even node.js series\n // look for the last release that is the same minor release\n // e.g. we assume node 0.10.x is ABI compatible with >= 0.10.0\n while (--patch > 0) {\n const new_node_target = '' + major + '.' + minor + '.' + patch;\n if (abi_crosswalk[new_node_target]) {\n cross_obj = abi_crosswalk[new_node_target];\n console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);\n console.log('Warning: but node-pre-gyp successfully choose ' + new_node_target + ' as ABI compatible target');\n break;\n }\n }\n }\n }\n }\n if (!cross_obj) {\n throw new Error('Unsupported target version: ' + target_version);\n }\n // emulate process.versions\n const versions_obj = {\n node: target_version,\n v8: cross_obj.v8 + '.0',\n // abi_crosswalk uses 1 for node versions lacking process.versions.modules\n // process.versions.modules added in >= v0.10.4 and v0.11.7\n modules: cross_obj.node_abi > 1 ? cross_obj.node_abi : undefined\n };\n return get_node_abi(runtime, versions_obj);\n }\n }\n}\nmodule.exports.get_runtime_abi = get_runtime_abi;\n\nconst required_parameters = [\n 'module_name',\n 'module_path',\n 'host'\n];\n\nfunction validate_config(package_json, opts) {\n const msg = package_json.name + ' package.json is not node-pre-gyp ready:\\n';\n const missing = [];\n if (!package_json.main) {\n missing.push('main');\n }\n if (!package_json.version) {\n missing.push('version');\n }\n if (!package_json.name) {\n missing.push('name');\n }\n if (!package_json.binary) {\n missing.push('binary');\n }\n const o = package_json.binary;\n if (o) {\n required_parameters.forEach((p) => {\n if (!o[p] || typeof o[p] !== 'string') {\n missing.push('binary.' + p);\n }\n });\n }\n\n if (missing.length >= 1) {\n throw new Error(msg + 'package.json must declare these properties: \\n' + missing.join('\\n'));\n }\n if (o) {\n // enforce https over http\n const protocol = url.parse(o.host).protocol;\n if (protocol === 'http:') {\n throw new Error(\"'host' protocol (\" + protocol + \") is invalid - only 'https:' is accepted\");\n }\n }\n napi.validate_package_json(package_json, opts);\n}\n\nmodule.exports.validate_config = validate_config;\n\nfunction eval_template(template, opts) {\n Object.keys(opts).forEach((key) => {\n const pattern = '{' + key + '}';\n while (template.indexOf(pattern) > -1) {\n template = template.replace(pattern, opts[key]);\n }\n });\n return template;\n}\n\n// url.resolve needs single trailing slash\n// to behave correctly, otherwise a double slash\n// may end up in the url which breaks requests\n// and a lacking slash may not lead to proper joining\nfunction fix_slashes(pathname) {\n if (pathname.slice(-1) !== '/') {\n return pathname + '/';\n }\n return pathname;\n}\n\n// remove double slashes\n// note: path.normalize will not work because\n// it will convert forward to back slashes\nfunction drop_double_slashes(pathname) {\n return pathname.replace(/\\/\\//g, '/');\n}\n\nfunction get_process_runtime(versions) {\n let runtime = 'node';\n if (versions['node-webkit']) {\n runtime = 'node-webkit';\n } else if (versions.electron) {\n runtime = 'electron';\n }\n return runtime;\n}\n\nmodule.exports.get_process_runtime = get_process_runtime;\n\nconst default_package_name = '{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz';\nconst default_remote_path = '';\n\nmodule.exports.evaluate = function(package_json, options, napi_build_version) {\n options = options || {};\n validate_config(package_json, options); // options is a suitable substitute for opts in this case\n const v = package_json.version;\n const module_version = semver.parse(v);\n const runtime = options.runtime || get_process_runtime(process.versions);\n const opts = {\n name: package_json.name,\n configuration: options.debug ? 'Debug' : 'Release',\n debug: options.debug,\n module_name: package_json.binary.module_name,\n version: module_version.version,\n prerelease: module_version.prerelease.length ? module_version.prerelease.join('.') : '',\n build: module_version.build.length ? module_version.build.join('.') : '',\n major: module_version.major,\n minor: module_version.minor,\n patch: module_version.patch,\n runtime: runtime,\n node_abi: get_runtime_abi(runtime, options.target),\n node_abi_napi: napi.get_napi_version(options.target) ? 'napi' : get_runtime_abi(runtime, options.target),\n napi_version: napi.get_napi_version(options.target), // non-zero numeric, undefined if unsupported\n napi_build_version: napi_build_version || '',\n node_napi_label: napi_build_version ? 'napi-v' + napi_build_version : get_runtime_abi(runtime, options.target),\n target: options.target || '',\n platform: options.target_platform || process.platform,\n target_platform: options.target_platform || process.platform,\n arch: options.target_arch || process.arch,\n target_arch: options.target_arch || process.arch,\n libc: options.target_libc || detect_libc.familySync() || 'unknown',\n module_main: package_json.main,\n toolset: options.toolset || '', // address https://github.com/mapbox/node-pre-gyp/issues/119\n bucket: package_json.binary.bucket,\n region: package_json.binary.region,\n s3ForcePathStyle: package_json.binary.s3ForcePathStyle || false\n };\n // support host mirror with npm config `--{module_name}_binary_host_mirror`\n // e.g.: https://github.com/node-inspector/v8-profiler/blob/master/package.json#L25\n // > npm install v8-profiler --profiler_binary_host_mirror=https://npm.taobao.org/mirrors/node-inspector/\n const validModuleName = opts.module_name.replace('-', '_');\n const host = process.env['npm_config_' + validModuleName + '_binary_host_mirror'] || package_json.binary.host;\n opts.host = fix_slashes(eval_template(host, opts));\n opts.module_path = eval_template(package_json.binary.module_path, opts);\n // now we resolve the module_path to ensure it is absolute so that binding.gyp variables work predictably\n if (options.module_root) {\n // resolve relative to known module root: works for pre-binding require\n opts.module_path = path.join(options.module_root, opts.module_path);\n } else {\n // resolve relative to current working directory: works for node-pre-gyp commands\n opts.module_path = path.resolve(opts.module_path);\n }\n opts.module = path.join(opts.module_path, opts.module_name + '.node');\n opts.remote_path = package_json.binary.remote_path ? drop_double_slashes(fix_slashes(eval_template(package_json.binary.remote_path, opts))) : default_remote_path;\n const package_name = package_json.binary.package_name ? package_json.binary.package_name : default_package_name;\n opts.package_name = eval_template(package_name, opts);\n opts.staged_tarball = path.join('build/stage', opts.remote_path, opts.package_name);\n opts.hosted_path = url.resolve(opts.host, opts.remote_path);\n opts.hosted_tarball = url.resolve(opts.hosted_path, opts.package_name);\n return opts;\n};\n","'use strict';\n\nconst npg = require('..');\nconst versioning = require('../lib/util/versioning.js');\nconst napi = require('../lib/util/napi.js');\nconst existsSync = require('fs').existsSync || require('path').existsSync;\nconst path = require('path');\n\nmodule.exports = exports;\n\nexports.usage = 'Finds the require path for the node-pre-gyp installed module';\n\nexports.validate = function(package_json, opts) {\n versioning.validate_config(package_json, opts);\n};\n\nexports.find = function(package_json_path, opts) {\n if (!existsSync(package_json_path)) {\n throw new Error(package_json_path + 'does not exist');\n }\n const prog = new npg.Run({ package_json_path, argv: process.argv });\n prog.setBinaryHostProperty();\n const package_json = prog.package_json;\n\n versioning.validate_config(package_json, opts);\n let napi_build_version;\n if (napi.get_napi_build_versions(package_json, opts)) {\n napi_build_version = napi.get_best_napi_build_version(package_json, opts);\n }\n opts = opts || {};\n if (!opts.module_root) opts.module_root = path.dirname(package_json_path);\n const meta = versioning.evaluate(package_json, opts, napi_build_version);\n return meta.module;\n};\n","'use strict';\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports;\n\n/**\n * Module dependencies.\n */\n\n// load mocking control function for accessing s3 via https. the function is a noop always returning\n// false if not mocking.\nexports.mockS3Http = require('./util/s3_setup').get_mockS3Http();\nexports.mockS3Http('on');\nconst mocking = exports.mockS3Http('get');\n\n\nconst fs = require('fs');\nconst path = require('path');\nconst nopt = require('nopt');\nconst log = require('npmlog');\nlog.disableProgress();\nconst napi = require('./util/napi.js');\n\nconst EE = require('events').EventEmitter;\nconst inherits = require('util').inherits;\nconst cli_commands = [\n 'clean',\n 'install',\n 'reinstall',\n 'build',\n 'rebuild',\n 'package',\n 'testpackage',\n 'publish',\n 'unpublish',\n 'info',\n 'testbinary',\n 'reveal',\n 'configure'\n];\nconst aliases = {};\n\n// differentiate node-pre-gyp's logs from npm's\nlog.heading = 'node-pre-gyp';\n\nif (mocking) {\n log.warn(`mocking s3 to ${process.env.node_pre_gyp_mock_s3}`);\n}\n\n// this is a getter to avoid circular reference warnings with node v14.\nObject.defineProperty(exports, 'find', {\n get: function() {\n return require('./pre-binding').find;\n },\n enumerable: true\n});\n\n// in the following, \"my_module\" is using node-pre-gyp to\n// prebuild and install pre-built binaries. \"main_module\"\n// is using \"my_module\".\n//\n// \"bin/node-pre-gyp\" invokes Run() without a path. the\n// expectation is that the working directory is the package\n// root \"my_module\". this is true because in all cases npm is\n// executing a script in the context of \"my_module\".\n//\n// \"pre-binding.find()\" is executed by \"my_module\" but in the\n// context of \"main_module\". this is because \"main_module\" is\n// executing and requires \"my_module\" which is then executing\n// \"pre-binding.find()\" via \"node-pre-gyp.find()\", so the working\n// directory is that of \"main_module\".\n//\n// that's why \"find()\" must pass the path to package.json.\n//\nfunction Run({ package_json_path = './package.json', argv }) {\n this.package_json_path = package_json_path;\n this.commands = {};\n\n const self = this;\n cli_commands.forEach((command) => {\n self.commands[command] = function(argvx, callback) {\n log.verbose('command', command, argvx);\n return require('./' + command)(self, argvx, callback);\n };\n });\n\n this.parseArgv(argv);\n\n // this is set to true after the binary.host property was set to\n // either staging_host or production_host.\n this.binaryHostSet = false;\n}\ninherits(Run, EE);\nexports.Run = Run;\nconst proto = Run.prototype;\n\n/**\n * Export the contents of the package.json.\n */\n\nproto.package = require('../package.json');\n\n/**\n * nopt configuration definitions\n */\n\nproto.configDefs = {\n help: Boolean, // everywhere\n arch: String, // 'configure'\n debug: Boolean, // 'build'\n directory: String, // bin\n proxy: String, // 'install'\n loglevel: String // everywhere\n};\n\n/**\n * nopt shorthands\n */\n\nproto.shorthands = {\n release: '--no-debug',\n C: '--directory',\n debug: '--debug',\n j: '--jobs',\n silent: '--loglevel=silent',\n silly: '--loglevel=silly',\n verbose: '--loglevel=verbose'\n};\n\n/**\n * expose the command aliases for the bin file to use.\n */\n\nproto.aliases = aliases;\n\n/**\n * Parses the given argv array and sets the 'opts', 'argv',\n * 'command', and 'package_json' properties.\n */\n\nproto.parseArgv = function parseOpts(argv) {\n this.opts = nopt(this.configDefs, this.shorthands, argv);\n this.argv = this.opts.argv.remain.slice();\n const commands = this.todo = [];\n\n // create a copy of the argv array with aliases mapped\n argv = this.argv.map((arg) => {\n // is this an alias?\n if (arg in this.aliases) {\n arg = this.aliases[arg];\n }\n return arg;\n });\n\n // process the mapped args into \"command\" objects (\"name\" and \"args\" props)\n argv.slice().forEach((arg) => {\n if (arg in this.commands) {\n const args = argv.splice(0, argv.indexOf(arg));\n argv.shift();\n if (commands.length > 0) {\n commands[commands.length - 1].args = args;\n }\n commands.push({ name: arg, args: [] });\n }\n });\n if (commands.length > 0) {\n commands[commands.length - 1].args = argv.splice(0);\n }\n\n\n // if a directory was specified package.json is assumed to be relative\n // to it.\n let package_json_path = this.package_json_path;\n if (this.opts.directory) {\n package_json_path = path.join(this.opts.directory, package_json_path);\n }\n\n this.package_json = JSON.parse(fs.readFileSync(package_json_path));\n\n // expand commands entries for multiple napi builds\n this.todo = napi.expand_commands(this.package_json, this.opts, commands);\n\n // support for inheriting config env variables from npm\n const npm_config_prefix = 'npm_config_';\n Object.keys(process.env).forEach((name) => {\n if (name.indexOf(npm_config_prefix) !== 0) return;\n const val = process.env[name];\n if (name === npm_config_prefix + 'loglevel') {\n log.level = val;\n } else {\n // add the user-defined options to the config\n name = name.substring(npm_config_prefix.length);\n // avoid npm argv clobber already present args\n // which avoids problem of 'npm test' calling\n // script that runs unique npm install commands\n if (name === 'argv') {\n if (this.opts.argv &&\n this.opts.argv.remain &&\n this.opts.argv.remain.length) {\n // do nothing\n } else {\n this.opts[name] = val;\n }\n } else {\n this.opts[name] = val;\n }\n }\n });\n\n if (this.opts.loglevel) {\n log.level = this.opts.loglevel;\n }\n log.resume();\n};\n\n/**\n * allow the binary.host property to be set at execution time.\n *\n * for this to take effect requires all the following to be true.\n * - binary is a property in package.json\n * - binary.host is falsey\n * - binary.staging_host is not empty\n * - binary.production_host is not empty\n *\n * if any of the previous checks fail then the function returns an empty string\n * and makes no changes to package.json's binary property.\n *\n *\n * if command is \"publish\" then the default is set to \"binary.staging_host\"\n * if command is not \"publish\" the the default is set to \"binary.production_host\"\n *\n * if the command-line option '--s3_host' is set to \"staging\" or \"production\" then\n * \"binary.host\" is set to the specified \"staging_host\" or \"production_host\". if\n * '--s3_host' is any other value an exception is thrown.\n *\n * if '--s3_host' is not present then \"binary.host\" is set to the default as above.\n *\n * this strategy was chosen so that any command other than \"publish\" or \"unpublish\" uses \"production\"\n * as the default without requiring any command-line options but that \"publish\" and \"unpublish\" require\n * '--s3_host production_host' to be specified in order to *really* publish (or unpublish). publishing\n * to staging can be done freely without worrying about disturbing any production releases.\n */\nproto.setBinaryHostProperty = function(command) {\n if (this.binaryHostSet) {\n return this.package_json.binary.host;\n }\n const p = this.package_json;\n // don't set anything if host is present. it must be left blank to trigger this.\n if (!p || !p.binary || p.binary.host) {\n return '';\n }\n // and both staging and production must be present. errors will be reported later.\n if (!p.binary.staging_host || !p.binary.production_host) {\n return '';\n }\n let target = 'production_host';\n if (command === 'publish' || command === 'unpublish') {\n target = 'staging_host';\n }\n // the environment variable has priority over the default or the command line. if\n // either the env var or the command line option are invalid throw an error.\n const npg_s3_host = process.env.node_pre_gyp_s3_host;\n if (npg_s3_host === 'staging' || npg_s3_host === 'production') {\n target = `${npg_s3_host}_host`;\n } else if (this.opts['s3_host'] === 'staging' || this.opts['s3_host'] === 'production') {\n target = `${this.opts['s3_host']}_host`;\n } else if (this.opts['s3_host'] || npg_s3_host) {\n throw new Error(`invalid s3_host ${this.opts['s3_host'] || npg_s3_host}`);\n }\n\n p.binary.host = p.binary[target];\n this.binaryHostSet = true;\n\n return p.binary.host;\n};\n\n/**\n * Returns the usage instructions for node-pre-gyp.\n */\n\nproto.usage = function usage() {\n const str = [\n '',\n ' Usage: node-pre-gyp <command> [options]',\n '',\n ' where <command> is one of:',\n cli_commands.map((c) => {\n return ' - ' + c + ' - ' + require('./' + c).usage;\n }).join('\\n'),\n '',\n 'node-pre-gyp@' + this.version + ' ' + path.resolve(__dirname, '..'),\n 'node@' + process.versions.node\n ].join('\\n');\n return str;\n};\n\n/**\n * Version number getter.\n */\n\nObject.defineProperty(proto, 'version', {\n get: function() {\n return this.package.version;\n },\n enumerable: true\n});\n","class Cursor {\n\n static CUSROR_CLOSED_ERROR = 'Cursor has already been closed!';\n\n /**\n * An cursor created following the execution of query that is ready to return a result set \n * @constructor\n * @param {object} odbcCursor - an odbcCursor object, defined in src/odbc_cursor.h/.cpp\n */\n constructor(odbcCursor) {\n this.odbcCursor = odbcCursor;\n }\n\n /**\n * Return whether or not a call to SQLFetch has returned SQL_NO_DATA\n * @returns {boolean}\n *\n */\n get noData() {\n if (!this.odbcCursor)\n {\n throw new Error(CUSROR_CLOSED_ERROR);\n }\n return this.odbcCursor.noData;\n }\n\n /**\n * Calls SQL_FETCH and returns the next result set\n * @param {function} [callback] - The callback function to return an error and a result. If the callback is ommited, a Promise is returned.\n * @returns {undefined|Promise}\n */\n fetch(cb) {\n\n let callback = cb;\n\n if (typeof callback !== 'function') {\n if (!this.odbcCursor) {\n throw new Error(Cursor.CUSROR_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcCursor.fetch((error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n if (!this.odbcCursor) {\n callback(new Error(Cursor.CUSROR_CLOSED_ERROR));\n } else {\n this.odbcCursor.fetch(callback);\n }\n }\n\n /**\n * Closes the cursor and the underlying SQLHSTMT, freeing all memory\n * @param {function} [callback] - The callback function to return an error. If the callback is ommited, a Promise is returned.\n * @returns {undefined|Promise}\n */\n close(callback = undefined) {\n\n // promise...\n if (typeof callback !== 'function') {\n if (!this.odbcCursor) {\n throw new Error(Cursor.CUSROR_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcCursor.close((error) => {\n if (error) {\n reject(error);\n } else {\n this.odbcCursor = null;\n resolve();\n }\n });\n });\n }\n\n // ...or callback\n this.odbcCursor.close((error) => {\n if (!error) {\n this.odbcCursor = null;\n }\n callback(error);\n });\n }\n}\n\nmodule.exports.Cursor = Cursor;\n","const { Cursor } = require('./Cursor');\n\nclass Statement {\n\n STATEMENT_CLOSED_ERROR = 'Statement has already been closed!';\n\n constructor(odbcStatement) {\n this.odbcStatement = odbcStatement;\n }\n\n /**\n * Prepare an SQL statement template to which parameters can be bound and the statement then executed.\n * @param {string} sql - The SQL statement template to prepare, with or without unspecified parameters.\n * @param {function} [callback] - The callback function that returns the result. If omitted, uses a Promise.\n * @returns {undefined|Promise}\n */\n prepare(sql, callback = undefined) {\n if (typeof sql !== 'string'\n || (typeof callback !== 'function' && typeof callback !== 'undefined')) {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to statement.prepare({string}, {function}[optional]).');\n }\n\n // promise...\n if (typeof callback === 'undefined') {\n if (!this.odbcStatement)\n {\n throw new Error(Statement.STATEMENT_CLOSED_ERROR);\n }\n\n return new Promise((resolve, reject) => {\n this.odbcStatement.prepare(sql, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcStatement)\n {\n callback(new Error(Statement.STATEMENT_CLOSED_ERROR));\n } else {\n this.odbcStatement.prepare(sql, callback);\n }\n }\n\n /**\n * Bind parameters on the previously prepared SQL statement template.\n * @param {*[]} parameters - The parameters to bind to the previously prepared SQL statement.\n * @param {function} [callback] - The callback function that returns the result. If omitted, uses a Promise.\n * @return {undefined|Promise}\n */\n bind(parameters, callback = undefined) {\n if (!Array.isArray(parameters)\n || (typeof callback !== 'function' && typeof callback !== 'undefined')) {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to statement.bind({array}, {function}[optional]).');\n }\n\n // promise...\n if (typeof callback === 'undefined') {\n if (!this.odbcStatement)\n {\n throw new Error(Statement.STATEMENT_CLOSED_ERROR);\n }\n\n return new Promise((resolve, reject) => {\n this.odbcStatement.bind(parameters, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcStatement)\n {\n callback(new Error(Statement.STATEMENT_CLOSED_ERROR));\n } else {\n this.odbcStatement.bind(parameters, callback);\n }\n }\n\n /**\n * Executes the prepared SQL statement template with the bound parameters, returning the result.\n * @param {function} [callback] - The callback function that returns the result. If omitted, uses a Promise.\n */\n execute(options, callback = undefined) {\n\n if (options === undefined)\n {\n options = null;\n }\n\n if (typeof options === 'function' && callback === undefined) {\n callback = options;\n options = null\n }\n\n if ((typeof callback !== 'function' && typeof callback !== 'undefined') \n || typeof options !== 'object' && typeof options !== 'undefined' ) {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to statement.execute({object}[optional], {function}[optional]).');\n }\n\n // Promise...\n if (typeof callback === 'undefined') {\n if (!this.odbcStatement)\n {\n throw new Error(Statement.STATEMENT_CLOSED_ERROR);\n }\n\n return new Promise((resolve, reject) => {\n this.odbcStatement.execute(options, (error, result) => {\n if (error) {\n reject(error);\n } else {\n if (options && \n (\n options.hasOwnProperty('fetchSize') || \n options.hasOwnProperty('cursor')\n )\n )\n {\n const cursor = new Cursor(result);\n resolve(cursor);\n }\n else\n {\n resolve(result);\n }\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcStatement)\n {\n callback(new Error(Statement.STATEMENT_CLOSED_ERROR));\n } else {\n process.nextTick(() => {\n if (options &&\n (\n options.hasOwnProperty('fetchSize') ||\n options.hasOwnProperty('cursor')\n )\n )\n {\n this.odbcStatement.execute(options, (error, result) => {\n if (error) {\n return callback(error);\n }\n \n const cursor = new Cursor(result);\n return callback(error, cursor);\n });\n }\n else\n {\n this.odbcStatement.execute(options, callback);\n }\n });\n }\n }\n\n /**\n * Closes the statement, deleting the prepared statement and freeing the handle, making further\n * calls on the object invalid.\n * @param {function} [callback] - The callback function that returns the result. If omitted, uses a Promise. \n */\n close(callback = undefined) {\n if (typeof callback !== 'function' && typeof callback !== 'undefined') {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to statement.close({function}[optional]).');\n }\n\n if (typeof callback === 'undefined') {\n if (!this.odbcStatement) {\n throw new Error(Statement.STATEMENT_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcStatement.close((error) => {\n if (error) {\n reject(error);\n } else {\n this.odbcStatement = null;\n resolve();\n }\n });\n });\n }\n\n // ...or callback\n return this.odbcStatement.close((error) => {\n if (!error) {\n this.odbcStatement = null;\n }\n callback(error);\n });\n }\n}\n\nmodule.exports.Statement = Statement;\n","const { Statement } = require('./Statement');\nconst { Cursor } = require('./Cursor');\n\nclass Connection {\n\n CONNECTION_CLOSED_ERROR = 'Connection has already been closed!';\n\n /**\n * An open connection to the database made through an ODBC driver\n * @constructor\n * @param {string|object} connectionString - The connection string to connect using the DSN\n * defined in odbc.ini, or an odbcConnection object\n */\n constructor(odbcConnection) {\n this.odbcConnection = odbcConnection;\n }\n\n get connected() {\n if (!this.odbcConnection)\n {\n return false;\n }\n return this.odbcConnection.connected;\n }\n\n get autocommit() {\n if (!this.odbcConnection)\n {\n throw new Error(CONNECTION_CLOSED_ERROR);\n }\n return this.odbcConnection.autocommit;\n }\n\n // TODO: Write the documentation\n /**\n *\n * @param {*} sql\n * @param {*} params\n * @param {*} cb\n */\n query(sql, params, opts, cb) {\n // accepted parameter signatures:\n // sql\n // sql, params\n // sql, opts\n // sql, params, opts\n // sql, cb\n // sql, params, cb\n // sql, opts, cb\n // sql, params, opts, cb\n\n let callback = cb;\n let parameters = params;\n let options = opts;\n\n // If callback is undefined, search for a function in another position\n if (typeof callback === 'undefined')\n {\n if (typeof options === 'function')\n {\n callback = options;\n options = undefined;\n }\n else if(typeof parameters === 'function')\n {\n callback = parameters;\n options = undefined;\n parameters = undefined;\n }\n }\n\n if (typeof options === 'undefined')\n {\n if (typeof parameters === 'object' && parameters !== null && !Array.isArray(parameters))\n {\n options = parameters;\n parameters = null;\n } else {\n options = null;\n }\n }\n\n // if explicitly passing undefined into parameters, need to change to null\n if (typeof parameters === 'undefined') {\n parameters = null;\n }\n\n if (\n typeof sql !== 'string' ||\n (parameters !== null && !Array.isArray(parameters)) ||\n (options !== null && typeof options !== 'object') ||\n (typeof callback !== 'function' && typeof callback !== 'undefined')\n ) \n {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to connection.query({string}, {array}[optional], {object}[optional], {function}[optional]).');\n }\n\n if (typeof callback !== 'function') {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.query(sql, parameters, options, (error, result) => {\n if (error) {\n reject(error);\n } else {\n if (options && \n (\n options.hasOwnProperty('fetchSize') || \n options.hasOwnProperty('cursor')\n )\n )\n {\n const cursor = new Cursor(result);\n resolve(cursor);\n }\n else\n {\n resolve(result);\n }\n }\n });\n });\n }\n\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n process.nextTick(() => {\n if (options &&\n (\n options.hasOwnProperty('fetchSize') ||\n options.hasOwnProperty('cursor')\n )\n )\n {\n this.odbcConnection.query(sql, parameters, options, (error, result) => {\n if (error) {\n return callback(error);\n }\n\n const cursor = new Cursor(result);\n return callback(error, cursor);\n });\n }\n else\n {\n this.odbcConnection.query(sql, parameters, options, callback);\n }\n });\n }\n }\n\n /**\n *\n * @param {string} name\n * @param {Array} parameters\n * @param {function} [cb]\n */\n callProcedure(catalog, schema, name, params = undefined, cb = undefined) {\n // name\n // name, params\n // name, cb\n // name, params, cb\n\n let callback = cb;\n let parameters = params;\n\n if (typeof callback === 'undefined') {\n if (typeof parameters === 'function') {\n callback = parameters;\n parameters = null;\n } else if (typeof parameters === 'undefined') {\n parameters = null;\n }\n }\n\n // if explicitly passing undefined into parameters, need to change to null\n if (typeof parameters === 'undefined') {\n parameters = null;\n }\n\n if (typeof name !== 'string'\n || (parameters !== null && !Array.isArray(parameters))\n || (typeof callback !== 'function' && typeof callback !== 'undefined')) {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to connection.query({string}, {array}[optional], {function}[optional]).');\n }\n\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.callProcedure(catalog, schema, name, parameters, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.callProcedure(catalog, schema, name, parameters, callback);\n }\n }\n\n // TODO: Write the documentation\n /**\n *\n * @param {*} callback\n */\n createStatement(callback = undefined) {\n // type-checking\n if (typeof callback !== 'function' && typeof callback !== 'undefined') {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to connection.createStatement({function}[optional]).');\n }\n\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.createStatement((error, odbcStatement) => {\n if (error) {\n reject(error);\n } else {\n const statement = new Statement(odbcStatement);\n resolve(statement);\n }\n });\n });\n }\n\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.createStatement((error, odbcStatement) => {\n if (error) { return callback(error, null); }\n\n const statement = new Statement(odbcStatement);\n callback(null, statement);\n });\n }\n }\n\n /** TODO:\n * Get the value of the passed attribute from the connection. Asynchronous, can be used either\n * with a callback function or a Promise.\n * @param {string} attribute - The title of the book.\n * @param {function} [callback] - Callback function. If not passed, a Promise will be returned.\n */\n close(callback = undefined) {\n // type-checking\n if (typeof callback !== 'function' && typeof callback !== 'undefined') {\n throw new TypeError('[node-odbc]: Incorrect function signature for call to connection.close({function}[optional]).');\n }\n\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.close((error) => {\n if (error) {\n reject(error);\n } else {\n this.odbcConnection = null;\n resolve();\n }\n });\n });\n }\n\n // ...or callback\n return this.odbcConnection.close((error) => {\n if (!error)\n {\n this.odbcConnection = null;\n }\n return callback(error);\n });\n }\n\n // TODO: Documentation\n primaryKeys(catalog, schema, table, callback = undefined) {\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.primaryKeys(catalog, schema, table, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.primaryKeys(catalog, schema, table, callback);\n }\n }\n\n // TODO: Documentation\n foreignKeys(catalog, schema, table, fkCatalog, fkSchema, fkTable, callback = undefined) {\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.foreignKeys(catalog, schema, table, fkCatalog, fkSchema, fkTable, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.foreignKeys(catalog, schema, table, fkCatalog, fkSchema, fkTable, callback);\n }\n }\n\n // TODO: Documentation\n columns(catalog, schema, table, type, callback = undefined) {\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.columns(catalog, schema, table, type, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.columns(catalog, schema, table, type, callback);\n }\n }\n\n // TODO: Documentation\n tables(catalog, schema, table, type, callback = undefined) {\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.tables(catalog, schema, table, type, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.tables(catalog, schema, table, type, callback);\n }\n }\n\n // TODO: Documentation\n setIsolationLevel(isolationLevel, callback = undefined) {\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.setIsolationLevel(isolationLevel, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.setIsolationLevel(isolationLevel, callback);\n }\n }\n\n /**\n * Begins a transaction, turning off auto-commit. Transaction is ended with commit() or\n * rollback().\n * @param {function} [callback] - Callback function. If not passed, a Promise will be returned.\n */\n beginTransaction(callback = undefined) {\n // promise...\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.beginTransaction((error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n\n // ...or callback\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.beginTransaction(callback);\n }\n }\n\n /**\n * Asynchronously ends the transaction with a commit.\n * @param {function} [callback] - Callback function. If not passed, a Promise will be returned.\n */\n commit(callback = undefined) {\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.commit((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.commit(callback);\n }\n }\n\n /**\n * Asynchronously ends the transaction with a rollback.\n * @param {function} [callback] - Callback function. If not passed, a Promise will be returned.\n */\n rollback(callback = undefined) {\n if (callback === undefined) {\n if (!this.odbcConnection)\n {\n throw new Error(Connection.CONNECTION_CLOSED_ERROR);\n }\n return new Promise((resolve, reject) => {\n this.odbcConnection.rollback((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n\n if (!this.odbcConnection) {\n callback(new Error(Connection.CONNECTION_CLOSED_ERROR));\n } else {\n this.odbcConnection.rollback(callback);\n }\n }\n}\n\nmodule.exports.Connection = Connection;\n","/**\n * Creates a continuation function with some arguments already applied.\n *\n * Useful as a shorthand when combined with other control flow functions. Any\n * arguments passed to the returned function are added to the arguments\n * originally passed to apply.\n *\n * @name apply\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {Function} fn - The function you want to eventually apply all\n * arguments to. Invokes with (arguments...).\n * @param {...*} arguments... - Any number of arguments to automatically apply\n * when the continuation is called.\n * @returns {Function} the partially-applied function\n * @example\n *\n * // using apply\n * async.parallel([\n * async.apply(fs.writeFile, 'testfile1', 'test1'),\n * async.apply(fs.writeFile, 'testfile2', 'test2')\n * ]);\n *\n *\n * // the same process without using apply\n * async.parallel([\n * function(callback) {\n * fs.writeFile('testfile1', 'test1', callback);\n * },\n * function(callback) {\n * fs.writeFile('testfile2', 'test2', callback);\n * }\n * ]);\n *\n * // It's possible to pass any number of additional arguments when calling the\n * // continuation:\n *\n * node> var fn = async.apply(sys.puts, 'one');\n * node> fn('two', 'three');\n * one\n * two\n * three\n */\nfunction apply(fn, ...args) {\n return (...callArgs) => fn(...args,...callArgs);\n}\n\nfunction initialParams (fn) {\n return function (...args/*, callback*/) {\n var callback = args.pop();\n return fn.call(this, args, callback);\n };\n}\n\n/* istanbul ignore file */\n\nvar hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask;\nvar hasSetImmediate = typeof setImmediate === 'function' && setImmediate;\nvar hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';\n\nfunction fallback(fn) {\n setTimeout(fn, 0);\n}\n\nfunction wrap(defer) {\n return (fn, ...args) => defer(() => fn(...args));\n}\n\nvar _defer$1;\n\nif (hasQueueMicrotask) {\n _defer$1 = queueMicrotask;\n} else if (hasSetImmediate) {\n _defer$1 = setImmediate;\n} else if (hasNextTick) {\n _defer$1 = process.nextTick;\n} else {\n _defer$1 = fallback;\n}\n\nvar setImmediate$1 = wrap(_defer$1);\n\n/**\n * Take a sync function and make it async, passing its return value to a\n * callback. This is useful for plugging sync functions into a waterfall,\n * series, or other async functions. Any arguments passed to the generated\n * function will be passed to the wrapped function (except for the final\n * callback argument). Errors thrown will be passed to the callback.\n *\n * If the function passed to `asyncify` returns a Promise, that promises's\n * resolved/rejected state will be used to call the callback, rather than simply\n * the synchronous return value.\n *\n * This also means you can asyncify ES2017 `async` functions.\n *\n * @name asyncify\n * @static\n * @memberOf module:Utils\n * @method\n * @alias wrapSync\n * @category Util\n * @param {Function} func - The synchronous function, or Promise-returning\n * function to convert to an {@link AsyncFunction}.\n * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be\n * invoked with `(args..., callback)`.\n * @example\n *\n * // passing a regular synchronous function\n * async.waterfall([\n * async.apply(fs.readFile, filename, \"utf8\"),\n * async.asyncify(JSON.parse),\n * function (data, next) {\n * // data is the result of parsing the text.\n * // If there was a parsing error, it would have been caught.\n * }\n * ], callback);\n *\n * // passing a function returning a promise\n * async.waterfall([\n * async.apply(fs.readFile, filename, \"utf8\"),\n * async.asyncify(function (contents) {\n * return db.model.create(contents);\n * }),\n * function (model, next) {\n * // `model` is the instantiated model object.\n * // If there was an error, this function would be skipped.\n * }\n * ], callback);\n *\n * // es2017 example, though `asyncify` is not needed if your JS environment\n * // supports async functions out of the box\n * var q = async.queue(async.asyncify(async function(file) {\n * var intermediateStep = await processFile(file);\n * return await somePromise(intermediateStep)\n * }));\n *\n * q.push(files);\n */\nfunction asyncify(func) {\n if (isAsync(func)) {\n return function (...args/*, callback*/) {\n const callback = args.pop();\n const promise = func.apply(this, args);\n return handlePromise(promise, callback)\n }\n }\n\n return initialParams(function (args, callback) {\n var result;\n try {\n result = func.apply(this, args);\n } catch (e) {\n return callback(e);\n }\n // if result is Promise object\n if (result && typeof result.then === 'function') {\n return handlePromise(result, callback)\n } else {\n callback(null, result);\n }\n });\n}\n\nfunction handlePromise(promise, callback) {\n return promise.then(value => {\n invokeCallback(callback, null, value);\n }, err => {\n invokeCallback(callback, err && (err instanceof Error || err.message) ? err : new Error(err));\n });\n}\n\nfunction invokeCallback(callback, error, value) {\n try {\n callback(error, value);\n } catch (err) {\n setImmediate$1(e => { throw e }, err);\n }\n}\n\nfunction isAsync(fn) {\n return fn[Symbol.toStringTag] === 'AsyncFunction';\n}\n\nfunction isAsyncGenerator(fn) {\n return fn[Symbol.toStringTag] === 'AsyncGenerator';\n}\n\nfunction isAsyncIterable(obj) {\n return typeof obj[Symbol.asyncIterator] === 'function';\n}\n\nfunction wrapAsync(asyncFn) {\n if (typeof asyncFn !== 'function') throw new Error('expected a function')\n return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn;\n}\n\n// conditionally promisify a function.\n// only return a promise if a callback is omitted\nfunction awaitify (asyncFn, arity) {\n if (!arity) arity = asyncFn.length;\n if (!arity) throw new Error('arity is undefined')\n function awaitable (...args) {\n if (typeof args[arity - 1] === 'function') {\n return asyncFn.apply(this, args)\n }\n\n return new Promise((resolve, reject) => {\n args[arity - 1] = (err, ...cbArgs) => {\n if (err) return reject(err)\n resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]);\n };\n asyncFn.apply(this, args);\n })\n }\n\n return awaitable\n}\n\nfunction applyEach$1 (eachfn) {\n return function applyEach(fns, ...callArgs) {\n const go = awaitify(function (callback) {\n var that = this;\n return eachfn(fns, (fn, cb) => {\n wrapAsync(fn).apply(that, callArgs.concat(cb));\n }, callback);\n });\n return go;\n };\n}\n\nfunction _asyncMap(eachfn, arr, iteratee, callback) {\n arr = arr || [];\n var results = [];\n var counter = 0;\n var _iteratee = wrapAsync(iteratee);\n\n return eachfn(arr, (value, _, iterCb) => {\n var index = counter++;\n _iteratee(value, (err, v) => {\n results[index] = v;\n iterCb(err);\n });\n }, err => {\n callback(err, results);\n });\n}\n\nfunction isArrayLike(value) {\n return value &&\n typeof value.length === 'number' &&\n value.length >= 0 &&\n value.length % 1 === 0;\n}\n\n// A temporary value used to identify if the loop should be broken.\n// See #1064, #1293\nconst breakLoop = {};\n\nfunction once(fn) {\n function wrapper (...args) {\n if (fn === null) return;\n var callFn = fn;\n fn = null;\n callFn.apply(this, args);\n }\n Object.assign(wrapper, fn);\n return wrapper\n}\n\nfunction getIterator (coll) {\n return coll[Symbol.iterator] && coll[Symbol.iterator]();\n}\n\nfunction createArrayIterator(coll) {\n var i = -1;\n var len = coll.length;\n return function next() {\n return ++i < len ? {value: coll[i], key: i} : null;\n }\n}\n\nfunction createES2015Iterator(iterator) {\n var i = -1;\n return function next() {\n var item = iterator.next();\n if (item.done)\n return null;\n i++;\n return {value: item.value, key: i};\n }\n}\n\nfunction createObjectIterator(obj) {\n var okeys = obj ? Object.keys(obj) : [];\n var i = -1;\n var len = okeys.length;\n return function next() {\n var key = okeys[++i];\n if (key === '__proto__') {\n return next();\n }\n return i < len ? {value: obj[key], key} : null;\n };\n}\n\nfunction createIterator(coll) {\n if (isArrayLike(coll)) {\n return createArrayIterator(coll);\n }\n\n var iterator = getIterator(coll);\n return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);\n}\n\nfunction onlyOnce(fn) {\n return function (...args) {\n if (fn === null) throw new Error(\"Callback was already called.\");\n var callFn = fn;\n fn = null;\n callFn.apply(this, args);\n };\n}\n\n// for async generators\nfunction asyncEachOfLimit(generator, limit, iteratee, callback) {\n let done = false;\n let canceled = false;\n let awaiting = false;\n let running = 0;\n let idx = 0;\n\n function replenish() {\n //console.log('replenish')\n if (running >= limit || awaiting || done) return\n //console.log('replenish awaiting')\n awaiting = true;\n generator.next().then(({value, done: iterDone}) => {\n //console.log('got value', value)\n if (canceled || done) return\n awaiting = false;\n if (iterDone) {\n done = true;\n if (running <= 0) {\n //console.log('done nextCb')\n callback(null);\n }\n return;\n }\n running++;\n iteratee(value, idx, iterateeCallback);\n idx++;\n replenish();\n }).catch(handleError);\n }\n\n function iterateeCallback(err, result) {\n //console.log('iterateeCallback')\n running -= 1;\n if (canceled) return\n if (err) return handleError(err)\n\n if (err === false) {\n done = true;\n canceled = true;\n return\n }\n\n if (result === breakLoop || (done && running <= 0)) {\n done = true;\n //console.log('done iterCb')\n return callback(null);\n }\n replenish();\n }\n\n function handleError(err) {\n if (canceled) return\n awaiting = false;\n done = true;\n callback(err);\n }\n\n replenish();\n}\n\nvar eachOfLimit$2 = (limit) => {\n return (obj, iteratee, callback) => {\n callback = once(callback);\n if (limit <= 0) {\n throw new RangeError('concurrency limit cannot be less than 1')\n }\n if (!obj) {\n return callback(null);\n }\n if (isAsyncGenerator(obj)) {\n return asyncEachOfLimit(obj, limit, iteratee, callback)\n }\n if (isAsyncIterable(obj)) {\n return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback)\n }\n var nextElem = createIterator(obj);\n var done = false;\n var canceled = false;\n var running = 0;\n var looping = false;\n\n function iterateeCallback(err, value) {\n if (canceled) return\n running -= 1;\n if (err) {\n done = true;\n callback(err);\n }\n else if (err === false) {\n done = true;\n canceled = true;\n }\n else if (value === breakLoop || (done && running <= 0)) {\n done = true;\n return callback(null);\n }\n else if (!looping) {\n replenish();\n }\n }\n\n function replenish () {\n looping = true;\n while (running < limit && !done) {\n var elem = nextElem();\n if (elem === null) {\n done = true;\n if (running <= 0) {\n callback(null);\n }\n return;\n }\n running += 1;\n iteratee(elem.value, elem.key, onlyOnce(iterateeCallback));\n }\n looping = false;\n }\n\n replenish();\n };\n};\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name eachOfLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`. The `key` is the item's key, or index in the case of an\n * array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachOfLimit(coll, limit, iteratee, callback) {\n return eachOfLimit$2(limit)(coll, wrapAsync(iteratee), callback);\n}\n\nvar eachOfLimit$1 = awaitify(eachOfLimit, 4);\n\n// eachOf implementation optimized for array-likes\nfunction eachOfArrayLike(coll, iteratee, callback) {\n callback = once(callback);\n var index = 0,\n completed = 0,\n {length} = coll,\n canceled = false;\n if (length === 0) {\n callback(null);\n }\n\n function iteratorCallback(err, value) {\n if (err === false) {\n canceled = true;\n }\n if (canceled === true) return\n if (err) {\n callback(err);\n } else if ((++completed === length) || value === breakLoop) {\n callback(null);\n }\n }\n\n for (; index < length; index++) {\n iteratee(coll[index], index, onlyOnce(iteratorCallback));\n }\n}\n\n// a generic version of eachOf which can handle array, object, and iterator cases.\nfunction eachOfGeneric (coll, iteratee, callback) {\n return eachOfLimit$1(coll, Infinity, iteratee, callback);\n}\n\n/**\n * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument\n * to the iteratee.\n *\n * @name eachOf\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEachOf\n * @category Collection\n * @see [async.each]{@link module:Collections.each}\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each\n * item in `coll`.\n * The `key` is the item's key, or index in the case of an array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n * @example\n *\n * // dev.json is a file containing a valid json object config for dev environment\n * // dev.json is a file containing a valid json object config for test environment\n * // prod.json is a file containing a valid json object config for prod environment\n * // invalid.json is a file with a malformed json object\n *\n * let configs = {}; //global variable\n * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'};\n * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'};\n *\n * // asynchronous function that reads a json file and parses the contents as json object\n * function parseFile(file, key, callback) {\n * fs.readFile(file, \"utf8\", function(err, data) {\n * if (err) return calback(err);\n * try {\n * configs[key] = JSON.parse(data);\n * } catch (e) {\n * return callback(e);\n * }\n * callback();\n * });\n * }\n *\n * // Using callbacks\n * async.forEachOf(validConfigFileMap, parseFile, function (err) {\n * if (err) {\n * console.error(err);\n * } else {\n * console.log(configs);\n * // configs is now a map of JSON data, e.g.\n * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json}\n * }\n * });\n *\n * //Error handing\n * async.forEachOf(invalidConfigFileMap, parseFile, function (err) {\n * if (err) {\n * console.error(err);\n * // JSON parse error exception\n * } else {\n * console.log(configs);\n * }\n * });\n *\n * // Using Promises\n * async.forEachOf(validConfigFileMap, parseFile)\n * .then( () => {\n * console.log(configs);\n * // configs is now a map of JSON data, e.g.\n * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json}\n * }).catch( err => {\n * console.error(err);\n * });\n *\n * //Error handing\n * async.forEachOf(invalidConfigFileMap, parseFile)\n * .then( () => {\n * console.log(configs);\n * }).catch( err => {\n * console.error(err);\n * // JSON parse error exception\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.forEachOf(validConfigFileMap, parseFile);\n * console.log(configs);\n * // configs is now a map of JSON data, e.g.\n * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json}\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * //Error handing\n * async () => {\n * try {\n * let result = await async.forEachOf(invalidConfigFileMap, parseFile);\n * console.log(configs);\n * }\n * catch (err) {\n * console.log(err);\n * // JSON parse error exception\n * }\n * }\n *\n */\nfunction eachOf(coll, iteratee, callback) {\n var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric;\n return eachOfImplementation(coll, wrapAsync(iteratee), callback);\n}\n\nvar eachOf$1 = awaitify(eachOf, 3);\n\n/**\n * Produces a new collection of values by mapping each value in `coll` through\n * the `iteratee` function. The `iteratee` is called with an item from `coll`\n * and a callback for when it has finished processing. Each of these callbacks\n * takes 2 arguments: an `error`, and the transformed item from `coll`. If\n * `iteratee` passes an error to its callback, the main `callback` (for the\n * `map` function) is immediately called with the error.\n *\n * Note, that since this function applies the `iteratee` to each item in\n * parallel, there is no guarantee that the `iteratee` functions will complete\n * in order. However, the results array will be in the same order as the\n * original `coll`.\n *\n * If `map` is passed an Object, the results will be an Array. The results\n * will roughly be in the order of the original Objects' keys (but this can\n * vary across JavaScript engines).\n *\n * @name map\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an Array of the\n * transformed items from the `coll`. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * // file1.txt is a file that is 1000 bytes in size\n * // file2.txt is a file that is 2000 bytes in size\n * // file3.txt is a file that is 3000 bytes in size\n * // file4.txt does not exist\n *\n * const fileList = ['file1.txt','file2.txt','file3.txt'];\n * const withMissingFileList = ['file1.txt','file2.txt','file4.txt'];\n *\n * // asynchronous function that returns the file size in bytes\n * function getFileSizeInBytes(file, callback) {\n * fs.stat(file, function(err, stat) {\n * if (err) {\n * return callback(err);\n * }\n * callback(null, stat.size);\n * });\n * }\n *\n * // Using callbacks\n * async.map(fileList, getFileSizeInBytes, function(err, results) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(results);\n * // results is now an array of the file size in bytes for each file, e.g.\n * // [ 1000, 2000, 3000]\n * }\n * });\n *\n * // Error Handling\n * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) {\n * if (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * } else {\n * console.log(results);\n * }\n * });\n *\n * // Using Promises\n * async.map(fileList, getFileSizeInBytes)\n * .then( results => {\n * console.log(results);\n * // results is now an array of the file size in bytes for each file, e.g.\n * // [ 1000, 2000, 3000]\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Error Handling\n * async.map(withMissingFileList, getFileSizeInBytes)\n * .then( results => {\n * console.log(results);\n * }).catch( err => {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let results = await async.map(fileList, getFileSizeInBytes);\n * console.log(results);\n * // results is now an array of the file size in bytes for each file, e.g.\n * // [ 1000, 2000, 3000]\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // Error Handling\n * async () => {\n * try {\n * let results = await async.map(withMissingFileList, getFileSizeInBytes);\n * console.log(results);\n * }\n * catch (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * }\n * }\n *\n */\nfunction map (coll, iteratee, callback) {\n return _asyncMap(eachOf$1, coll, iteratee, callback)\n}\nvar map$1 = awaitify(map, 3);\n\n/**\n * Applies the provided arguments to each function in the array, calling\n * `callback` after all functions have completed. If you only provide the first\n * argument, `fns`, then it will return a function which lets you pass in the\n * arguments as if it were a single function call. If more arguments are\n * provided, `callback` is required while `args` is still optional. The results\n * for each of the applied async functions are passed to the final callback\n * as an array.\n *\n * @name applyEach\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s\n * to all call with the same arguments\n * @param {...*} [args] - any number of separate arguments to pass to the\n * function.\n * @param {Function} [callback] - the final argument should be the callback,\n * called when all functions have completed processing.\n * @returns {AsyncFunction} - Returns a function that takes no args other than\n * an optional callback, that is the result of applying the `args` to each\n * of the functions.\n * @example\n *\n * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket')\n *\n * appliedFn((err, results) => {\n * // results[0] is the results for `enableSearch`\n * // results[1] is the results for `updateSchema`\n * });\n *\n * // partial application example:\n * async.each(\n * buckets,\n * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(),\n * callback\n * );\n */\nvar applyEach = applyEach$1(map$1);\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time.\n *\n * @name eachOfSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfSeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachOfSeries(coll, iteratee, callback) {\n return eachOfLimit$1(coll, 1, iteratee, callback)\n}\nvar eachOfSeries$1 = awaitify(eachOfSeries, 3);\n\n/**\n * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time.\n *\n * @name mapSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an array of the\n * transformed items from the `coll`. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction mapSeries (coll, iteratee, callback) {\n return _asyncMap(eachOfSeries$1, coll, iteratee, callback)\n}\nvar mapSeries$1 = awaitify(mapSeries, 3);\n\n/**\n * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time.\n *\n * @name applyEachSeries\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.applyEach]{@link module:ControlFlow.applyEach}\n * @category Control Flow\n * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all\n * call with the same arguments\n * @param {...*} [args] - any number of separate arguments to pass to the\n * function.\n * @param {Function} [callback] - the final argument should be the callback,\n * called when all functions have completed processing.\n * @returns {AsyncFunction} - A function, that when called, is the result of\n * appling the `args` to the list of functions. It takes no args, other than\n * a callback.\n */\nvar applyEachSeries = applyEach$1(mapSeries$1);\n\nconst PROMISE_SYMBOL = Symbol('promiseCallback');\n\nfunction promiseCallback () {\n let resolve, reject;\n function callback (err, ...args) {\n if (err) return reject(err)\n resolve(args.length > 1 ? args : args[0]);\n }\n\n callback[PROMISE_SYMBOL] = new Promise((res, rej) => {\n resolve = res,\n reject = rej;\n });\n\n return callback\n}\n\n/**\n * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on\n * their requirements. Each function can optionally depend on other functions\n * being completed first, and each function is run as soon as its requirements\n * are satisfied.\n *\n * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence\n * will stop. Further tasks will not execute (so any other functions depending\n * on it will not run), and the main `callback` is immediately called with the\n * error.\n *\n * {@link AsyncFunction}s also receive an object containing the results of functions which\n * have completed so far as the first argument, if they have dependencies. If a\n * task function has no dependencies, it will only be passed a callback.\n *\n * @name auto\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Object} tasks - An object. Each of its properties is either a\n * function or an array of requirements, with the {@link AsyncFunction} itself the last item\n * in the array. The object's key of a property serves as the name of the task\n * defined by that property, i.e. can be used when specifying requirements for\n * other tasks. The function receives one or two arguments:\n * * a `results` object, containing the results of the previously executed\n * functions, only passed if the task has any dependencies,\n * * a `callback(err, result)` function, which must be called when finished,\n * passing an `error` (which can be `null`) and the result of the function's\n * execution.\n * @param {number} [concurrency=Infinity] - An optional `integer` for\n * determining the maximum number of tasks that can be run in parallel. By\n * default, as many as possible.\n * @param {Function} [callback] - An optional callback which is called when all\n * the tasks have been completed. It receives the `err` argument if any `tasks`\n * pass an error to their callback. Results are always returned; however, if an\n * error occurs, no further `tasks` will be performed, and the results object\n * will only contain partial results. Invoked with (err, results).\n * @returns {Promise} a promise, if a callback is not passed\n * @example\n *\n * //Using Callbacks\n * async.auto({\n * get_data: function(callback) {\n * // async code to get some data\n * callback(null, 'data', 'converted to array');\n * },\n * make_folder: function(callback) {\n * // async code to create a directory to store a file in\n * // this is run at the same time as getting the data\n * callback(null, 'folder');\n * },\n * write_file: ['get_data', 'make_folder', function(results, callback) {\n * // once there is some data and the directory exists,\n * // write the data to a file in the directory\n * callback(null, 'filename');\n * }],\n * email_link: ['write_file', function(results, callback) {\n * // once the file is written let's email a link to it...\n * callback(null, {'file':results.write_file, 'email':'user@example.com'});\n * }]\n * }, function(err, results) {\n * if (err) {\n * console.log('err = ', err);\n * }\n * console.log('results = ', results);\n * // results = {\n * // get_data: ['data', 'converted to array']\n * // make_folder; 'folder',\n * // write_file: 'filename'\n * // email_link: { file: 'filename', email: 'user@example.com' }\n * // }\n * });\n *\n * //Using Promises\n * async.auto({\n * get_data: function(callback) {\n * console.log('in get_data');\n * // async code to get some data\n * callback(null, 'data', 'converted to array');\n * },\n * make_folder: function(callback) {\n * console.log('in make_folder');\n * // async code to create a directory to store a file in\n * // this is run at the same time as getting the data\n * callback(null, 'folder');\n * },\n * write_file: ['get_data', 'make_folder', function(results, callback) {\n * // once there is some data and the directory exists,\n * // write the data to a file in the directory\n * callback(null, 'filename');\n * }],\n * email_link: ['write_file', function(results, callback) {\n * // once the file is written let's email a link to it...\n * callback(null, {'file':results.write_file, 'email':'user@example.com'});\n * }]\n * }).then(results => {\n * console.log('results = ', results);\n * // results = {\n * // get_data: ['data', 'converted to array']\n * // make_folder; 'folder',\n * // write_file: 'filename'\n * // email_link: { file: 'filename', email: 'user@example.com' }\n * // }\n * }).catch(err => {\n * console.log('err = ', err);\n * });\n *\n * //Using async/await\n * async () => {\n * try {\n * let results = await async.auto({\n * get_data: function(callback) {\n * // async code to get some data\n * callback(null, 'data', 'converted to array');\n * },\n * make_folder: function(callback) {\n * // async code to create a directory to store a file in\n * // this is run at the same time as getting the data\n * callback(null, 'folder');\n * },\n * write_file: ['get_data', 'make_folder', function(results, callback) {\n * // once there is some data and the directory exists,\n * // write the data to a file in the directory\n * callback(null, 'filename');\n * }],\n * email_link: ['write_file', function(results, callback) {\n * // once the file is written let's email a link to it...\n * callback(null, {'file':results.write_file, 'email':'user@example.com'});\n * }]\n * });\n * console.log('results = ', results);\n * // results = {\n * // get_data: ['data', 'converted to array']\n * // make_folder; 'folder',\n * // write_file: 'filename'\n * // email_link: { file: 'filename', email: 'user@example.com' }\n * // }\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction auto(tasks, concurrency, callback) {\n if (typeof concurrency !== 'number') {\n // concurrency is optional, shift the args.\n callback = concurrency;\n concurrency = null;\n }\n callback = once(callback || promiseCallback());\n var numTasks = Object.keys(tasks).length;\n if (!numTasks) {\n return callback(null);\n }\n if (!concurrency) {\n concurrency = numTasks;\n }\n\n var results = {};\n var runningTasks = 0;\n var canceled = false;\n var hasError = false;\n\n var listeners = Object.create(null);\n\n var readyTasks = [];\n\n // for cycle detection:\n var readyToCheck = []; // tasks that have been identified as reachable\n // without the possibility of returning to an ancestor task\n var uncheckedDependencies = {};\n\n Object.keys(tasks).forEach(key => {\n var task = tasks[key];\n if (!Array.isArray(task)) {\n // no dependencies\n enqueueTask(key, [task]);\n readyToCheck.push(key);\n return;\n }\n\n var dependencies = task.slice(0, task.length - 1);\n var remainingDependencies = dependencies.length;\n if (remainingDependencies === 0) {\n enqueueTask(key, task);\n readyToCheck.push(key);\n return;\n }\n uncheckedDependencies[key] = remainingDependencies;\n\n dependencies.forEach(dependencyName => {\n if (!tasks[dependencyName]) {\n throw new Error('async.auto task `' + key +\n '` has a non-existent dependency `' +\n dependencyName + '` in ' +\n dependencies.join(', '));\n }\n addListener(dependencyName, () => {\n remainingDependencies--;\n if (remainingDependencies === 0) {\n enqueueTask(key, task);\n }\n });\n });\n });\n\n checkForDeadlocks();\n processQueue();\n\n function enqueueTask(key, task) {\n readyTasks.push(() => runTask(key, task));\n }\n\n function processQueue() {\n if (canceled) return\n if (readyTasks.length === 0 && runningTasks === 0) {\n return callback(null, results);\n }\n while(readyTasks.length && runningTasks < concurrency) {\n var run = readyTasks.shift();\n run();\n }\n\n }\n\n function addListener(taskName, fn) {\n var taskListeners = listeners[taskName];\n if (!taskListeners) {\n taskListeners = listeners[taskName] = [];\n }\n\n taskListeners.push(fn);\n }\n\n function taskComplete(taskName) {\n var taskListeners = listeners[taskName] || [];\n taskListeners.forEach(fn => fn());\n processQueue();\n }\n\n\n function runTask(key, task) {\n if (hasError) return;\n\n var taskCallback = onlyOnce((err, ...result) => {\n runningTasks--;\n if (err === false) {\n canceled = true;\n return\n }\n if (result.length < 2) {\n [result] = result;\n }\n if (err) {\n var safeResults = {};\n Object.keys(results).forEach(rkey => {\n safeResults[rkey] = results[rkey];\n });\n safeResults[key] = result;\n hasError = true;\n listeners = Object.create(null);\n if (canceled) return\n callback(err, safeResults);\n } else {\n results[key] = result;\n taskComplete(key);\n }\n });\n\n runningTasks++;\n var taskFn = wrapAsync(task[task.length - 1]);\n if (task.length > 1) {\n taskFn(results, taskCallback);\n } else {\n taskFn(taskCallback);\n }\n }\n\n function checkForDeadlocks() {\n // Kahn's algorithm\n // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm\n // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html\n var currentTask;\n var counter = 0;\n while (readyToCheck.length) {\n currentTask = readyToCheck.pop();\n counter++;\n getDependents(currentTask).forEach(dependent => {\n if (--uncheckedDependencies[dependent] === 0) {\n readyToCheck.push(dependent);\n }\n });\n }\n\n if (counter !== numTasks) {\n throw new Error(\n 'async.auto cannot execute tasks due to a recursive dependency'\n );\n }\n }\n\n function getDependents(taskName) {\n var result = [];\n Object.keys(tasks).forEach(key => {\n const task = tasks[key];\n if (Array.isArray(task) && task.indexOf(taskName) >= 0) {\n result.push(key);\n }\n });\n return result;\n }\n\n return callback[PROMISE_SYMBOL]\n}\n\nvar FN_ARGS = /^(?:async\\s)?(?:function)?\\s*(?:\\w+\\s*)?\\(([^)]+)\\)(?:\\s*{)/;\nvar ARROW_FN_ARGS = /^(?:async\\s)?\\s*(?:\\(\\s*)?((?:[^)=\\s]\\s*)*)(?:\\)\\s*)?=>/;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /(=.+)?(\\s*)$/;\n\nfunction stripComments(string) {\n let stripped = '';\n let index = 0;\n let endBlockComment = string.indexOf('*/');\n while (index < string.length) {\n if (string[index] === '/' && string[index+1] === '/') {\n // inline comment\n let endIndex = string.indexOf('\\n', index);\n index = (endIndex === -1) ? string.length : endIndex;\n } else if ((endBlockComment !== -1) && (string[index] === '/') && (string[index+1] === '*')) {\n // block comment\n let endIndex = string.indexOf('*/', index);\n if (endIndex !== -1) {\n index = endIndex + 2;\n endBlockComment = string.indexOf('*/', index);\n } else {\n stripped += string[index];\n index++;\n }\n } else {\n stripped += string[index];\n index++;\n }\n }\n return stripped;\n}\n\nfunction parseParams(func) {\n const src = stripComments(func.toString());\n let match = src.match(FN_ARGS);\n if (!match) {\n match = src.match(ARROW_FN_ARGS);\n }\n if (!match) throw new Error('could not parse args in autoInject\\nSource:\\n' + src)\n let [, args] = match;\n return args\n .replace(/\\s/g, '')\n .split(FN_ARG_SPLIT)\n .map((arg) => arg.replace(FN_ARG, '').trim());\n}\n\n/**\n * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent\n * tasks are specified as parameters to the function, after the usual callback\n * parameter, with the parameter names matching the names of the tasks it\n * depends on. This can provide even more readable task graphs which can be\n * easier to maintain.\n *\n * If a final callback is specified, the task results are similarly injected,\n * specified as named parameters after the initial error parameter.\n *\n * The autoInject function is purely syntactic sugar and its semantics are\n * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}.\n *\n * @name autoInject\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.auto]{@link module:ControlFlow.auto}\n * @category Control Flow\n * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of\n * the form 'func([dependencies...], callback). The object's key of a property\n * serves as the name of the task defined by that property, i.e. can be used\n * when specifying requirements for other tasks.\n * * The `callback` parameter is a `callback(err, result)` which must be called\n * when finished, passing an `error` (which can be `null`) and the result of\n * the function's execution. The remaining parameters name other tasks on\n * which the task is dependent, and the results from those tasks are the\n * arguments of those parameters.\n * @param {Function} [callback] - An optional callback which is called when all\n * the tasks have been completed. It receives the `err` argument if any `tasks`\n * pass an error to their callback, and a `results` object with any completed\n * task results, similar to `auto`.\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * // The example from `auto` can be rewritten as follows:\n * async.autoInject({\n * get_data: function(callback) {\n * // async code to get some data\n * callback(null, 'data', 'converted to array');\n * },\n * make_folder: function(callback) {\n * // async code to create a directory to store a file in\n * // this is run at the same time as getting the data\n * callback(null, 'folder');\n * },\n * write_file: function(get_data, make_folder, callback) {\n * // once there is some data and the directory exists,\n * // write the data to a file in the directory\n * callback(null, 'filename');\n * },\n * email_link: function(write_file, callback) {\n * // once the file is written let's email a link to it...\n * // write_file contains the filename returned by write_file.\n * callback(null, {'file':write_file, 'email':'user@example.com'});\n * }\n * }, function(err, results) {\n * console.log('err = ', err);\n * console.log('email_link = ', results.email_link);\n * });\n *\n * // If you are using a JS minifier that mangles parameter names, `autoInject`\n * // will not work with plain functions, since the parameter names will be\n * // collapsed to a single letter identifier. To work around this, you can\n * // explicitly specify the names of the parameters your task function needs\n * // in an array, similar to Angular.js dependency injection.\n *\n * // This still has an advantage over plain `auto`, since the results a task\n * // depends on are still spread into arguments.\n * async.autoInject({\n * //...\n * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) {\n * callback(null, 'filename');\n * }],\n * email_link: ['write_file', function(write_file, callback) {\n * callback(null, {'file':write_file, 'email':'user@example.com'});\n * }]\n * //...\n * }, function(err, results) {\n * console.log('err = ', err);\n * console.log('email_link = ', results.email_link);\n * });\n */\nfunction autoInject(tasks, callback) {\n var newTasks = {};\n\n Object.keys(tasks).forEach(key => {\n var taskFn = tasks[key];\n var params;\n var fnIsAsync = isAsync(taskFn);\n var hasNoDeps =\n (!fnIsAsync && taskFn.length === 1) ||\n (fnIsAsync && taskFn.length === 0);\n\n if (Array.isArray(taskFn)) {\n params = [...taskFn];\n taskFn = params.pop();\n\n newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn);\n } else if (hasNoDeps) {\n // no dependencies, use the function as-is\n newTasks[key] = taskFn;\n } else {\n params = parseParams(taskFn);\n if ((taskFn.length === 0 && !fnIsAsync) && params.length === 0) {\n throw new Error(\"autoInject task functions require explicit parameters.\");\n }\n\n // remove callback param\n if (!fnIsAsync) params.pop();\n\n newTasks[key] = params.concat(newTask);\n }\n\n function newTask(results, taskCb) {\n var newArgs = params.map(name => results[name]);\n newArgs.push(taskCb);\n wrapAsync(taskFn)(...newArgs);\n }\n });\n\n return auto(newTasks, callback);\n}\n\n// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation\n// used for queues. This implementation assumes that the node provided by the user can be modified\n// to adjust the next and last properties. We implement only the minimal functionality\n// for queue support.\nclass DLL {\n constructor() {\n this.head = this.tail = null;\n this.length = 0;\n }\n\n removeLink(node) {\n if (node.prev) node.prev.next = node.next;\n else this.head = node.next;\n if (node.next) node.next.prev = node.prev;\n else this.tail = node.prev;\n\n node.prev = node.next = null;\n this.length -= 1;\n return node;\n }\n\n empty () {\n while(this.head) this.shift();\n return this;\n }\n\n insertAfter(node, newNode) {\n newNode.prev = node;\n newNode.next = node.next;\n if (node.next) node.next.prev = newNode;\n else this.tail = newNode;\n node.next = newNode;\n this.length += 1;\n }\n\n insertBefore(node, newNode) {\n newNode.prev = node.prev;\n newNode.next = node;\n if (node.prev) node.prev.next = newNode;\n else this.head = newNode;\n node.prev = newNode;\n this.length += 1;\n }\n\n unshift(node) {\n if (this.head) this.insertBefore(this.head, node);\n else setInitial(this, node);\n }\n\n push(node) {\n if (this.tail) this.insertAfter(this.tail, node);\n else setInitial(this, node);\n }\n\n shift() {\n return this.head && this.removeLink(this.head);\n }\n\n pop() {\n return this.tail && this.removeLink(this.tail);\n }\n\n toArray() {\n return [...this]\n }\n\n *[Symbol.iterator] () {\n var cur = this.head;\n while (cur) {\n yield cur.data;\n cur = cur.next;\n }\n }\n\n remove (testFn) {\n var curr = this.head;\n while(curr) {\n var {next} = curr;\n if (testFn(curr)) {\n this.removeLink(curr);\n }\n curr = next;\n }\n return this;\n }\n}\n\nfunction setInitial(dll, node) {\n dll.length = 1;\n dll.head = dll.tail = node;\n}\n\nfunction queue$1(worker, concurrency, payload) {\n if (concurrency == null) {\n concurrency = 1;\n }\n else if(concurrency === 0) {\n throw new RangeError('Concurrency must not be zero');\n }\n\n var _worker = wrapAsync(worker);\n var numRunning = 0;\n var workersList = [];\n const events = {\n error: [],\n drain: [],\n saturated: [],\n unsaturated: [],\n empty: []\n };\n\n function on (event, handler) {\n events[event].push(handler);\n }\n\n function once (event, handler) {\n const handleAndRemove = (...args) => {\n off(event, handleAndRemove);\n handler(...args);\n };\n events[event].push(handleAndRemove);\n }\n\n function off (event, handler) {\n if (!event) return Object.keys(events).forEach(ev => events[ev] = [])\n if (!handler) return events[event] = []\n events[event] = events[event].filter(ev => ev !== handler);\n }\n\n function trigger (event, ...args) {\n events[event].forEach(handler => handler(...args));\n }\n\n var processingScheduled = false;\n function _insert(data, insertAtFront, rejectOnError, callback) {\n if (callback != null && typeof callback !== 'function') {\n throw new Error('task callback must be a function');\n }\n q.started = true;\n\n var res, rej;\n function promiseCallback (err, ...args) {\n // we don't care about the error, let the global error handler\n // deal with it\n if (err) return rejectOnError ? rej(err) : res()\n if (args.length <= 1) return res(args[0])\n res(args);\n }\n\n var item = q._createTaskItem(\n data,\n rejectOnError ? promiseCallback :\n (callback || promiseCallback)\n );\n\n if (insertAtFront) {\n q._tasks.unshift(item);\n } else {\n q._tasks.push(item);\n }\n\n if (!processingScheduled) {\n processingScheduled = true;\n setImmediate$1(() => {\n processingScheduled = false;\n q.process();\n });\n }\n\n if (rejectOnError || !callback) {\n return new Promise((resolve, reject) => {\n res = resolve;\n rej = reject;\n })\n }\n }\n\n function _createCB(tasks) {\n return function (err, ...args) {\n numRunning -= 1;\n\n for (var i = 0, l = tasks.length; i < l; i++) {\n var task = tasks[i];\n\n var index = workersList.indexOf(task);\n if (index === 0) {\n workersList.shift();\n } else if (index > 0) {\n workersList.splice(index, 1);\n }\n\n task.callback(err, ...args);\n\n if (err != null) {\n trigger('error', err, task.data);\n }\n }\n\n if (numRunning <= (q.concurrency - q.buffer) ) {\n trigger('unsaturated');\n }\n\n if (q.idle()) {\n trigger('drain');\n }\n q.process();\n };\n }\n\n function _maybeDrain(data) {\n if (data.length === 0 && q.idle()) {\n // call drain immediately if there are no tasks\n setImmediate$1(() => trigger('drain'));\n return true\n }\n return false\n }\n\n const eventMethod = (name) => (handler) => {\n if (!handler) {\n return new Promise((resolve, reject) => {\n once(name, (err, data) => {\n if (err) return reject(err)\n resolve(data);\n });\n })\n }\n off(name);\n on(name, handler);\n\n };\n\n var isProcessing = false;\n var q = {\n _tasks: new DLL(),\n _createTaskItem (data, callback) {\n return {\n data,\n callback\n };\n },\n *[Symbol.iterator] () {\n yield* q._tasks[Symbol.iterator]();\n },\n concurrency,\n payload,\n buffer: concurrency / 4,\n started: false,\n paused: false,\n push (data, callback) {\n if (Array.isArray(data)) {\n if (_maybeDrain(data)) return\n return data.map(datum => _insert(datum, false, false, callback))\n }\n return _insert(data, false, false, callback);\n },\n pushAsync (data, callback) {\n if (Array.isArray(data)) {\n if (_maybeDrain(data)) return\n return data.map(datum => _insert(datum, false, true, callback))\n }\n return _insert(data, false, true, callback);\n },\n kill () {\n off();\n q._tasks.empty();\n },\n unshift (data, callback) {\n if (Array.isArray(data)) {\n if (_maybeDrain(data)) return\n return data.map(datum => _insert(datum, true, false, callback))\n }\n return _insert(data, true, false, callback);\n },\n unshiftAsync (data, callback) {\n if (Array.isArray(data)) {\n if (_maybeDrain(data)) return\n return data.map(datum => _insert(datum, true, true, callback))\n }\n return _insert(data, true, true, callback);\n },\n remove (testFn) {\n q._tasks.remove(testFn);\n },\n process () {\n // Avoid trying to start too many processing operations. This can occur\n // when callbacks resolve synchronously (#1267).\n if (isProcessing) {\n return;\n }\n isProcessing = true;\n while(!q.paused && numRunning < q.concurrency && q._tasks.length){\n var tasks = [], data = [];\n var l = q._tasks.length;\n if (q.payload) l = Math.min(l, q.payload);\n for (var i = 0; i < l; i++) {\n var node = q._tasks.shift();\n tasks.push(node);\n workersList.push(node);\n data.push(node.data);\n }\n\n numRunning += 1;\n\n if (q._tasks.length === 0) {\n trigger('empty');\n }\n\n if (numRunning === q.concurrency) {\n trigger('saturated');\n }\n\n var cb = onlyOnce(_createCB(tasks));\n _worker(data, cb);\n }\n isProcessing = false;\n },\n length () {\n return q._tasks.length;\n },\n running () {\n return numRunning;\n },\n workersList () {\n return workersList;\n },\n idle() {\n return q._tasks.length + numRunning === 0;\n },\n pause () {\n q.paused = true;\n },\n resume () {\n if (q.paused === false) { return; }\n q.paused = false;\n setImmediate$1(q.process);\n }\n };\n // define these as fixed properties, so people get useful errors when updating\n Object.defineProperties(q, {\n saturated: {\n writable: false,\n value: eventMethod('saturated')\n },\n unsaturated: {\n writable: false,\n value: eventMethod('unsaturated')\n },\n empty: {\n writable: false,\n value: eventMethod('empty')\n },\n drain: {\n writable: false,\n value: eventMethod('drain')\n },\n error: {\n writable: false,\n value: eventMethod('error')\n },\n });\n return q;\n}\n\n/**\n * Creates a `cargo` object with the specified payload. Tasks added to the\n * cargo will be processed altogether (up to the `payload` limit). If the\n * `worker` is in progress, the task is queued until it becomes available. Once\n * the `worker` has completed some tasks, each callback of those tasks is\n * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966)\n * for how `cargo` and `queue` work.\n *\n * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers\n * at a time, cargo passes an array of tasks to a single worker, repeating\n * when the worker is finished.\n *\n * @name cargo\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @category Control Flow\n * @param {AsyncFunction} worker - An asynchronous function for processing an array\n * of queued tasks. Invoked with `(tasks, callback)`.\n * @param {number} [payload=Infinity] - An optional `integer` for determining\n * how many tasks should be processed per round; if omitted, the default is\n * unlimited.\n * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can\n * attached as certain properties to listen for specific events during the\n * lifecycle of the cargo and inner queue.\n * @example\n *\n * // create a cargo object with payload 2\n * var cargo = async.cargo(function(tasks, callback) {\n * for (var i=0; i<tasks.length; i++) {\n * console.log('hello ' + tasks[i].name);\n * }\n * callback();\n * }, 2);\n *\n * // add some items\n * cargo.push({name: 'foo'}, function(err) {\n * console.log('finished processing foo');\n * });\n * cargo.push({name: 'bar'}, function(err) {\n * console.log('finished processing bar');\n * });\n * await cargo.push({name: 'baz'});\n * console.log('finished processing baz');\n */\nfunction cargo$1(worker, payload) {\n return queue$1(worker, 1, payload);\n}\n\n/**\n * Creates a `cargoQueue` object with the specified payload. Tasks added to the\n * cargoQueue will be processed together (up to the `payload` limit) in `concurrency` parallel workers.\n * If the all `workers` are in progress, the task is queued until one becomes available. Once\n * a `worker` has completed some tasks, each callback of those tasks is\n * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966)\n * for how `cargo` and `queue` work.\n *\n * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers\n * at a time, and [`cargo`]{@link module:ControlFlow.cargo} passes an array of tasks to a single worker,\n * the cargoQueue passes an array of tasks to multiple parallel workers.\n *\n * @name cargoQueue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @see [async.cargo]{@link module:ControlFLow.cargo}\n * @category Control Flow\n * @param {AsyncFunction} worker - An asynchronous function for processing an array\n * of queued tasks. Invoked with `(tasks, callback)`.\n * @param {number} [concurrency=1] - An `integer` for determining how many\n * `worker` functions should be run in parallel. If omitted, the concurrency\n * defaults to `1`. If the concurrency is `0`, an error is thrown.\n * @param {number} [payload=Infinity] - An optional `integer` for determining\n * how many tasks should be processed per round; if omitted, the default is\n * unlimited.\n * @returns {module:ControlFlow.QueueObject} A cargoQueue object to manage the tasks. Callbacks can\n * attached as certain properties to listen for specific events during the\n * lifecycle of the cargoQueue and inner queue.\n * @example\n *\n * // create a cargoQueue object with payload 2 and concurrency 2\n * var cargoQueue = async.cargoQueue(function(tasks, callback) {\n * for (var i=0; i<tasks.length; i++) {\n * console.log('hello ' + tasks[i].name);\n * }\n * callback();\n * }, 2, 2);\n *\n * // add some items\n * cargoQueue.push({name: 'foo'}, function(err) {\n * console.log('finished processing foo');\n * });\n * cargoQueue.push({name: 'bar'}, function(err) {\n * console.log('finished processing bar');\n * });\n * cargoQueue.push({name: 'baz'}, function(err) {\n * console.log('finished processing baz');\n * });\n * cargoQueue.push({name: 'boo'}, function(err) {\n * console.log('finished processing boo');\n * });\n */\nfunction cargo(worker, concurrency, payload) {\n return queue$1(worker, concurrency, payload);\n}\n\n/**\n * Reduces `coll` into a single value using an async `iteratee` to return each\n * successive step. `memo` is the initial state of the reduction. This function\n * only operates in series.\n *\n * For performance reasons, it may make sense to split a call to this function\n * into a parallel map, and then use the normal `Array.prototype.reduce` on the\n * results. This function is for situations where each step in the reduction\n * needs to be async; if you can get the data before reducing it, then it's\n * probably a good idea to do so.\n *\n * @name reduce\n * @static\n * @memberOf module:Collections\n * @method\n * @alias inject\n * @alias foldl\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee completes with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * // file1.txt is a file that is 1000 bytes in size\n * // file2.txt is a file that is 2000 bytes in size\n * // file3.txt is a file that is 3000 bytes in size\n * // file4.txt does not exist\n *\n * const fileList = ['file1.txt','file2.txt','file3.txt'];\n * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt'];\n *\n * // asynchronous function that computes the file size in bytes\n * // file size is added to the memoized value, then returned\n * function getFileSizeInBytes(memo, file, callback) {\n * fs.stat(file, function(err, stat) {\n * if (err) {\n * return callback(err);\n * }\n * callback(null, memo + stat.size);\n * });\n * }\n *\n * // Using callbacks\n * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(result);\n * // 6000\n * // which is the sum of the file sizes of the three files\n * }\n * });\n *\n * // Error Handling\n * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) {\n * if (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * } else {\n * console.log(result);\n * }\n * });\n *\n * // Using Promises\n * async.reduce(fileList, 0, getFileSizeInBytes)\n * .then( result => {\n * console.log(result);\n * // 6000\n * // which is the sum of the file sizes of the three files\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Error Handling\n * async.reduce(withMissingFileList, 0, getFileSizeInBytes)\n * .then( result => {\n * console.log(result);\n * }).catch( err => {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.reduce(fileList, 0, getFileSizeInBytes);\n * console.log(result);\n * // 6000\n * // which is the sum of the file sizes of the three files\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // Error Handling\n * async () => {\n * try {\n * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes);\n * console.log(result);\n * }\n * catch (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * }\n * }\n *\n */\nfunction reduce(coll, memo, iteratee, callback) {\n callback = once(callback);\n var _iteratee = wrapAsync(iteratee);\n return eachOfSeries$1(coll, (x, i, iterCb) => {\n _iteratee(memo, x, (err, v) => {\n memo = v;\n iterCb(err);\n });\n }, err => callback(err, memo));\n}\nvar reduce$1 = awaitify(reduce, 4);\n\n/**\n * Version of the compose function that is more natural to read. Each function\n * consumes the return value of the previous function. It is the equivalent of\n * [compose]{@link module:ControlFlow.compose} with the arguments reversed.\n *\n * Each function is executed with the `this` binding of the composed function.\n *\n * @name seq\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.compose]{@link module:ControlFlow.compose}\n * @category Control Flow\n * @param {...AsyncFunction} functions - the asynchronous functions to compose\n * @returns {Function} a function that composes the `functions` in order\n * @example\n *\n * // Requires lodash (or underscore), express3 and dresende's orm2.\n * // Part of an app, that fetches cats of the logged user.\n * // This example uses `seq` function to avoid overnesting and error\n * // handling clutter.\n * app.get('/cats', function(request, response) {\n * var User = request.models.User;\n * async.seq(\n * User.get.bind(User), // 'User.get' has signature (id, callback(err, data))\n * function(user, fn) {\n * user.getCats(fn); // 'getCats' has signature (callback(err, data))\n * }\n * )(req.session.user_id, function (err, cats) {\n * if (err) {\n * console.error(err);\n * response.json({ status: 'error', message: err.message });\n * } else {\n * response.json({ status: 'ok', message: 'Cats found', data: cats });\n * }\n * });\n * });\n */\nfunction seq(...functions) {\n var _functions = functions.map(wrapAsync);\n return function (...args) {\n var that = this;\n\n var cb = args[args.length - 1];\n if (typeof cb == 'function') {\n args.pop();\n } else {\n cb = promiseCallback();\n }\n\n reduce$1(_functions, args, (newargs, fn, iterCb) => {\n fn.apply(that, newargs.concat((err, ...nextargs) => {\n iterCb(err, nextargs);\n }));\n },\n (err, results) => cb(err, ...results));\n\n return cb[PROMISE_SYMBOL]\n };\n}\n\n/**\n * Creates a function which is a composition of the passed asynchronous\n * functions. Each function consumes the return value of the function that\n * follows. Composing functions `f()`, `g()`, and `h()` would produce the result\n * of `f(g(h()))`, only this version uses callbacks to obtain the return values.\n *\n * If the last argument to the composed function is not a function, a promise\n * is returned when you call it.\n *\n * Each function is executed with the `this` binding of the composed function.\n *\n * @name compose\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {...AsyncFunction} functions - the asynchronous functions to compose\n * @returns {Function} an asynchronous function that is the composed\n * asynchronous `functions`\n * @example\n *\n * function add1(n, callback) {\n * setTimeout(function () {\n * callback(null, n + 1);\n * }, 10);\n * }\n *\n * function mul3(n, callback) {\n * setTimeout(function () {\n * callback(null, n * 3);\n * }, 10);\n * }\n *\n * var add1mul3 = async.compose(mul3, add1);\n * add1mul3(4, function (err, result) {\n * // result now equals 15\n * });\n */\nfunction compose(...args) {\n return seq(...args.reverse());\n}\n\n/**\n * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time.\n *\n * @name mapLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an array of the\n * transformed items from the `coll`. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction mapLimit (coll, limit, iteratee, callback) {\n return _asyncMap(eachOfLimit$2(limit), coll, iteratee, callback)\n}\nvar mapLimit$1 = awaitify(mapLimit, 4);\n\n/**\n * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time.\n *\n * @name concatLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.concat]{@link module:Collections.concat}\n * @category Collection\n * @alias flatMapLimit\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,\n * which should use an array as its result. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n * @returns A Promise, if no callback is passed\n */\nfunction concatLimit(coll, limit, iteratee, callback) {\n var _iteratee = wrapAsync(iteratee);\n return mapLimit$1(coll, limit, (val, iterCb) => {\n _iteratee(val, (err, ...args) => {\n if (err) return iterCb(err);\n return iterCb(err, args);\n });\n }, (err, mapResults) => {\n var result = [];\n for (var i = 0; i < mapResults.length; i++) {\n if (mapResults[i]) {\n result = result.concat(...mapResults[i]);\n }\n }\n\n return callback(err, result);\n });\n}\nvar concatLimit$1 = awaitify(concatLimit, 4);\n\n/**\n * Applies `iteratee` to each item in `coll`, concatenating the results. Returns\n * the concatenated list. The `iteratee`s are called in parallel, and the\n * results are concatenated as they return. The results array will be returned in\n * the original order of `coll` passed to the `iteratee` function.\n *\n * @name concat\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @alias flatMap\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,\n * which should use an array as its result. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n * @returns A Promise, if no callback is passed\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n * // dir4 does not exist\n *\n * let directoryList = ['dir1','dir2','dir3'];\n * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4'];\n *\n * // Using callbacks\n * async.concat(directoryList, fs.readdir, function(err, results) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(results);\n * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ]\n * }\n * });\n *\n * // Error Handling\n * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) {\n * if (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * // since dir4 does not exist\n * } else {\n * console.log(results);\n * }\n * });\n *\n * // Using Promises\n * async.concat(directoryList, fs.readdir)\n * .then(results => {\n * console.log(results);\n * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ]\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // Error Handling\n * async.concat(withMissingDirectoryList, fs.readdir)\n * .then(results => {\n * console.log(results);\n * }).catch(err => {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * // since dir4 does not exist\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let results = await async.concat(directoryList, fs.readdir);\n * console.log(results);\n * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ]\n * } catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // Error Handling\n * async () => {\n * try {\n * let results = await async.concat(withMissingDirectoryList, fs.readdir);\n * console.log(results);\n * } catch (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * // since dir4 does not exist\n * }\n * }\n *\n */\nfunction concat(coll, iteratee, callback) {\n return concatLimit$1(coll, Infinity, iteratee, callback)\n}\nvar concat$1 = awaitify(concat, 3);\n\n/**\n * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time.\n *\n * @name concatSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.concat]{@link module:Collections.concat}\n * @category Collection\n * @alias flatMapSeries\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`.\n * The iteratee should complete with an array an array of results.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n * @returns A Promise, if no callback is passed\n */\nfunction concatSeries(coll, iteratee, callback) {\n return concatLimit$1(coll, 1, iteratee, callback)\n}\nvar concatSeries$1 = awaitify(concatSeries, 3);\n\n/**\n * Returns a function that when called, calls-back with the values provided.\n * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to\n * [`auto`]{@link module:ControlFlow.auto}.\n *\n * @name constant\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {...*} arguments... - Any number of arguments to automatically invoke\n * callback with.\n * @returns {AsyncFunction} Returns a function that when invoked, automatically\n * invokes the callback with the previous given arguments.\n * @example\n *\n * async.waterfall([\n * async.constant(42),\n * function (value, next) {\n * // value === 42\n * },\n * //...\n * ], callback);\n *\n * async.waterfall([\n * async.constant(filename, \"utf8\"),\n * fs.readFile,\n * function (fileData, next) {\n * //...\n * }\n * //...\n * ], callback);\n *\n * async.auto({\n * hostname: async.constant(\"https://server.net/\"),\n * port: findFreePort,\n * launchServer: [\"hostname\", \"port\", function (options, cb) {\n * startServer(options, cb);\n * }],\n * //...\n * }, callback);\n */\nfunction constant$1(...args) {\n return function (...ignoredArgs/*, callback*/) {\n var callback = ignoredArgs.pop();\n return callback(null, ...args);\n };\n}\n\nfunction _createTester(check, getResult) {\n return (eachfn, arr, _iteratee, cb) => {\n var testPassed = false;\n var testResult;\n const iteratee = wrapAsync(_iteratee);\n eachfn(arr, (value, _, callback) => {\n iteratee(value, (err, result) => {\n if (err || err === false) return callback(err);\n\n if (check(result) && !testResult) {\n testPassed = true;\n testResult = getResult(true, value);\n return callback(null, breakLoop);\n }\n callback();\n });\n }, err => {\n if (err) return cb(err);\n cb(null, testPassed ? testResult : getResult(false));\n });\n };\n}\n\n/**\n * Returns the first value in `coll` that passes an async truth test. The\n * `iteratee` is applied in parallel, meaning the first iteratee to return\n * `true` will fire the detect `callback` with that result. That means the\n * result might not be the first item in the original `coll` (in terms of order)\n * that passes the test.\n\n * If order within the original `coll` is important, then look at\n * [`detectSeries`]{@link module:Collections.detectSeries}.\n *\n * @name detect\n * @static\n * @memberOf module:Collections\n * @method\n * @alias find\n * @category Collections\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n * @returns {Promise} a promise, if a callback is omitted\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n *\n * // asynchronous function that checks if a file exists\n * function fileExists(file, callback) {\n * fs.access(file, fs.constants.F_OK, (err) => {\n * callback(null, !err);\n * });\n * }\n *\n * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists,\n * function(err, result) {\n * console.log(result);\n * // dir1/file1.txt\n * // result now equals the first file in the list that exists\n * }\n *);\n *\n * // Using Promises\n * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists)\n * .then(result => {\n * console.log(result);\n * // dir1/file1.txt\n * // result now equals the first file in the list that exists\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists);\n * console.log(result);\n * // dir1/file1.txt\n * // result now equals the file in the list that exists\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction detect(coll, iteratee, callback) {\n return _createTester(bool => bool, (res, item) => item)(eachOf$1, coll, iteratee, callback)\n}\nvar detect$1 = awaitify(detect, 3);\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name detectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findLimit\n * @category Collections\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction detectLimit(coll, limit, iteratee, callback) {\n return _createTester(bool => bool, (res, item) => item)(eachOfLimit$2(limit), coll, iteratee, callback)\n}\nvar detectLimit$1 = awaitify(detectLimit, 4);\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time.\n *\n * @name detectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findSeries\n * @category Collections\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction detectSeries(coll, iteratee, callback) {\n return _createTester(bool => bool, (res, item) => item)(eachOfLimit$2(1), coll, iteratee, callback)\n}\n\nvar detectSeries$1 = awaitify(detectSeries, 3);\n\nfunction consoleFunc(name) {\n return (fn, ...args) => wrapAsync(fn)(...args, (err, ...resultArgs) => {\n /* istanbul ignore else */\n if (typeof console === 'object') {\n /* istanbul ignore else */\n if (err) {\n /* istanbul ignore else */\n if (console.error) {\n console.error(err);\n }\n } else if (console[name]) { /* istanbul ignore else */\n resultArgs.forEach(x => console[name](x));\n }\n }\n })\n}\n\n/**\n * Logs the result of an [`async` function]{@link AsyncFunction} to the\n * `console` using `console.dir` to display the properties of the resulting object.\n * Only works in Node.js or in browsers that support `console.dir` and\n * `console.error` (such as FF and Chrome).\n * If multiple arguments are returned from the async function,\n * `console.dir` is called on each argument in order.\n *\n * @name dir\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} function - The function you want to eventually apply\n * all arguments to.\n * @param {...*} arguments... - Any number of arguments to apply to the function.\n * @example\n *\n * // in a module\n * var hello = function(name, callback) {\n * setTimeout(function() {\n * callback(null, {hello: name});\n * }, 1000);\n * };\n *\n * // in the node repl\n * node> async.dir(hello, 'world');\n * {hello: 'world'}\n */\nvar dir = consoleFunc('dir');\n\n/**\n * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in\n * the order of operations, the arguments `test` and `iteratee` are switched.\n *\n * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n *\n * @name doWhilst\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {AsyncFunction} iteratee - A function which is called each time `test`\n * passes. Invoked with (callback).\n * @param {AsyncFunction} test - asynchronous truth test to perform after each\n * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the\n * non-error args from the previous callback of `iteratee`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `iteratee` has stopped.\n * `callback` will be passed an error and any arguments passed to the final\n * `iteratee`'s callback. Invoked with (err, [results]);\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction doWhilst(iteratee, test, callback) {\n callback = onlyOnce(callback);\n var _fn = wrapAsync(iteratee);\n var _test = wrapAsync(test);\n var results;\n\n function next(err, ...args) {\n if (err) return callback(err);\n if (err === false) return;\n results = args;\n _test(...args, check);\n }\n\n function check(err, truth) {\n if (err) return callback(err);\n if (err === false) return;\n if (!truth) return callback(null, ...results);\n _fn(next);\n }\n\n return check(null, true);\n}\n\nvar doWhilst$1 = awaitify(doWhilst, 3);\n\n/**\n * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the\n * argument ordering differs from `until`.\n *\n * @name doUntil\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.doWhilst]{@link module:ControlFlow.doWhilst}\n * @category Control Flow\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` fails. Invoked with (callback).\n * @param {AsyncFunction} test - asynchronous truth test to perform after each\n * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the\n * non-error args from the previous callback of `iteratee`\n * @param {Function} [callback] - A callback which is called after the test\n * function has passed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction doUntil(iteratee, test, callback) {\n const _test = wrapAsync(test);\n return doWhilst$1(iteratee, (...args) => {\n const cb = args.pop();\n _test(...args, (err, truth) => cb (err, !truth));\n }, callback);\n}\n\nfunction _withoutIndex(iteratee) {\n return (value, index, callback) => iteratee(value, callback);\n}\n\n/**\n * Applies the function `iteratee` to each item in `coll`, in parallel.\n * The `iteratee` is called with an item from the list, and a callback for when\n * it has finished. If the `iteratee` passes an error to its `callback`, the\n * main `callback` (for the `each` function) is immediately called with the\n * error.\n *\n * Note, that since this function applies `iteratee` to each item in parallel,\n * there is no guarantee that the iteratee functions will complete in order.\n *\n * @name each\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEach\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to\n * each item in `coll`. Invoked with (item, callback).\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOf`.\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n * // dir4 does not exist\n *\n * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt'];\n * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt'];\n *\n * // asynchronous function that deletes a file\n * const deleteFile = function(file, callback) {\n * fs.unlink(file, callback);\n * };\n *\n * // Using callbacks\n * async.each(fileList, deleteFile, function(err) {\n * if( err ) {\n * console.log(err);\n * } else {\n * console.log('All files have been deleted successfully');\n * }\n * });\n *\n * // Error Handling\n * async.each(withMissingFileList, deleteFile, function(err){\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * // since dir4/file2.txt does not exist\n * // dir1/file1.txt could have been deleted\n * });\n *\n * // Using Promises\n * async.each(fileList, deleteFile)\n * .then( () => {\n * console.log('All files have been deleted successfully');\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Error Handling\n * async.each(fileList, deleteFile)\n * .then( () => {\n * console.log('All files have been deleted successfully');\n * }).catch( err => {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * // since dir4/file2.txt does not exist\n * // dir1/file1.txt could have been deleted\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * await async.each(files, deleteFile);\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // Error Handling\n * async () => {\n * try {\n * await async.each(withMissingFileList, deleteFile);\n * }\n * catch (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * // since dir4/file2.txt does not exist\n * // dir1/file1.txt could have been deleted\n * }\n * }\n *\n */\nfunction eachLimit$2(coll, iteratee, callback) {\n return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback);\n}\n\nvar each = awaitify(eachLimit$2, 3);\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\n *\n * @name eachLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfLimit`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachLimit(coll, limit, iteratee, callback) {\n return eachOfLimit$2(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback);\n}\nvar eachLimit$1 = awaitify(eachLimit, 4);\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\n *\n * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item\n * in series and therefore the iteratee functions will complete in order.\n\n * @name eachSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachSeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfSeries`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachSeries(coll, iteratee, callback) {\n return eachLimit$1(coll, 1, iteratee, callback)\n}\nvar eachSeries$1 = awaitify(eachSeries, 3);\n\n/**\n * Wrap an async function and ensure it calls its callback on a later tick of\n * the event loop. If the function already calls its callback on a next tick,\n * no extra deferral is added. This is useful for preventing stack overflows\n * (`RangeError: Maximum call stack size exceeded`) and generally keeping\n * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony)\n * contained. ES2017 `async` functions are returned as-is -- they are immune\n * to Zalgo's corrupting influences, as they always resolve on a later tick.\n *\n * @name ensureAsync\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - an async function, one that expects a node-style\n * callback as its last argument.\n * @returns {AsyncFunction} Returns a wrapped function with the exact same call\n * signature as the function passed in.\n * @example\n *\n * function sometimesAsync(arg, callback) {\n * if (cache[arg]) {\n * return callback(null, cache[arg]); // this would be synchronous!!\n * } else {\n * doSomeIO(arg, callback); // this IO would be asynchronous\n * }\n * }\n *\n * // this has a risk of stack overflows if many results are cached in a row\n * async.mapSeries(args, sometimesAsync, done);\n *\n * // this will defer sometimesAsync's callback if necessary,\n * // preventing stack overflows\n * async.mapSeries(args, async.ensureAsync(sometimesAsync), done);\n */\nfunction ensureAsync(fn) {\n if (isAsync(fn)) return fn;\n return function (...args/*, callback*/) {\n var callback = args.pop();\n var sync = true;\n args.push((...innerArgs) => {\n if (sync) {\n setImmediate$1(() => callback(...innerArgs));\n } else {\n callback(...innerArgs);\n }\n });\n fn.apply(this, args);\n sync = false;\n };\n}\n\n/**\n * Returns `true` if every element in `coll` satisfies an async test. If any\n * iteratee call returns `false`, the main `callback` is immediately called.\n *\n * @name every\n * @static\n * @memberOf module:Collections\n * @method\n * @alias all\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n * // dir4 does not exist\n *\n * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt'];\n * const withMissingFileList = ['file1.txt','file2.txt','file4.txt'];\n *\n * // asynchronous function that checks if a file exists\n * function fileExists(file, callback) {\n * fs.access(file, fs.constants.F_OK, (err) => {\n * callback(null, !err);\n * });\n * }\n *\n * // Using callbacks\n * async.every(fileList, fileExists, function(err, result) {\n * console.log(result);\n * // true\n * // result is true since every file exists\n * });\n *\n * async.every(withMissingFileList, fileExists, function(err, result) {\n * console.log(result);\n * // false\n * // result is false since NOT every file exists\n * });\n *\n * // Using Promises\n * async.every(fileList, fileExists)\n * .then( result => {\n * console.log(result);\n * // true\n * // result is true since every file exists\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * async.every(withMissingFileList, fileExists)\n * .then( result => {\n * console.log(result);\n * // false\n * // result is false since NOT every file exists\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.every(fileList, fileExists);\n * console.log(result);\n * // true\n * // result is true since every file exists\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * async () => {\n * try {\n * let result = await async.every(withMissingFileList, fileExists);\n * console.log(result);\n * // false\n * // result is false since NOT every file exists\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction every(coll, iteratee, callback) {\n return _createTester(bool => !bool, res => !res)(eachOf$1, coll, iteratee, callback)\n}\nvar every$1 = awaitify(every, 3);\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time.\n *\n * @name everyLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n */\nfunction everyLimit(coll, limit, iteratee, callback) {\n return _createTester(bool => !bool, res => !res)(eachOfLimit$2(limit), coll, iteratee, callback)\n}\nvar everyLimit$1 = awaitify(everyLimit, 4);\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time.\n *\n * @name everySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allSeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in series.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n */\nfunction everySeries(coll, iteratee, callback) {\n return _createTester(bool => !bool, res => !res)(eachOfSeries$1, coll, iteratee, callback)\n}\nvar everySeries$1 = awaitify(everySeries, 3);\n\nfunction filterArray(eachfn, arr, iteratee, callback) {\n var truthValues = new Array(arr.length);\n eachfn(arr, (x, index, iterCb) => {\n iteratee(x, (err, v) => {\n truthValues[index] = !!v;\n iterCb(err);\n });\n }, err => {\n if (err) return callback(err);\n var results = [];\n for (var i = 0; i < arr.length; i++) {\n if (truthValues[i]) results.push(arr[i]);\n }\n callback(null, results);\n });\n}\n\nfunction filterGeneric(eachfn, coll, iteratee, callback) {\n var results = [];\n eachfn(coll, (x, index, iterCb) => {\n iteratee(x, (err, v) => {\n if (err) return iterCb(err);\n if (v) {\n results.push({index, value: x});\n }\n iterCb(err);\n });\n }, err => {\n if (err) return callback(err);\n callback(null, results\n .sort((a, b) => a.index - b.index)\n .map(v => v.value));\n });\n}\n\nfunction _filter(eachfn, coll, iteratee, callback) {\n var filter = isArrayLike(coll) ? filterArray : filterGeneric;\n return filter(eachfn, coll, wrapAsync(iteratee), callback);\n}\n\n/**\n * Returns a new array of all the values in `coll` which pass an async truth\n * test. This operation is performed in parallel, but the results array will be\n * in the same order as the original.\n *\n * @name filter\n * @static\n * @memberOf module:Collections\n * @method\n * @alias select\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback provided\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n *\n * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt'];\n *\n * // asynchronous function that checks if a file exists\n * function fileExists(file, callback) {\n * fs.access(file, fs.constants.F_OK, (err) => {\n * callback(null, !err);\n * });\n * }\n *\n * // Using callbacks\n * async.filter(files, fileExists, function(err, results) {\n * if(err) {\n * console.log(err);\n * } else {\n * console.log(results);\n * // [ 'dir1/file1.txt', 'dir2/file3.txt' ]\n * // results is now an array of the existing files\n * }\n * });\n *\n * // Using Promises\n * async.filter(files, fileExists)\n * .then(results => {\n * console.log(results);\n * // [ 'dir1/file1.txt', 'dir2/file3.txt' ]\n * // results is now an array of the existing files\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let results = await async.filter(files, fileExists);\n * console.log(results);\n * // [ 'dir1/file1.txt', 'dir2/file3.txt' ]\n * // results is now an array of the existing files\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction filter (coll, iteratee, callback) {\n return _filter(eachOf$1, coll, iteratee, callback)\n}\nvar filter$1 = awaitify(filter, 3);\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name filterLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback provided\n */\nfunction filterLimit (coll, limit, iteratee, callback) {\n return _filter(eachOfLimit$2(limit), coll, iteratee, callback)\n}\nvar filterLimit$1 = awaitify(filterLimit, 4);\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time.\n *\n * @name filterSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectSeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results)\n * @returns {Promise} a promise, if no callback provided\n */\nfunction filterSeries (coll, iteratee, callback) {\n return _filter(eachOfSeries$1, coll, iteratee, callback)\n}\nvar filterSeries$1 = awaitify(filterSeries, 3);\n\n/**\n * Calls the asynchronous function `fn` with a callback parameter that allows it\n * to call itself again, in series, indefinitely.\n\n * If an error is passed to the callback then `errback` is called with the\n * error, and execution stops, otherwise it will never be called.\n *\n * @name forever\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} fn - an async function to call repeatedly.\n * Invoked with (next).\n * @param {Function} [errback] - when `fn` passes an error to it's callback,\n * this function will be called, and execution stops. Invoked with (err).\n * @returns {Promise} a promise that rejects if an error occurs and an errback\n * is not passed\n * @example\n *\n * async.forever(\n * function(next) {\n * // next is suitable for passing to things that need a callback(err [, whatever]);\n * // it will result in this function being called again.\n * },\n * function(err) {\n * // if next is called with a value in its first parameter, it will appear\n * // in here as 'err', and execution will stop.\n * }\n * );\n */\nfunction forever(fn, errback) {\n var done = onlyOnce(errback);\n var task = wrapAsync(ensureAsync(fn));\n\n function next(err) {\n if (err) return done(err);\n if (err === false) return;\n task(next);\n }\n return next();\n}\nvar forever$1 = awaitify(forever, 2);\n\n/**\n * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time.\n *\n * @name groupByLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.groupBy]{@link module:Collections.groupBy}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction groupByLimit(coll, limit, iteratee, callback) {\n var _iteratee = wrapAsync(iteratee);\n return mapLimit$1(coll, limit, (val, iterCb) => {\n _iteratee(val, (err, key) => {\n if (err) return iterCb(err);\n return iterCb(err, {key, val});\n });\n }, (err, mapResults) => {\n var result = {};\n // from MDN, handle object having an `hasOwnProperty` prop\n var {hasOwnProperty} = Object.prototype;\n\n for (var i = 0; i < mapResults.length; i++) {\n if (mapResults[i]) {\n var {key} = mapResults[i];\n var {val} = mapResults[i];\n\n if (hasOwnProperty.call(result, key)) {\n result[key].push(val);\n } else {\n result[key] = [val];\n }\n }\n }\n\n return callback(err, result);\n });\n}\n\nvar groupByLimit$1 = awaitify(groupByLimit, 4);\n\n/**\n * Returns a new object, where each value corresponds to an array of items, from\n * `coll`, that returned the corresponding key. That is, the keys of the object\n * correspond to the values passed to the `iteratee` callback.\n *\n * Note: Since this function applies the `iteratee` to each item in parallel,\n * there is no guarantee that the `iteratee` functions will complete in order.\n * However, the values for each key in the `result` will be in the same order as\n * the original `coll`. For Objects, the values will roughly be in the order of\n * the original Objects' keys (but this can vary across JavaScript engines).\n *\n * @name groupBy\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n * // dir4 does not exist\n *\n * const files = ['dir1/file1.txt','dir2','dir4']\n *\n * // asynchronous function that detects file type as none, file, or directory\n * function detectFile(file, callback) {\n * fs.stat(file, function(err, stat) {\n * if (err) {\n * return callback(null, 'none');\n * }\n * callback(null, stat.isDirectory() ? 'directory' : 'file');\n * });\n * }\n *\n * //Using callbacks\n * async.groupBy(files, detectFile, function(err, result) {\n * if(err) {\n * console.log(err);\n * } else {\n *\t console.log(result);\n * // {\n * // file: [ 'dir1/file1.txt' ],\n * // none: [ 'dir4' ],\n * // directory: [ 'dir2']\n * // }\n * // result is object containing the files grouped by type\n * }\n * });\n *\n * // Using Promises\n * async.groupBy(files, detectFile)\n * .then( result => {\n * console.log(result);\n * // {\n * // file: [ 'dir1/file1.txt' ],\n * // none: [ 'dir4' ],\n * // directory: [ 'dir2']\n * // }\n * // result is object containing the files grouped by type\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.groupBy(files, detectFile);\n * console.log(result);\n * // {\n * // file: [ 'dir1/file1.txt' ],\n * // none: [ 'dir4' ],\n * // directory: [ 'dir2']\n * // }\n * // result is object containing the files grouped by type\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction groupBy (coll, iteratee, callback) {\n return groupByLimit$1(coll, Infinity, iteratee, callback)\n}\n\n/**\n * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time.\n *\n * @name groupBySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.groupBy]{@link module:Collections.groupBy}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whose\n * properties are arrays of values which returned the corresponding key.\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction groupBySeries (coll, iteratee, callback) {\n return groupByLimit$1(coll, 1, iteratee, callback)\n}\n\n/**\n * Logs the result of an `async` function to the `console`. Only works in\n * Node.js or in browsers that support `console.log` and `console.error` (such\n * as FF and Chrome). If multiple arguments are returned from the async\n * function, `console.log` is called on each argument in order.\n *\n * @name log\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} function - The function you want to eventually apply\n * all arguments to.\n * @param {...*} arguments... - Any number of arguments to apply to the function.\n * @example\n *\n * // in a module\n * var hello = function(name, callback) {\n * setTimeout(function() {\n * callback(null, 'hello ' + name);\n * }, 1000);\n * };\n *\n * // in the node repl\n * node> async.log(hello, 'world');\n * 'hello world'\n */\nvar log = consoleFunc('log');\n\n/**\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name mapValuesLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.mapValues]{@link module:Collections.mapValues}\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction mapValuesLimit(obj, limit, iteratee, callback) {\n callback = once(callback);\n var newObj = {};\n var _iteratee = wrapAsync(iteratee);\n return eachOfLimit$2(limit)(obj, (val, key, next) => {\n _iteratee(val, key, (err, result) => {\n if (err) return next(err);\n newObj[key] = result;\n next(err);\n });\n }, err => callback(err, newObj));\n}\n\nvar mapValuesLimit$1 = awaitify(mapValuesLimit, 4);\n\n/**\n * A relative of [`map`]{@link module:Collections.map}, designed for use with objects.\n *\n * Produces a new Object by mapping each value of `obj` through the `iteratee`\n * function. The `iteratee` is called each `value` and `key` from `obj` and a\n * callback for when it has finished processing. Each of these callbacks takes\n * two arguments: an `error`, and the transformed item from `obj`. If `iteratee`\n * passes an error to its callback, the main `callback` (for the `mapValues`\n * function) is immediately called with the error.\n *\n * Note, the order of the keys in the result is not guaranteed. The keys will\n * be roughly in the order they complete, (but this is very engine-specific)\n *\n * @name mapValues\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * // file1.txt is a file that is 1000 bytes in size\n * // file2.txt is a file that is 2000 bytes in size\n * // file3.txt is a file that is 3000 bytes in size\n * // file4.txt does not exist\n *\n * const fileMap = {\n * f1: 'file1.txt',\n * f2: 'file2.txt',\n * f3: 'file3.txt'\n * };\n *\n * const withMissingFileMap = {\n * f1: 'file1.txt',\n * f2: 'file2.txt',\n * f3: 'file4.txt'\n * };\n *\n * // asynchronous function that returns the file size in bytes\n * function getFileSizeInBytes(file, key, callback) {\n * fs.stat(file, function(err, stat) {\n * if (err) {\n * return callback(err);\n * }\n * callback(null, stat.size);\n * });\n * }\n *\n * // Using callbacks\n * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(result);\n * // result is now a map of file size in bytes for each file, e.g.\n * // {\n * // f1: 1000,\n * // f2: 2000,\n * // f3: 3000\n * // }\n * }\n * });\n *\n * // Error handling\n * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) {\n * if (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * } else {\n * console.log(result);\n * }\n * });\n *\n * // Using Promises\n * async.mapValues(fileMap, getFileSizeInBytes)\n * .then( result => {\n * console.log(result);\n * // result is now a map of file size in bytes for each file, e.g.\n * // {\n * // f1: 1000,\n * // f2: 2000,\n * // f3: 3000\n * // }\n * }).catch (err => {\n * console.log(err);\n * });\n *\n * // Error Handling\n * async.mapValues(withMissingFileMap, getFileSizeInBytes)\n * .then( result => {\n * console.log(result);\n * }).catch (err => {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.mapValues(fileMap, getFileSizeInBytes);\n * console.log(result);\n * // result is now a map of file size in bytes for each file, e.g.\n * // {\n * // f1: 1000,\n * // f2: 2000,\n * // f3: 3000\n * // }\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // Error Handling\n * async () => {\n * try {\n * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes);\n * console.log(result);\n * }\n * catch (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * }\n * }\n *\n */\nfunction mapValues(obj, iteratee, callback) {\n return mapValuesLimit$1(obj, Infinity, iteratee, callback)\n}\n\n/**\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time.\n *\n * @name mapValuesSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.mapValues]{@link module:Collections.mapValues}\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction mapValuesSeries(obj, iteratee, callback) {\n return mapValuesLimit$1(obj, 1, iteratee, callback)\n}\n\n/**\n * Caches the results of an async function. When creating a hash to store\n * function results against, the callback is omitted from the hash and an\n * optional hash function can be used.\n *\n * **Note: if the async function errs, the result will not be cached and\n * subsequent calls will call the wrapped function.**\n *\n * If no hash function is specified, the first argument is used as a hash key,\n * which may work reasonably if it is a string or a data type that converts to a\n * distinct string. Note that objects and arrays will not behave reasonably.\n * Neither will cases where the other arguments are significant. In such cases,\n * specify your own hash function.\n *\n * The cache of results is exposed as the `memo` property of the function\n * returned by `memoize`.\n *\n * @name memoize\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - The async function to proxy and cache results from.\n * @param {Function} hasher - An optional function for generating a custom hash\n * for storing results. It has all the arguments applied to it apart from the\n * callback, and must be synchronous.\n * @returns {AsyncFunction} a memoized version of `fn`\n * @example\n *\n * var slow_fn = function(name, callback) {\n * // do something\n * callback(null, result);\n * };\n * var fn = async.memoize(slow_fn);\n *\n * // fn can now be used as if it were slow_fn\n * fn('some name', function() {\n * // callback\n * });\n */\nfunction memoize(fn, hasher = v => v) {\n var memo = Object.create(null);\n var queues = Object.create(null);\n var _fn = wrapAsync(fn);\n var memoized = initialParams((args, callback) => {\n var key = hasher(...args);\n if (key in memo) {\n setImmediate$1(() => callback(null, ...memo[key]));\n } else if (key in queues) {\n queues[key].push(callback);\n } else {\n queues[key] = [callback];\n _fn(...args, (err, ...resultArgs) => {\n // #1465 don't memoize if an error occurred\n if (!err) {\n memo[key] = resultArgs;\n }\n var q = queues[key];\n delete queues[key];\n for (var i = 0, l = q.length; i < l; i++) {\n q[i](err, ...resultArgs);\n }\n });\n }\n });\n memoized.memo = memo;\n memoized.unmemoized = fn;\n return memoized;\n}\n\n/* istanbul ignore file */\n\n/**\n * Calls `callback` on a later loop around the event loop. In Node.js this just\n * calls `process.nextTick`. In the browser it will use `setImmediate` if\n * available, otherwise `setTimeout(callback, 0)`, which means other higher\n * priority events may precede the execution of `callback`.\n *\n * This is used internally for browser-compatibility purposes.\n *\n * @name nextTick\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.setImmediate]{@link module:Utils.setImmediate}\n * @category Util\n * @param {Function} callback - The function to call on a later loop around\n * the event loop. Invoked with (args...).\n * @param {...*} args... - any number of additional arguments to pass to the\n * callback on the next tick.\n * @example\n *\n * var call_order = [];\n * async.nextTick(function() {\n * call_order.push('two');\n * // call_order now equals ['one','two']\n * });\n * call_order.push('one');\n *\n * async.setImmediate(function (a, b, c) {\n * // a, b, and c equal 1, 2, and 3\n * }, 1, 2, 3);\n */\nvar _defer;\n\nif (hasNextTick) {\n _defer = process.nextTick;\n} else if (hasSetImmediate) {\n _defer = setImmediate;\n} else {\n _defer = fallback;\n}\n\nvar nextTick = wrap(_defer);\n\nvar _parallel = awaitify((eachfn, tasks, callback) => {\n var results = isArrayLike(tasks) ? [] : {};\n\n eachfn(tasks, (task, key, taskCb) => {\n wrapAsync(task)((err, ...result) => {\n if (result.length < 2) {\n [result] = result;\n }\n results[key] = result;\n taskCb(err);\n });\n }, err => callback(err, results));\n}, 3);\n\n/**\n * Run the `tasks` collection of functions in parallel, without waiting until\n * the previous function has completed. If any of the functions pass an error to\n * its callback, the main `callback` is immediately called with the value of the\n * error. Once the `tasks` have completed, the results are passed to the final\n * `callback` as an array.\n *\n * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about\n * parallel execution of code. If your tasks do not use any timers or perform\n * any I/O, they will actually be executed in series. Any synchronous setup\n * sections for each task will happen one after the other. JavaScript remains\n * single-threaded.\n *\n * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the\n * execution of other tasks when a task fails.\n *\n * It is also possible to use an object instead of an array. Each property will\n * be run as a function and the results will be passed to the final `callback`\n * as an object instead of an array. This can be a more readable way of handling\n * results from {@link async.parallel}.\n *\n * @name parallel\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of\n * [async functions]{@link AsyncFunction} to run.\n * Each async function can complete with any number of optional `result` values.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed successfully. This function gets a results array\n * (or object) containing all the result arguments passed to the task callbacks.\n * Invoked with (err, results).\n * @returns {Promise} a promise, if a callback is not passed\n *\n * @example\n *\n * //Using Callbacks\n * async.parallel([\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'two');\n * }, 100);\n * }\n * ], function(err, results) {\n * console.log(results);\n * // results is equal to ['one','two'] even though\n * // the second function had a shorter timeout.\n * });\n *\n * // an example using an object instead of an array\n * async.parallel({\n * one: function(callback) {\n * setTimeout(function() {\n * callback(null, 1);\n * }, 200);\n * },\n * two: function(callback) {\n * setTimeout(function() {\n * callback(null, 2);\n * }, 100);\n * }\n * }, function(err, results) {\n * console.log(results);\n * // results is equal to: { one: 1, two: 2 }\n * });\n *\n * //Using Promises\n * async.parallel([\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'two');\n * }, 100);\n * }\n * ]).then(results => {\n * console.log(results);\n * // results is equal to ['one','two'] even though\n * // the second function had a shorter timeout.\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // an example using an object instead of an array\n * async.parallel({\n * one: function(callback) {\n * setTimeout(function() {\n * callback(null, 1);\n * }, 200);\n * },\n * two: function(callback) {\n * setTimeout(function() {\n * callback(null, 2);\n * }, 100);\n * }\n * }).then(results => {\n * console.log(results);\n * // results is equal to: { one: 1, two: 2 }\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * //Using async/await\n * async () => {\n * try {\n * let results = await async.parallel([\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'two');\n * }, 100);\n * }\n * ]);\n * console.log(results);\n * // results is equal to ['one','two'] even though\n * // the second function had a shorter timeout.\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // an example using an object instead of an array\n * async () => {\n * try {\n * let results = await async.parallel({\n * one: function(callback) {\n * setTimeout(function() {\n * callback(null, 1);\n * }, 200);\n * },\n * two: function(callback) {\n * setTimeout(function() {\n * callback(null, 2);\n * }, 100);\n * }\n * });\n * console.log(results);\n * // results is equal to: { one: 1, two: 2 }\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction parallel(tasks, callback) {\n return _parallel(eachOf$1, tasks, callback);\n}\n\n/**\n * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name parallelLimit\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.parallel]{@link module:ControlFlow.parallel}\n * @category Control Flow\n * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of\n * [async functions]{@link AsyncFunction} to run.\n * Each async function can complete with any number of optional `result` values.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed successfully. This function gets a results array\n * (or object) containing all the result arguments passed to the task callbacks.\n * Invoked with (err, results).\n * @returns {Promise} a promise, if a callback is not passed\n */\nfunction parallelLimit(tasks, limit, callback) {\n return _parallel(eachOfLimit$2(limit), tasks, callback);\n}\n\n/**\n * A queue of tasks for the worker function to complete.\n * @typedef {Iterable} QueueObject\n * @memberOf module:ControlFlow\n * @property {Function} length - a function returning the number of items\n * waiting to be processed. Invoke with `queue.length()`.\n * @property {boolean} started - a boolean indicating whether or not any\n * items have been pushed and processed by the queue.\n * @property {Function} running - a function returning the number of items\n * currently being processed. Invoke with `queue.running()`.\n * @property {Function} workersList - a function returning the array of items\n * currently being processed. Invoke with `queue.workersList()`.\n * @property {Function} idle - a function returning false if there are items\n * waiting or being processed, or true if not. Invoke with `queue.idle()`.\n * @property {number} concurrency - an integer for determining how many `worker`\n * functions should be run in parallel. This property can be changed after a\n * `queue` is created to alter the concurrency on-the-fly.\n * @property {number} payload - an integer that specifies how many items are\n * passed to the worker function at a time. only applies if this is a\n * [cargo]{@link module:ControlFlow.cargo} object\n * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback`\n * once the `worker` has finished processing the task. Instead of a single task,\n * a `tasks` array can be submitted. The respective callback is used for every\n * task in the list. Invoke with `queue.push(task, [callback])`,\n * @property {AsyncFunction} unshift - add a new task to the front of the `queue`.\n * Invoke with `queue.unshift(task, [callback])`.\n * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns\n * a promise that rejects if an error occurs.\n * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns\n * a promise that rejects if an error occurs.\n * @property {Function} remove - remove items from the queue that match a test\n * function. The test function will be passed an object with a `data` property,\n * and a `priority` property, if this is a\n * [priorityQueue]{@link module:ControlFlow.priorityQueue} object.\n * Invoked with `queue.remove(testFn)`, where `testFn` is of the form\n * `function ({data, priority}) {}` and returns a Boolean.\n * @property {Function} saturated - a function that sets a callback that is\n * called when the number of running workers hits the `concurrency` limit, and\n * further tasks will be queued. If the callback is omitted, `q.saturated()`\n * returns a promise for the next occurrence.\n * @property {Function} unsaturated - a function that sets a callback that is\n * called when the number of running workers is less than the `concurrency` &\n * `buffer` limits, and further tasks will not be queued. If the callback is\n * omitted, `q.unsaturated()` returns a promise for the next occurrence.\n * @property {number} buffer - A minimum threshold buffer in order to say that\n * the `queue` is `unsaturated`.\n * @property {Function} empty - a function that sets a callback that is called\n * when the last item from the `queue` is given to a `worker`. If the callback\n * is omitted, `q.empty()` returns a promise for the next occurrence.\n * @property {Function} drain - a function that sets a callback that is called\n * when the last item from the `queue` has returned from the `worker`. If the\n * callback is omitted, `q.drain()` returns a promise for the next occurrence.\n * @property {Function} error - a function that sets a callback that is called\n * when a task errors. Has the signature `function(error, task)`. If the\n * callback is omitted, `error()` returns a promise that rejects on the next\n * error.\n * @property {boolean} paused - a boolean for determining whether the queue is\n * in a paused state.\n * @property {Function} pause - a function that pauses the processing of tasks\n * until `resume()` is called. Invoke with `queue.pause()`.\n * @property {Function} resume - a function that resumes the processing of\n * queued tasks when the queue is paused. Invoke with `queue.resume()`.\n * @property {Function} kill - a function that removes the `drain` callback and\n * empties remaining tasks from the queue forcing it to go idle. No more tasks\n * should be pushed to the queue after calling this function. Invoke with `queue.kill()`.\n *\n * @example\n * const q = async.queue(worker, 2)\n * q.push(item1)\n * q.push(item2)\n * q.push(item3)\n * // queues are iterable, spread into an array to inspect\n * const items = [...q] // [item1, item2, item3]\n * // or use for of\n * for (let item of q) {\n * console.log(item)\n * }\n *\n * q.drain(() => {\n * console.log('all done')\n * })\n * // or\n * await q.drain()\n */\n\n/**\n * Creates a `queue` object with the specified `concurrency`. Tasks added to the\n * `queue` are processed in parallel (up to the `concurrency` limit). If all\n * `worker`s are in progress, the task is queued until one becomes available.\n * Once a `worker` completes a `task`, that `task`'s callback is called.\n *\n * @name queue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} worker - An async function for processing a queued task.\n * If you want to handle errors from an individual task, pass a callback to\n * `q.push()`. Invoked with (task, callback).\n * @param {number} [concurrency=1] - An `integer` for determining how many\n * `worker` functions should be run in parallel. If omitted, the concurrency\n * defaults to `1`. If the concurrency is `0`, an error is thrown.\n * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be\n * attached as certain properties to listen for specific events during the\n * lifecycle of the queue.\n * @example\n *\n * // create a queue object with concurrency 2\n * var q = async.queue(function(task, callback) {\n * console.log('hello ' + task.name);\n * callback();\n * }, 2);\n *\n * // assign a callback\n * q.drain(function() {\n * console.log('all items have been processed');\n * });\n * // or await the end\n * await q.drain()\n *\n * // assign an error callback\n * q.error(function(err, task) {\n * console.error('task experienced an error');\n * });\n *\n * // add some items to the queue\n * q.push({name: 'foo'}, function(err) {\n * console.log('finished processing foo');\n * });\n * // callback is optional\n * q.push({name: 'bar'});\n *\n * // add some items to the queue (batch-wise)\n * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {\n * console.log('finished processing item');\n * });\n *\n * // add some items to the front of the queue\n * q.unshift({name: 'bar'}, function (err) {\n * console.log('finished processing bar');\n * });\n */\nfunction queue (worker, concurrency) {\n var _worker = wrapAsync(worker);\n return queue$1((items, cb) => {\n _worker(items[0], cb);\n }, concurrency, 1);\n}\n\n// Binary min-heap implementation used for priority queue.\n// Implementation is stable, i.e. push time is considered for equal priorities\nclass Heap {\n constructor() {\n this.heap = [];\n this.pushCount = Number.MIN_SAFE_INTEGER;\n }\n\n get length() {\n return this.heap.length;\n }\n\n empty () {\n this.heap = [];\n return this;\n }\n\n percUp(index) {\n let p;\n\n while (index > 0 && smaller(this.heap[index], this.heap[p=parent(index)])) {\n let t = this.heap[index];\n this.heap[index] = this.heap[p];\n this.heap[p] = t;\n\n index = p;\n }\n }\n\n percDown(index) {\n let l;\n\n while ((l=leftChi(index)) < this.heap.length) {\n if (l+1 < this.heap.length && smaller(this.heap[l+1], this.heap[l])) {\n l = l+1;\n }\n\n if (smaller(this.heap[index], this.heap[l])) {\n break;\n }\n\n let t = this.heap[index];\n this.heap[index] = this.heap[l];\n this.heap[l] = t;\n\n index = l;\n }\n }\n\n push(node) {\n node.pushCount = ++this.pushCount;\n this.heap.push(node);\n this.percUp(this.heap.length-1);\n }\n\n unshift(node) {\n return this.heap.push(node);\n }\n\n shift() {\n let [top] = this.heap;\n\n this.heap[0] = this.heap[this.heap.length-1];\n this.heap.pop();\n this.percDown(0);\n\n return top;\n }\n\n toArray() {\n return [...this];\n }\n\n *[Symbol.iterator] () {\n for (let i = 0; i < this.heap.length; i++) {\n yield this.heap[i].data;\n }\n }\n\n remove (testFn) {\n let j = 0;\n for (let i = 0; i < this.heap.length; i++) {\n if (!testFn(this.heap[i])) {\n this.heap[j] = this.heap[i];\n j++;\n }\n }\n\n this.heap.splice(j);\n\n for (let i = parent(this.heap.length-1); i >= 0; i--) {\n this.percDown(i);\n }\n\n return this;\n }\n}\n\nfunction leftChi(i) {\n return (i<<1)+1;\n}\n\nfunction parent(i) {\n return ((i+1)>>1)-1;\n}\n\nfunction smaller(x, y) {\n if (x.priority !== y.priority) {\n return x.priority < y.priority;\n }\n else {\n return x.pushCount < y.pushCount;\n }\n}\n\n/**\n * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and\n * completed in ascending priority order.\n *\n * @name priorityQueue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @category Control Flow\n * @param {AsyncFunction} worker - An async function for processing a queued task.\n * If you want to handle errors from an individual task, pass a callback to\n * `q.push()`.\n * Invoked with (task, callback).\n * @param {number} concurrency - An `integer` for determining how many `worker`\n * functions should be run in parallel. If omitted, the concurrency defaults to\n * `1`. If the concurrency is `0`, an error is thrown.\n * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three\n * differences between `queue` and `priorityQueue` objects:\n * * `push(task, priority, [callback])` - `priority` should be a number. If an\n * array of `tasks` is given, all tasks will be assigned the same priority.\n * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`,\n * except this returns a promise that rejects if an error occurs.\n * * The `unshift` and `unshiftAsync` methods were removed.\n */\nfunction priorityQueue(worker, concurrency) {\n // Start with a normal queue\n var q = queue(worker, concurrency);\n\n var {\n push,\n pushAsync\n } = q;\n\n q._tasks = new Heap();\n q._createTaskItem = ({data, priority}, callback) => {\n return {\n data,\n priority,\n callback\n };\n };\n\n function createDataItems(tasks, priority) {\n if (!Array.isArray(tasks)) {\n return {data: tasks, priority};\n }\n return tasks.map(data => { return {data, priority}; });\n }\n\n // Override push to accept second parameter representing priority\n q.push = function(data, priority = 0, callback) {\n return push(createDataItems(data, priority), callback);\n };\n\n q.pushAsync = function(data, priority = 0, callback) {\n return pushAsync(createDataItems(data, priority), callback);\n };\n\n // Remove unshift functions\n delete q.unshift;\n delete q.unshiftAsync;\n\n return q;\n}\n\n/**\n * Runs the `tasks` array of functions in parallel, without waiting until the\n * previous function has completed. Once any of the `tasks` complete or pass an\n * error to its callback, the main `callback` is immediately called. It's\n * equivalent to `Promise.race()`.\n *\n * @name race\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction}\n * to run. Each function can complete with an optional `result` value.\n * @param {Function} callback - A callback to run once any of the functions have\n * completed. This function gets an error or result from the first function that\n * completed. Invoked with (err, result).\n * @returns {Promise} a promise, if a callback is omitted\n * @example\n *\n * async.race([\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'two');\n * }, 100);\n * }\n * ],\n * // main callback\n * function(err, result) {\n * // the result will be equal to 'two' as it finishes earlier\n * });\n */\nfunction race(tasks, callback) {\n callback = once(callback);\n if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));\n if (!tasks.length) return callback();\n for (var i = 0, l = tasks.length; i < l; i++) {\n wrapAsync(tasks[i])(callback);\n }\n}\n\nvar race$1 = awaitify(race, 2);\n\n/**\n * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order.\n *\n * @name reduceRight\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reduce]{@link module:Collections.reduce}\n * @alias foldr\n * @category Collection\n * @param {Array} array - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee completes with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction reduceRight (array, memo, iteratee, callback) {\n var reversed = [...array].reverse();\n return reduce$1(reversed, memo, iteratee, callback);\n}\n\n/**\n * Wraps the async function in another function that always completes with a\n * result object, even when it errors.\n *\n * The result object has either the property `error` or `value`.\n *\n * @name reflect\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - The async function you want to wrap\n * @returns {Function} - A function that always passes null to it's callback as\n * the error. The second argument to the callback will be an `object` with\n * either an `error` or a `value` property.\n * @example\n *\n * async.parallel([\n * async.reflect(function(callback) {\n * // do some stuff ...\n * callback(null, 'one');\n * }),\n * async.reflect(function(callback) {\n * // do some more stuff but error ...\n * callback('bad stuff happened');\n * }),\n * async.reflect(function(callback) {\n * // do some more stuff ...\n * callback(null, 'two');\n * })\n * ],\n * // optional callback\n * function(err, results) {\n * // values\n * // results[0].value = 'one'\n * // results[1].error = 'bad stuff happened'\n * // results[2].value = 'two'\n * });\n */\nfunction reflect(fn) {\n var _fn = wrapAsync(fn);\n return initialParams(function reflectOn(args, reflectCallback) {\n args.push((error, ...cbArgs) => {\n let retVal = {};\n if (error) {\n retVal.error = error;\n }\n if (cbArgs.length > 0){\n var value = cbArgs;\n if (cbArgs.length <= 1) {\n [value] = cbArgs;\n }\n retVal.value = value;\n }\n reflectCallback(null, retVal);\n });\n\n return _fn.apply(this, args);\n });\n}\n\n/**\n * A helper function that wraps an array or an object of functions with `reflect`.\n *\n * @name reflectAll\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.reflect]{@link module:Utils.reflect}\n * @category Util\n * @param {Array|Object|Iterable} tasks - The collection of\n * [async functions]{@link AsyncFunction} to wrap in `async.reflect`.\n * @returns {Array} Returns an array of async functions, each wrapped in\n * `async.reflect`\n * @example\n *\n * let tasks = [\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * // do some more stuff but error ...\n * callback(new Error('bad stuff happened'));\n * },\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'two');\n * }, 100);\n * }\n * ];\n *\n * async.parallel(async.reflectAll(tasks),\n * // optional callback\n * function(err, results) {\n * // values\n * // results[0].value = 'one'\n * // results[1].error = Error('bad stuff happened')\n * // results[2].value = 'two'\n * });\n *\n * // an example using an object instead of an array\n * let tasks = {\n * one: function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * two: function(callback) {\n * callback('two');\n * },\n * three: function(callback) {\n * setTimeout(function() {\n * callback(null, 'three');\n * }, 100);\n * }\n * };\n *\n * async.parallel(async.reflectAll(tasks),\n * // optional callback\n * function(err, results) {\n * // values\n * // results.one.value = 'one'\n * // results.two.error = 'two'\n * // results.three.value = 'three'\n * });\n */\nfunction reflectAll(tasks) {\n var results;\n if (Array.isArray(tasks)) {\n results = tasks.map(reflect);\n } else {\n results = {};\n Object.keys(tasks).forEach(key => {\n results[key] = reflect.call(this, tasks[key]);\n });\n }\n return results;\n}\n\nfunction reject$2(eachfn, arr, _iteratee, callback) {\n const iteratee = wrapAsync(_iteratee);\n return _filter(eachfn, arr, (value, cb) => {\n iteratee(value, (err, v) => {\n cb(err, !v);\n });\n }, callback);\n}\n\n/**\n * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test.\n *\n * @name reject\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n *\n * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt'];\n *\n * // asynchronous function that checks if a file exists\n * function fileExists(file, callback) {\n * fs.access(file, fs.constants.F_OK, (err) => {\n * callback(null, !err);\n * });\n * }\n *\n * // Using callbacks\n * async.reject(fileList, fileExists, function(err, results) {\n * // [ 'dir3/file6.txt' ]\n * // results now equals an array of the non-existing files\n * });\n *\n * // Using Promises\n * async.reject(fileList, fileExists)\n * .then( results => {\n * console.log(results);\n * // [ 'dir3/file6.txt' ]\n * // results now equals an array of the non-existing files\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let results = await async.reject(fileList, fileExists);\n * console.log(results);\n * // [ 'dir3/file6.txt' ]\n * // results now equals an array of the non-existing files\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction reject (coll, iteratee, callback) {\n return reject$2(eachOf$1, coll, iteratee, callback)\n}\nvar reject$1 = awaitify(reject, 3);\n\n/**\n * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name rejectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reject]{@link module:Collections.reject}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction rejectLimit (coll, limit, iteratee, callback) {\n return reject$2(eachOfLimit$2(limit), coll, iteratee, callback)\n}\nvar rejectLimit$1 = awaitify(rejectLimit, 4);\n\n/**\n * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time.\n *\n * @name rejectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reject]{@link module:Collections.reject}\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback is passed\n */\nfunction rejectSeries (coll, iteratee, callback) {\n return reject$2(eachOfSeries$1, coll, iteratee, callback)\n}\nvar rejectSeries$1 = awaitify(rejectSeries, 3);\n\nfunction constant(value) {\n return function () {\n return value;\n }\n}\n\n/**\n * Attempts to get a successful response from `task` no more than `times` times\n * before returning an error. If the task is successful, the `callback` will be\n * passed the result of the successful task. If all attempts fail, the callback\n * will be passed the error and result (if any) of the final attempt.\n *\n * @name retry\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @see [async.retryable]{@link module:ControlFlow.retryable}\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an\n * object with `times` and `interval` or a number.\n * * `times` - The number of attempts to make before giving up. The default\n * is `5`.\n * * `interval` - The time to wait between retries, in milliseconds. The\n * default is `0`. The interval may also be specified as a function of the\n * retry count (see example).\n * * `errorFilter` - An optional synchronous function that is invoked on\n * erroneous result. If it returns `true` the retry attempts will continue;\n * if the function returns `false` the retry flow is aborted with the current\n * attempt's error and result being returned to the final callback.\n * Invoked with (err).\n * * If `opts` is a number, the number specifies the number of times to retry,\n * with the default interval of `0`.\n * @param {AsyncFunction} task - An async function to retry.\n * Invoked with (callback).\n * @param {Function} [callback] - An optional callback which is called when the\n * task has succeeded, or after the final failed attempt. It receives the `err`\n * and `result` arguments of the last attempt at completing the `task`. Invoked\n * with (err, results).\n * @returns {Promise} a promise if no callback provided\n *\n * @example\n *\n * // The `retry` function can be used as a stand-alone control flow by passing\n * // a callback, as shown below:\n *\n * // try calling apiMethod 3 times\n * async.retry(3, apiMethod, function(err, result) {\n * // do something with the result\n * });\n *\n * // try calling apiMethod 3 times, waiting 200 ms between each retry\n * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {\n * // do something with the result\n * });\n *\n * // try calling apiMethod 10 times with exponential backoff\n * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds)\n * async.retry({\n * times: 10,\n * interval: function(retryCount) {\n * return 50 * Math.pow(2, retryCount);\n * }\n * }, apiMethod, function(err, result) {\n * // do something with the result\n * });\n *\n * // try calling apiMethod the default 5 times no delay between each retry\n * async.retry(apiMethod, function(err, result) {\n * // do something with the result\n * });\n *\n * // try calling apiMethod only when error condition satisfies, all other\n * // errors will abort the retry control flow and return to final callback\n * async.retry({\n * errorFilter: function(err) {\n * return err.message === 'Temporary error'; // only retry on a specific error\n * }\n * }, apiMethod, function(err, result) {\n * // do something with the result\n * });\n *\n * // to retry individual methods that are not as reliable within other\n * // control flow functions, use the `retryable` wrapper:\n * async.auto({\n * users: api.getUsers.bind(api),\n * payments: async.retryable(3, api.getPayments.bind(api))\n * }, function(err, results) {\n * // do something with the results\n * });\n *\n */\nconst DEFAULT_TIMES = 5;\nconst DEFAULT_INTERVAL = 0;\n\nfunction retry(opts, task, callback) {\n var options = {\n times: DEFAULT_TIMES,\n intervalFunc: constant(DEFAULT_INTERVAL)\n };\n\n if (arguments.length < 3 && typeof opts === 'function') {\n callback = task || promiseCallback();\n task = opts;\n } else {\n parseTimes(options, opts);\n callback = callback || promiseCallback();\n }\n\n if (typeof task !== 'function') {\n throw new Error(\"Invalid arguments for async.retry\");\n }\n\n var _task = wrapAsync(task);\n\n var attempt = 1;\n function retryAttempt() {\n _task((err, ...args) => {\n if (err === false) return\n if (err && attempt++ < options.times &&\n (typeof options.errorFilter != 'function' ||\n options.errorFilter(err))) {\n setTimeout(retryAttempt, options.intervalFunc(attempt - 1));\n } else {\n callback(err, ...args);\n }\n });\n }\n\n retryAttempt();\n return callback[PROMISE_SYMBOL]\n}\n\nfunction parseTimes(acc, t) {\n if (typeof t === 'object') {\n acc.times = +t.times || DEFAULT_TIMES;\n\n acc.intervalFunc = typeof t.interval === 'function' ?\n t.interval :\n constant(+t.interval || DEFAULT_INTERVAL);\n\n acc.errorFilter = t.errorFilter;\n } else if (typeof t === 'number' || typeof t === 'string') {\n acc.times = +t || DEFAULT_TIMES;\n } else {\n throw new Error(\"Invalid arguments for async.retry\");\n }\n}\n\n/**\n * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method\n * wraps a task and makes it retryable, rather than immediately calling it\n * with retries.\n *\n * @name retryable\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.retry]{@link module:ControlFlow.retry}\n * @category Control Flow\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional\n * options, exactly the same as from `retry`, except for a `opts.arity` that\n * is the arity of the `task` function, defaulting to `task.length`\n * @param {AsyncFunction} task - the asynchronous function to wrap.\n * This function will be passed any arguments passed to the returned wrapper.\n * Invoked with (...args, callback).\n * @returns {AsyncFunction} The wrapped function, which when invoked, will\n * retry on an error, based on the parameters specified in `opts`.\n * This function will accept the same parameters as `task`.\n * @example\n *\n * async.auto({\n * dep1: async.retryable(3, getFromFlakyService),\n * process: [\"dep1\", async.retryable(3, function (results, cb) {\n * maybeProcessData(results.dep1, cb);\n * })]\n * }, callback);\n */\nfunction retryable (opts, task) {\n if (!task) {\n task = opts;\n opts = null;\n }\n let arity = (opts && opts.arity) || task.length;\n if (isAsync(task)) {\n arity += 1;\n }\n var _task = wrapAsync(task);\n return initialParams((args, callback) => {\n if (args.length < arity - 1 || callback == null) {\n args.push(callback);\n callback = promiseCallback();\n }\n function taskFn(cb) {\n _task(...args, cb);\n }\n\n if (opts) retry(opts, taskFn, callback);\n else retry(taskFn, callback);\n\n return callback[PROMISE_SYMBOL]\n });\n}\n\n/**\n * Run the functions in the `tasks` collection in series, each one running once\n * the previous function has completed. If any functions in the series pass an\n * error to its callback, no more functions are run, and `callback` is\n * immediately called with the value of the error. Otherwise, `callback`\n * receives an array of results when `tasks` have completed.\n *\n * It is also possible to use an object instead of an array. Each property will\n * be run as a function, and the results will be passed to the final `callback`\n * as an object instead of an array. This can be a more readable way of handling\n * results from {@link async.series}.\n *\n * **Note** that while many implementations preserve the order of object\n * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)\n * explicitly states that\n *\n * > The mechanics and order of enumerating the properties is not specified.\n *\n * So if you rely on the order in which your series of functions are executed,\n * and want this to work on all platforms, consider using an array.\n *\n * @name series\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing\n * [async functions]{@link AsyncFunction} to run in series.\n * Each function can complete with any number of optional `result` values.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed. This function gets a results array (or object)\n * containing all the result arguments passed to the `task` callbacks. Invoked\n * with (err, result).\n * @return {Promise} a promise, if no callback is passed\n * @example\n *\n * //Using Callbacks\n * async.series([\n * function(callback) {\n * setTimeout(function() {\n * // do some async task\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * // then do another async task\n * callback(null, 'two');\n * }, 100);\n * }\n * ], function(err, results) {\n * console.log(results);\n * // results is equal to ['one','two']\n * });\n *\n * // an example using objects instead of arrays\n * async.series({\n * one: function(callback) {\n * setTimeout(function() {\n * // do some async task\n * callback(null, 1);\n * }, 200);\n * },\n * two: function(callback) {\n * setTimeout(function() {\n * // then do another async task\n * callback(null, 2);\n * }, 100);\n * }\n * }, function(err, results) {\n * console.log(results);\n * // results is equal to: { one: 1, two: 2 }\n * });\n *\n * //Using Promises\n * async.series([\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * callback(null, 'two');\n * }, 100);\n * }\n * ]).then(results => {\n * console.log(results);\n * // results is equal to ['one','two']\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // an example using an object instead of an array\n * async.series({\n * one: function(callback) {\n * setTimeout(function() {\n * // do some async task\n * callback(null, 1);\n * }, 200);\n * },\n * two: function(callback) {\n * setTimeout(function() {\n * // then do another async task\n * callback(null, 2);\n * }, 100);\n * }\n * }).then(results => {\n * console.log(results);\n * // results is equal to: { one: 1, two: 2 }\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * //Using async/await\n * async () => {\n * try {\n * let results = await async.series([\n * function(callback) {\n * setTimeout(function() {\n * // do some async task\n * callback(null, 'one');\n * }, 200);\n * },\n * function(callback) {\n * setTimeout(function() {\n * // then do another async task\n * callback(null, 'two');\n * }, 100);\n * }\n * ]);\n * console.log(results);\n * // results is equal to ['one','two']\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * // an example using an object instead of an array\n * async () => {\n * try {\n * let results = await async.parallel({\n * one: function(callback) {\n * setTimeout(function() {\n * // do some async task\n * callback(null, 1);\n * }, 200);\n * },\n * two: function(callback) {\n * setTimeout(function() {\n * // then do another async task\n * callback(null, 2);\n * }, 100);\n * }\n * });\n * console.log(results);\n * // results is equal to: { one: 1, two: 2 }\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction series(tasks, callback) {\n return _parallel(eachOfSeries$1, tasks, callback);\n}\n\n/**\n * Returns `true` if at least one element in the `coll` satisfies an async test.\n * If any iteratee call returns `true`, the main `callback` is immediately\n * called.\n *\n * @name some\n * @static\n * @memberOf module:Collections\n * @method\n * @alias any\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n * @example\n *\n * // dir1 is a directory that contains file1.txt, file2.txt\n * // dir2 is a directory that contains file3.txt, file4.txt\n * // dir3 is a directory that contains file5.txt\n * // dir4 does not exist\n *\n * // asynchronous function that checks if a file exists\n * function fileExists(file, callback) {\n * fs.access(file, fs.constants.F_OK, (err) => {\n * callback(null, !err);\n * });\n * }\n *\n * // Using callbacks\n * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists,\n * function(err, result) {\n * console.log(result);\n * // true\n * // result is true since some file in the list exists\n * }\n *);\n *\n * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists,\n * function(err, result) {\n * console.log(result);\n * // false\n * // result is false since none of the files exists\n * }\n *);\n *\n * // Using Promises\n * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists)\n * .then( result => {\n * console.log(result);\n * // true\n * // result is true since some file in the list exists\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists)\n * .then( result => {\n * console.log(result);\n * // false\n * // result is false since none of the files exists\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists);\n * console.log(result);\n * // true\n * // result is true since some file in the list exists\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n * async () => {\n * try {\n * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists);\n * console.log(result);\n * // false\n * // result is false since none of the files exists\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction some(coll, iteratee, callback) {\n return _createTester(Boolean, res => res)(eachOf$1, coll, iteratee, callback)\n}\nvar some$1 = awaitify(some, 3);\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time.\n *\n * @name someLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anyLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n */\nfunction someLimit(coll, limit, iteratee, callback) {\n return _createTester(Boolean, res => res)(eachOfLimit$2(limit), coll, iteratee, callback)\n}\nvar someLimit$1 = awaitify(someLimit, 4);\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time.\n *\n * @name someSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anySeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in series.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n */\nfunction someSeries(coll, iteratee, callback) {\n return _createTester(Boolean, res => res)(eachOfSeries$1, coll, iteratee, callback)\n}\nvar someSeries$1 = awaitify(someSeries, 3);\n\n/**\n * Sorts a list by the results of running each `coll` value through an async\n * `iteratee`.\n *\n * @name sortBy\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a value to use as the sort criteria as\n * its `result`.\n * Invoked with (item, callback).\n * @param {Function} callback - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is the items\n * from the original `coll` sorted by the values returned by the `iteratee`\n * calls. Invoked with (err, results).\n * @returns {Promise} a promise, if no callback passed\n * @example\n *\n * // bigfile.txt is a file that is 251100 bytes in size\n * // mediumfile.txt is a file that is 11000 bytes in size\n * // smallfile.txt is a file that is 121 bytes in size\n *\n * // asynchronous function that returns the file size in bytes\n * function getFileSizeInBytes(file, callback) {\n * fs.stat(file, function(err, stat) {\n * if (err) {\n * return callback(err);\n * }\n * callback(null, stat.size);\n * });\n * }\n *\n * // Using callbacks\n * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes,\n * function(err, results) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(results);\n * // results is now the original array of files sorted by\n * // file size (ascending by default), e.g.\n * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt']\n * }\n * }\n * );\n *\n * // By modifying the callback parameter the\n * // sorting order can be influenced:\n *\n * // ascending order\n * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) {\n * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) {\n * if (getFileSizeErr) return callback(getFileSizeErr);\n * callback(null, fileSize);\n * });\n * }, function(err, results) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(results);\n * // results is now the original array of files sorted by\n * // file size (ascending by default), e.g.\n * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt']\n * }\n * }\n * );\n *\n * // descending order\n * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) {\n * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) {\n * if (getFileSizeErr) {\n * return callback(getFileSizeErr);\n * }\n * callback(null, fileSize * -1);\n * });\n * }, function(err, results) {\n * if (err) {\n * console.log(err);\n * } else {\n * console.log(results);\n * // results is now the original array of files sorted by\n * // file size (ascending by default), e.g.\n * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt']\n * }\n * }\n * );\n *\n * // Error handling\n * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes,\n * function(err, results) {\n * if (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * } else {\n * console.log(results);\n * }\n * }\n * );\n *\n * // Using Promises\n * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes)\n * .then( results => {\n * console.log(results);\n * // results is now the original array of files sorted by\n * // file size (ascending by default), e.g.\n * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt']\n * }).catch( err => {\n * console.log(err);\n * });\n *\n * // Error handling\n * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes)\n * .then( results => {\n * console.log(results);\n * }).catch( err => {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * });\n *\n * // Using async/await\n * (async () => {\n * try {\n * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes);\n * console.log(results);\n * // results is now the original array of files sorted by\n * // file size (ascending by default), e.g.\n * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt']\n * }\n * catch (err) {\n * console.log(err);\n * }\n * })();\n *\n * // Error handling\n * async () => {\n * try {\n * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes);\n * console.log(results);\n * }\n * catch (err) {\n * console.log(err);\n * // [ Error: ENOENT: no such file or directory ]\n * }\n * }\n *\n */\nfunction sortBy (coll, iteratee, callback) {\n var _iteratee = wrapAsync(iteratee);\n return map$1(coll, (x, iterCb) => {\n _iteratee(x, (err, criteria) => {\n if (err) return iterCb(err);\n iterCb(err, {value: x, criteria});\n });\n }, (err, results) => {\n if (err) return callback(err);\n callback(null, results.sort(comparator).map(v => v.value));\n });\n\n function comparator(left, right) {\n var a = left.criteria, b = right.criteria;\n return a < b ? -1 : a > b ? 1 : 0;\n }\n}\nvar sortBy$1 = awaitify(sortBy, 3);\n\n/**\n * Sets a time limit on an asynchronous function. If the function does not call\n * its callback within the specified milliseconds, it will be called with a\n * timeout error. The code property for the error object will be `'ETIMEDOUT'`.\n *\n * @name timeout\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} asyncFn - The async function to limit in time.\n * @param {number} milliseconds - The specified time limit.\n * @param {*} [info] - Any variable you want attached (`string`, `object`, etc)\n * to timeout Error for more information..\n * @returns {AsyncFunction} Returns a wrapped function that can be used with any\n * of the control flow functions.\n * Invoke this function with the same parameters as you would `asyncFunc`.\n * @example\n *\n * function myFunction(foo, callback) {\n * doAsyncTask(foo, function(err, data) {\n * // handle errors\n * if (err) return callback(err);\n *\n * // do some stuff ...\n *\n * // return processed data\n * return callback(null, data);\n * });\n * }\n *\n * var wrapped = async.timeout(myFunction, 1000);\n *\n * // call `wrapped` as you would `myFunction`\n * wrapped({ bar: 'bar' }, function(err, data) {\n * // if `myFunction` takes < 1000 ms to execute, `err`\n * // and `data` will have their expected values\n *\n * // else `err` will be an Error with the code 'ETIMEDOUT'\n * });\n */\nfunction timeout(asyncFn, milliseconds, info) {\n var fn = wrapAsync(asyncFn);\n\n return initialParams((args, callback) => {\n var timedOut = false;\n var timer;\n\n function timeoutCallback() {\n var name = asyncFn.name || 'anonymous';\n var error = new Error('Callback function \"' + name + '\" timed out.');\n error.code = 'ETIMEDOUT';\n if (info) {\n error.info = info;\n }\n timedOut = true;\n callback(error);\n }\n\n args.push((...cbArgs) => {\n if (!timedOut) {\n callback(...cbArgs);\n clearTimeout(timer);\n }\n });\n\n // setup timer and call original function\n timer = setTimeout(timeoutCallback, milliseconds);\n fn(...args);\n });\n}\n\nfunction range(size) {\n var result = Array(size);\n while (size--) {\n result[size] = size;\n }\n return result;\n}\n\n/**\n * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name timesLimit\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.times]{@link module:ControlFlow.times}\n * @category Control Flow\n * @param {number} count - The number of times to run the function.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see [async.map]{@link module:Collections.map}.\n * @returns {Promise} a promise, if no callback is provided\n */\nfunction timesLimit(count, limit, iteratee, callback) {\n var _iteratee = wrapAsync(iteratee);\n return mapLimit$1(range(count), limit, _iteratee, callback);\n}\n\n/**\n * Calls the `iteratee` function `n` times, and accumulates results in the same\n * manner you would use with [map]{@link module:Collections.map}.\n *\n * @name times\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Control Flow\n * @param {number} n - The number of times to run the function.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see {@link module:Collections.map}.\n * @returns {Promise} a promise, if no callback is provided\n * @example\n *\n * // Pretend this is some complicated async factory\n * var createUser = function(id, callback) {\n * callback(null, {\n * id: 'user' + id\n * });\n * };\n *\n * // generate 5 users\n * async.times(5, function(n, next) {\n * createUser(n, function(err, user) {\n * next(err, user);\n * });\n * }, function(err, users) {\n * // we should now have 5 users\n * });\n */\nfunction times (n, iteratee, callback) {\n return timesLimit(n, Infinity, iteratee, callback)\n}\n\n/**\n * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time.\n *\n * @name timesSeries\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.times]{@link module:ControlFlow.times}\n * @category Control Flow\n * @param {number} n - The number of times to run the function.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see {@link module:Collections.map}.\n * @returns {Promise} a promise, if no callback is provided\n */\nfunction timesSeries (n, iteratee, callback) {\n return timesLimit(n, 1, iteratee, callback)\n}\n\n/**\n * A relative of `reduce`. Takes an Object or Array, and iterates over each\n * element in parallel, each step potentially mutating an `accumulator` value.\n * The type of the accumulator defaults to the type of collection passed in.\n *\n * @name transform\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {*} [accumulator] - The initial state of the transform. If omitted,\n * it will default to an empty Object or Array, depending on the type of `coll`\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * collection that potentially modifies the accumulator.\n * Invoked with (accumulator, item, key, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the transformed accumulator.\n * Invoked with (err, result).\n * @returns {Promise} a promise, if no callback provided\n * @example\n *\n * // file1.txt is a file that is 1000 bytes in size\n * // file2.txt is a file that is 2000 bytes in size\n * // file3.txt is a file that is 3000 bytes in size\n *\n * // helper function that returns human-readable size format from bytes\n * function formatBytes(bytes, decimals = 2) {\n * // implementation not included for brevity\n * return humanReadbleFilesize;\n * }\n *\n * const fileList = ['file1.txt','file2.txt','file3.txt'];\n *\n * // asynchronous function that returns the file size, transformed to human-readable format\n * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc.\n * function transformFileSize(acc, value, key, callback) {\n * fs.stat(value, function(err, stat) {\n * if (err) {\n * return callback(err);\n * }\n * acc[key] = formatBytes(stat.size);\n * callback(null);\n * });\n * }\n *\n * // Using callbacks\n * async.transform(fileList, transformFileSize, function(err, result) {\n * if(err) {\n * console.log(err);\n * } else {\n * console.log(result);\n * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ]\n * }\n * });\n *\n * // Using Promises\n * async.transform(fileList, transformFileSize)\n * .then(result => {\n * console.log(result);\n * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ]\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * (async () => {\n * try {\n * let result = await async.transform(fileList, transformFileSize);\n * console.log(result);\n * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ]\n * }\n * catch (err) {\n * console.log(err);\n * }\n * })();\n *\n * @example\n *\n * // file1.txt is a file that is 1000 bytes in size\n * // file2.txt is a file that is 2000 bytes in size\n * // file3.txt is a file that is 3000 bytes in size\n *\n * // helper function that returns human-readable size format from bytes\n * function formatBytes(bytes, decimals = 2) {\n * // implementation not included for brevity\n * return humanReadbleFilesize;\n * }\n *\n * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' };\n *\n * // asynchronous function that returns the file size, transformed to human-readable format\n * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc.\n * function transformFileSize(acc, value, key, callback) {\n * fs.stat(value, function(err, stat) {\n * if (err) {\n * return callback(err);\n * }\n * acc[key] = formatBytes(stat.size);\n * callback(null);\n * });\n * }\n *\n * // Using callbacks\n * async.transform(fileMap, transformFileSize, function(err, result) {\n * if(err) {\n * console.log(err);\n * } else {\n * console.log(result);\n * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' }\n * }\n * });\n *\n * // Using Promises\n * async.transform(fileMap, transformFileSize)\n * .then(result => {\n * console.log(result);\n * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' }\n * }).catch(err => {\n * console.log(err);\n * });\n *\n * // Using async/await\n * async () => {\n * try {\n * let result = await async.transform(fileMap, transformFileSize);\n * console.log(result);\n * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' }\n * }\n * catch (err) {\n * console.log(err);\n * }\n * }\n *\n */\nfunction transform (coll, accumulator, iteratee, callback) {\n if (arguments.length <= 3 && typeof accumulator === 'function') {\n callback = iteratee;\n iteratee = accumulator;\n accumulator = Array.isArray(coll) ? [] : {};\n }\n callback = once(callback || promiseCallback());\n var _iteratee = wrapAsync(iteratee);\n\n eachOf$1(coll, (v, k, cb) => {\n _iteratee(accumulator, v, k, cb);\n }, err => callback(err, accumulator));\n return callback[PROMISE_SYMBOL]\n}\n\n/**\n * It runs each task in series but stops whenever any of the functions were\n * successful. If one of the tasks were successful, the `callback` will be\n * passed the result of the successful task. If all tasks fail, the callback\n * will be passed the error and result (if any) of the final attempt.\n *\n * @name tryEach\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to\n * run, each function is passed a `callback(err, result)` it must call on\n * completion with an error `err` (which can be `null`) and an optional `result`\n * value.\n * @param {Function} [callback] - An optional callback which is called when one\n * of the tasks has succeeded, or all have failed. It receives the `err` and\n * `result` arguments of the last attempt at completing the `task`. Invoked with\n * (err, results).\n * @returns {Promise} a promise, if no callback is passed\n * @example\n * async.tryEach([\n * function getDataFromFirstWebsite(callback) {\n * // Try getting the data from the first website\n * callback(err, data);\n * },\n * function getDataFromSecondWebsite(callback) {\n * // First website failed,\n * // Try getting the data from the backup website\n * callback(err, data);\n * }\n * ],\n * // optional callback\n * function(err, results) {\n * Now do something with the data.\n * });\n *\n */\nfunction tryEach(tasks, callback) {\n var error = null;\n var result;\n return eachSeries$1(tasks, (task, taskCb) => {\n wrapAsync(task)((err, ...args) => {\n if (err === false) return taskCb(err);\n\n if (args.length < 2) {\n [result] = args;\n } else {\n result = args;\n }\n error = err;\n taskCb(err ? null : {});\n });\n }, () => callback(error, result));\n}\n\nvar tryEach$1 = awaitify(tryEach);\n\n/**\n * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original,\n * unmemoized form. Handy for testing.\n *\n * @name unmemoize\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.memoize]{@link module:Utils.memoize}\n * @category Util\n * @param {AsyncFunction} fn - the memoized function\n * @returns {AsyncFunction} a function that calls the original unmemoized function\n */\nfunction unmemoize(fn) {\n return (...args) => {\n return (fn.unmemoized || fn)(...args);\n };\n}\n\n/**\n * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when\n * stopped, or an error occurs.\n *\n * @name whilst\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} test - asynchronous truth test to perform before each\n * execution of `iteratee`. Invoked with (callback).\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n * @returns {Promise} a promise, if no callback is passed\n * @example\n *\n * var count = 0;\n * async.whilst(\n * function test(cb) { cb(null, count < 5); },\n * function iter(callback) {\n * count++;\n * setTimeout(function() {\n * callback(null, count);\n * }, 1000);\n * },\n * function (err, n) {\n * // 5 seconds have passed, n = 5\n * }\n * );\n */\nfunction whilst(test, iteratee, callback) {\n callback = onlyOnce(callback);\n var _fn = wrapAsync(iteratee);\n var _test = wrapAsync(test);\n var results = [];\n\n function next(err, ...rest) {\n if (err) return callback(err);\n results = rest;\n if (err === false) return;\n _test(check);\n }\n\n function check(err, truth) {\n if (err) return callback(err);\n if (err === false) return;\n if (!truth) return callback(null, ...results);\n _fn(next);\n }\n\n return _test(check);\n}\nvar whilst$1 = awaitify(whilst, 3);\n\n/**\n * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when\n * stopped, or an error occurs. `callback` will be passed an error and any\n * arguments passed to the final `iteratee`'s callback.\n *\n * The inverse of [whilst]{@link module:ControlFlow.whilst}.\n *\n * @name until\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {AsyncFunction} test - asynchronous truth test to perform before each\n * execution of `iteratee`. Invoked with (callback).\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` fails. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has passed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n * @returns {Promise} a promise, if a callback is not passed\n *\n * @example\n * const results = []\n * let finished = false\n * async.until(function test(cb) {\n * cb(null, finished)\n * }, function iter(next) {\n * fetchPage(url, (err, body) => {\n * if (err) return next(err)\n * results = results.concat(body.objects)\n * finished = !!body.next\n * next(err)\n * })\n * }, function done (err) {\n * // all pages have been fetched\n * })\n */\nfunction until(test, iteratee, callback) {\n const _test = wrapAsync(test);\n return whilst$1((cb) => _test((err, truth) => cb (err, !truth)), iteratee, callback);\n}\n\n/**\n * Runs the `tasks` array of functions in series, each passing their results to\n * the next in the array. However, if any of the `tasks` pass an error to their\n * own callback, the next function is not executed, and the main `callback` is\n * immediately called with the error.\n *\n * @name waterfall\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array} tasks - An array of [async functions]{@link AsyncFunction}\n * to run.\n * Each function should complete with any number of `result` values.\n * The `result` values will be passed as arguments, in order, to the next task.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed. This will be passed the results of the last task's\n * callback. Invoked with (err, [results]).\n * @returns {Promise} a promise, if a callback is omitted\n * @example\n *\n * async.waterfall([\n * function(callback) {\n * callback(null, 'one', 'two');\n * },\n * function(arg1, arg2, callback) {\n * // arg1 now equals 'one' and arg2 now equals 'two'\n * callback(null, 'three');\n * },\n * function(arg1, callback) {\n * // arg1 now equals 'three'\n * callback(null, 'done');\n * }\n * ], function (err, result) {\n * // result now equals 'done'\n * });\n *\n * // Or, with named functions:\n * async.waterfall([\n * myFirstFunction,\n * mySecondFunction,\n * myLastFunction,\n * ], function (err, result) {\n * // result now equals 'done'\n * });\n * function myFirstFunction(callback) {\n * callback(null, 'one', 'two');\n * }\n * function mySecondFunction(arg1, arg2, callback) {\n * // arg1 now equals 'one' and arg2 now equals 'two'\n * callback(null, 'three');\n * }\n * function myLastFunction(arg1, callback) {\n * // arg1 now equals 'three'\n * callback(null, 'done');\n * }\n */\nfunction waterfall (tasks, callback) {\n callback = once(callback);\n if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));\n if (!tasks.length) return callback();\n var taskIndex = 0;\n\n function nextTask(args) {\n var task = wrapAsync(tasks[taskIndex++]);\n task(...args, onlyOnce(next));\n }\n\n function next(err, ...args) {\n if (err === false) return\n if (err || taskIndex === tasks.length) {\n return callback(err, ...args);\n }\n nextTask(args);\n }\n\n nextTask([]);\n}\n\nvar waterfall$1 = awaitify(waterfall);\n\n/**\n * An \"async function\" in the context of Async is an asynchronous function with\n * a variable number of parameters, with the final parameter being a callback.\n * (`function (arg1, arg2, ..., callback) {}`)\n * The final callback is of the form `callback(err, results...)`, which must be\n * called once the function is completed. The callback should be called with a\n * Error as its first argument to signal that an error occurred.\n * Otherwise, if no error occurred, it should be called with `null` as the first\n * argument, and any additional `result` arguments that may apply, to signal\n * successful completion.\n * The callback must be called exactly once, ideally on a later tick of the\n * JavaScript event loop.\n *\n * This type of function is also referred to as a \"Node-style async function\",\n * or a \"continuation passing-style function\" (CPS). Most of the methods of this\n * library are themselves CPS/Node-style async functions, or functions that\n * return CPS/Node-style async functions.\n *\n * Wherever we accept a Node-style async function, we also directly accept an\n * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}.\n * In this case, the `async` function will not be passed a final callback\n * argument, and any thrown error will be used as the `err` argument of the\n * implicit callback, and the return value will be used as the `result` value.\n * (i.e. a `rejected` of the returned Promise becomes the `err` callback\n * argument, and a `resolved` value becomes the `result`.)\n *\n * Note, due to JavaScript limitations, we can only detect native `async`\n * functions and not transpilied implementations.\n * Your environment must have `async`/`await` support for this to work.\n * (e.g. Node > v7.6, or a recent version of a modern browser).\n * If you are using `async` functions through a transpiler (e.g. Babel), you\n * must still wrap the function with [asyncify]{@link module:Utils.asyncify},\n * because the `async function` will be compiled to an ordinary function that\n * returns a promise.\n *\n * @typedef {Function} AsyncFunction\n * @static\n */\n\n\nvar index = {\n apply,\n applyEach,\n applyEachSeries,\n asyncify,\n auto,\n autoInject,\n cargo: cargo$1,\n cargoQueue: cargo,\n compose,\n concat: concat$1,\n concatLimit: concatLimit$1,\n concatSeries: concatSeries$1,\n constant: constant$1,\n detect: detect$1,\n detectLimit: detectLimit$1,\n detectSeries: detectSeries$1,\n dir,\n doUntil,\n doWhilst: doWhilst$1,\n each,\n eachLimit: eachLimit$1,\n eachOf: eachOf$1,\n eachOfLimit: eachOfLimit$1,\n eachOfSeries: eachOfSeries$1,\n eachSeries: eachSeries$1,\n ensureAsync,\n every: every$1,\n everyLimit: everyLimit$1,\n everySeries: everySeries$1,\n filter: filter$1,\n filterLimit: filterLimit$1,\n filterSeries: filterSeries$1,\n forever: forever$1,\n groupBy,\n groupByLimit: groupByLimit$1,\n groupBySeries,\n log,\n map: map$1,\n mapLimit: mapLimit$1,\n mapSeries: mapSeries$1,\n mapValues,\n mapValuesLimit: mapValuesLimit$1,\n mapValuesSeries,\n memoize,\n nextTick,\n parallel,\n parallelLimit,\n priorityQueue,\n queue,\n race: race$1,\n reduce: reduce$1,\n reduceRight,\n reflect,\n reflectAll,\n reject: reject$1,\n rejectLimit: rejectLimit$1,\n rejectSeries: rejectSeries$1,\n retry,\n retryable,\n seq,\n series,\n setImmediate: setImmediate$1,\n some: some$1,\n someLimit: someLimit$1,\n someSeries: someSeries$1,\n sortBy: sortBy$1,\n timeout,\n times,\n timesLimit,\n timesSeries,\n transform,\n tryEach: tryEach$1,\n unmemoize,\n until,\n waterfall: waterfall$1,\n whilst: whilst$1,\n\n // aliases\n all: every$1,\n allLimit: everyLimit$1,\n allSeries: everySeries$1,\n any: some$1,\n anyLimit: someLimit$1,\n anySeries: someSeries$1,\n find: detect$1,\n findLimit: detectLimit$1,\n findSeries: detectSeries$1,\n flatMap: concat$1,\n flatMapLimit: concatLimit$1,\n flatMapSeries: concatSeries$1,\n forEach: each,\n forEachSeries: eachSeries$1,\n forEachLimit: eachLimit$1,\n forEachOf: eachOf$1,\n forEachOfSeries: eachOfSeries$1,\n forEachOfLimit: eachOfLimit$1,\n inject: reduce$1,\n foldl: reduce$1,\n foldr: reduceRight,\n select: filter$1,\n selectLimit: filterLimit$1,\n selectSeries: filterSeries$1,\n wrapSync: asyncify,\n during: whilst$1,\n doDuring: doWhilst$1\n};\n\nexport { every$1 as all, everyLimit$1 as allLimit, everySeries$1 as allSeries, some$1 as any, someLimit$1 as anyLimit, someSeries$1 as anySeries, apply, applyEach, applyEachSeries, asyncify, auto, autoInject, cargo$1 as cargo, cargo as cargoQueue, compose, concat$1 as concat, concatLimit$1 as concatLimit, concatSeries$1 as concatSeries, constant$1 as constant, index as default, detect$1 as detect, detectLimit$1 as detectLimit, detectSeries$1 as detectSeries, dir, doWhilst$1 as doDuring, doUntil, doWhilst$1 as doWhilst, whilst$1 as during, each, eachLimit$1 as eachLimit, eachOf$1 as eachOf, eachOfLimit$1 as eachOfLimit, eachOfSeries$1 as eachOfSeries, eachSeries$1 as eachSeries, ensureAsync, every$1 as every, everyLimit$1 as everyLimit, everySeries$1 as everySeries, filter$1 as filter, filterLimit$1 as filterLimit, filterSeries$1 as filterSeries, detect$1 as find, detectLimit$1 as findLimit, detectSeries$1 as findSeries, concat$1 as flatMap, concatLimit$1 as flatMapLimit, concatSeries$1 as flatMapSeries, reduce$1 as foldl, reduceRight as foldr, each as forEach, eachLimit$1 as forEachLimit, eachOf$1 as forEachOf, eachOfLimit$1 as forEachOfLimit, eachOfSeries$1 as forEachOfSeries, eachSeries$1 as forEachSeries, forever$1 as forever, groupBy, groupByLimit$1 as groupByLimit, groupBySeries, reduce$1 as inject, log, map$1 as map, mapLimit$1 as mapLimit, mapSeries$1 as mapSeries, mapValues, mapValuesLimit$1 as mapValuesLimit, mapValuesSeries, memoize, nextTick, parallel, parallelLimit, priorityQueue, queue, race$1 as race, reduce$1 as reduce, reduceRight, reflect, reflectAll, reject$1 as reject, rejectLimit$1 as rejectLimit, rejectSeries$1 as rejectSeries, retry, retryable, filter$1 as select, filterLimit$1 as selectLimit, filterSeries$1 as selectSeries, seq, series, setImmediate$1 as setImmediate, some$1 as some, someLimit$1 as someLimit, someSeries$1 as someSeries, sortBy$1 as sortBy, timeout, times, timesLimit, timesSeries, transform, tryEach$1 as tryEach, unmemoize, until, waterfall$1 as waterfall, whilst$1 as whilst, asyncify as wrapSync };\n","const EventEmitter = require('events');\nconst async = require('async');\nconst binary = require('@mapbox/node-pre-gyp');\nconst path = require('path');\n\nconst { Connection } = require('./Connection');\n\nconst bindingPath = binary.find(path.resolve(path.join(__dirname, '../package.json')));\n\nconst odbc = require(bindingPath);\n\nconst REUSE_CONNECTIONS_DEFAULT = true;\nconst INITIAL_SIZE_DEFAULT = 10;\nconst INCREMENT_SIZE_DEFAULT = 10;\nconst MAX_SIZE_DEFAULT = Number.MAX_SAFE_INTEGER;\nconst SHRINK_DEFAULT = true;\nconst CONNECTION_TIMEOUT_DEFAULT = 0;\nconst LOGIN_TIMEOUT_DEFAULT = 0;\nconst FETCH_ARRAY_DEFAULT = false;\nconst MAX_ACTIVELY_CONNECTING = 1;\n\n// A queue for tracking the connections \nclass ConnectionQueue\n{\n static queuedConnections = [];\n static activelyConnectingCount = 0;\n static maxActivelyConnecting = MAX_ACTIVELY_CONNECTING;\n\n static enqueue = async function(pool, promiseGenerator, configObject)\n {\n ConnectionQueue.queuedConnections.push({\n pool,\n promiseGenerator,\n configObject\n });\n ConnectionQueue.dequeue();\n return;\n }\n\n static dequeue = async function()\n {\n if (this.activelyConnectingCount >= this.maxActivelyConnecting) {\n return;\n }\n const item = this.queuedConnections.shift();\n if (!item) {\n return;\n }\n ConnectionQueue.activelyConnectingCount++;\n try {\n await item.promiseGenerator(item.configObject);\n } catch (error) {\n // Errors are handled in the promiseGenerator through emitting a\n // \"connectionError\" event. Error thrown and caught here simply to resolve\n // the promise generated by the promiseGenerator.\n }\n ConnectionQueue.activelyConnectingCount--;\n ConnectionQueue.dequeue();\n return;\n }\n}\n\nclass Pool {\n\n constructor(connectionString) {\n\n this.connectionConfig = {};\n this.waitingConnectionWork = [];\n this.isOpen = false;\n this.freeConnections = [];\n this.connectionsBeingCreatedCount = 0;\n this.poolSize = 0;\n\n // Keeps track of when connections have sucessfully connected\n this.connectionEmitter = new EventEmitter();\n\n // Fires when a connection has been made\n this.connectionEmitter.on('connected', (connection) => {\n\n // A connection has finished connecting, but there is some waiting call\n // to connect() that is waiting for a connection. shift() that work from\n // the front of the waitingConnectionWork queue, then either call the\n // callback function provided by the user, or resolve the Promise that was\n // returned to the user.\n let connectionWork = this.waitingConnectionWork.shift();\n\n // A connection finished connecting, and there was no work waiting for\n // that connection to be made. Simply add it to the array of\n // freeConnections, and the next time work comes in it can simply be\n // retrieved from there.\n if (typeof connectionWork == 'undefined')\n {\n this.freeConnections.push(connection);\n return;\n }\n\n // If the user passed a callback function, then call the function with\n // no error in the first parameter and the connection in the second\n // parameter\n if (typeof connectionWork == 'function')\n {\n return connectionWork(null, connection);\n } \n\n // If the user didn't pass a callback function, we returned a promise to\n // them. Resolve that promise with the connection that was just created.\n // Promise (stored resolve function)\n return connectionWork.resolveFunction(connection);\n });\n\n // Fires when a connection has errored. If there is no work waiting, then\n // the pool will simply be empty until the next time work is requested, at\n // which point there WILL be waiting work and they will get an error.\n this.connectionEmitter.on('connectionError', (error) => {\n let connectionWork = this.waitingConnectionWork.shift();\n if (typeof connectionWork == 'undefined')\n {\n return;\n }\n // If the user passed a callback function, then call the function with\n // the error in the first parameter\n if (typeof connectionWork == 'function')\n {\n return connectionWork(error, undefined);\n // If the user didn't pass a callback function, we returned a promise to\n // them. Reject that promise with the generated error\n } else {\n // Promise (stored resolve function)\n return connectionWork.rejectFunction(error);\n }\n });\n\n // connectionString is a string, so use defaults for all of the\n // configuration options.\n if (typeof connectionString === 'string') {\n this.connectionConfig.connectionString = connectionString;\n\n this.reuseConnections = REUSE_CONNECTIONS_DEFAULT;\n this.initialSize = INITIAL_SIZE_DEFAULT;\n this.incrementSize = INCREMENT_SIZE_DEFAULT;\n this.maxSize = MAX_SIZE_DEFAULT;\n this.shrink = SHRINK_DEFAULT;\n this.connectionConfig.connectionTimeout = CONNECTION_TIMEOUT_DEFAULT;\n this.connectionConfig.loginTimeout = LOGIN_TIMEOUT_DEFAULT;\n this.connectionConfig.fetchArray = FETCH_ARRAY_DEFAULT;\n }\n // connectionString is an object, so ensure that connectionString is a\n // property on that object and then copy over any configuration options.\n else if (typeof connectionString === 'object')\n {\n const configObject = connectionString;\n if (!Object.prototype.hasOwnProperty.call(configObject, 'connectionString')) {\n throw new TypeError('Pool configuration object must contain \"connectionString\" key');\n }\n\n this.connectionConfig.connectionString = configObject.connectionString;\n\n // reuseConnections\n this.reuseConnections = configObject.reuseConnections !== undefined ? configObject.reuseConnections : REUSE_CONNECTIONS_DEFAULT;\n\n // initialSize\n this.initialSize = configObject.initialSize !== undefined ? configObject.initialSize : INITIAL_SIZE_DEFAULT;\n\n // incrementSize\n this.incrementSize = configObject.incrementSize !== undefined ? configObject.incrementSize : INCREMENT_SIZE_DEFAULT;\n\n // maxSize\n this.maxSize = configObject.maxSize !== undefined ? configObject.maxSize : MAX_SIZE_DEFAULT;\n\n // shrink\n this.shrink = configObject.shrink !== undefined ? configObject.shrink : SHRINK_DEFAULT;\n\n // connectionTimeout\n this.connectionConfig.connectionTimeout = configObject.connectionTimeout !== undefined ? configObject.connectionTimeout : CONNECTION_TIMEOUT_DEFAULT;\n\n // loginTimeout\n this.connectionConfig.loginTimeout = configObject.loginTimeout !== undefined ? configObject.loginTimeout : LOGIN_TIMEOUT_DEFAULT;\n \n // fetchArray\n this.connectionConfig.fetchArray = configObject.fetchArray || FETCH_ARRAY_DEFAULT; \n\n // connectingQueueMax\n // unlike other configuration values, this one is set statically on the\n // ConnectionQueue object and not on the Pool intance\n if (configObject.maxActivelyConnecting !== undefined)\n {\n ConnectionQueue.maxActivelyConnecting = configObject.maxActivelyConnecting\n }\n }\n // connectionString was neither a string nor and object, so throw an error.\n else\n {\n throw TypeError('Pool constructor must passed a connection string or a configuration object');\n }\n }\n\n // returns a open connection, ready to use.\n // should overwrite the 'close' function of the connection, and rename it is 'nativeClose', so\n // that that close can still be called.\n async connect(callback = undefined) {\n\n let connection;\n\n if (this.freeConnections.length == 0) {\n\n // If the number of connections waiting is more (shouldn't happen) or\n // equal to the number of connections connecting, and the number of\n // connections in the pool, in the process of connecting, and that will be\n // added is less than the maximum number of allowable connections, then\n // we will need to create MORE connections.\n if (this.connectionsBeingCreatedCount <= this.waitingConnectionWork.length &&\n this.poolSize + this.connectionsBeingCreatedCount + this.incrementSize <= this.maxSize)\n {\n this.increasePoolSize(this.incrementSize);\n }\n\n // If no callback was provided when connect was called, we need to create\n // a promise to return back. We also need to save off the resolve function\n // of that promises callback, so that we can call it to resolve the\n // function we returned\n if (typeof callback == 'undefined') {\n let resolveConnectionPromise;\n let rejectConnectionPromise;\n\n const promise = new Promise((resolve, reject) => {\n resolveConnectionPromise = resolve;\n rejectConnectionPromise = reject;\n });\n const promiseObj = {\n promise: promise,\n resolveFunction: resolveConnectionPromise,\n rejectFunction: rejectConnectionPromise,\n }\n // push the promise onto the waitingConnectionWork queue, then return\n // it to the user\n this.waitingConnectionWork.push(promiseObj);\n return promise;\n }\n // If a callback was provided, we can just add that to the\n // waitingConnectionWork queue, then return undefined to the user. Their\n // callback will execute when a connection is ready\n else\n {\n this.waitingConnectionWork.push(callback)\n return undefined;\n }\n }\n // Else, there was a free connection available for the user, so either\n // return an immediately resolved promise, or call their callback\n // immediately.\n else\n {\n connection = this.freeConnections.pop();\n\n // promise...\n if (typeof callback === 'undefined') {\n return Promise.resolve(connection);\n } else {\n // ...or callback\n return callback(null, connection);\n }\n }\n };\n\n async query(sql, params, opts, cb) {\n // determine the parameters passed\n let callback = cb;\n let parameters = params;\n let options = opts;\n\n if (typeof callback === 'undefined') {\n if (typeof options === 'function')\n {\n callback = options;\n if (typeof parameters === 'object' && !Array.isArray(parameters))\n {\n options = parameters;\n parameters = null;\n } else {\n options = null;\n }\n } else if (\n typeof options === 'undefined' &&\n typeof parameters === 'function')\n {\n callback = parameters;\n options = null;\n parameters = null;\n }\n }\n\n if (typeof callback !== 'function') {\n return new Promise((resolve, reject) => {\n this.connect((error, connection) => {\n if (error) {\n reject(error);\n }\n\n connection.query(sql, parameters, options, (error, result) => {\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n connection.close();\n });\n });\n });\n }\n\n // ...or callback\n this.connect((error, connection) => {\n if (error) {\n throw error;\n }\n\n return connection.query(sql, parameters, options, (error, result) => {\n // after running, close the connection whether error or not\n process.nextTick(() => {\n callback(error, result);\n });\n connection.close();\n });\n });\n }\n\n // close the pool and all of the connections\n async close(callback = undefined) {\n const connections = [...this.freeConnections];\n this.freeConnections.length = 0;\n this.isOpen = false;\n\n if (typeof callback === 'undefined') {\n return new Promise((resolve, reject) => {\n async.each(connections, (connection, cb) => {\n connection.nativeClose((error) => {\n this.poolSize--;\n cb(error);\n });\n }, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve(error);\n }\n });\n });\n }\n\n async.each(this.freeConnections, (connection, cb) => {\n connection.nativeClose((error) => {\n this.poolSize--;\n cb(error);\n });\n }, error => callback(error));\n }\n\n async init(callback = undefined) {\n if (!this.isOpen) {\n this.isOpen = true;\n // promise...\n if (typeof callback === 'undefined') {\n return new Promise(async (resolve, reject) => {\n try {\n await this.increasePoolSize(this.initialSize);\n // Try to get one connection during init to make sure there were\n // no errors with the connection string\n const connection = await this.connect();\n this.freeConnections.unshift(connection);\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ...or callback\n try {\n await this.increasePoolSize(this.initialSize);\n let connection = await this.connect();\n connection.close();\n } catch (error) {\n return callback(error);\n }\n return callback(null);\n }\n return undefined;\n }\n\n generateConnectPromise = function(connectionConfig) {\n return new Promise((resolve, reject) => {\n odbc.connect(connectionConfig, (error, nativeConnection) => {\n if (error) {\n // When there is a connection error, emit a \"connectionError\" event\n // with the error that is then either handled by any waiting work, or\n // is silently swallowed if no work is waiting. This is so that a bad\n // attempt at connecting doesn't throw an uncatchable error when there\n // is no user work, crashing the entire application.\n //\n // Catchable errors occur:\n // 1. When a pool is initialized and there was a problem with the\n // first connection (no network, bad connection string, etc.)\n // 2. When a user is attempting to do work and there are no active\n // connections, the pool will attempt to connect, emit the error, and\n // send it to the user work that was waiting (either as an error\n // parameter in the user's callback, or as a thrown error that the\n // user has to catch.)\n this.pool.connectionEmitter.emit('connectionError', error);\n\n // This reject is swallowed in the ConnectionQueue's dequeue function\n // in all cases, and is simply to end the Promise that was generated\n // by generateConnectPromise.\n reject(error);\n return;\n }\n\n this.pool.connectionsBeingCreatedCount--;\n this.pool.poolSize++;\n let connection = new Connection(nativeConnection);\n connection.nativeClose = connection.close;\n\n if (this.pool.reuseConnections) {\n connection.close = async (closeCallback = undefined) => {\n this.pool.connectionEmitter.emit('connected', connection);\n\n if (typeof closeCallback === 'undefined') {\n return new Promise((resolve, reject) => {\n resolve();\n })\n }\n\n return closeCallback(null);\n };\n } else {\n connection.close = async (closeCallback = undefined) => {\n this.pool.increasePoolSize(1);\n if (typeof closeCallback === 'undefined') {\n return new Promise((resolve, reject) => {\n connection.nativeClose((error, result) => {\n this.pool.poolSize--;\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n });\n });\n }\n \n connection.nativeClose(closeCallback);\n }\n }\n\n this.pool.connectionEmitter.emit('connected', connection);\n resolve();\n });\n });\n }\n\n // odbc.connect runs on an AsyncWorker, so this is truly non-blocking\n async increasePoolSize(count) {\n this.connectionsBeingCreatedCount += count;\n for (let i = 0; i < count; i++)\n {\n ConnectionQueue.enqueue(this, this.generateConnectPromise, this.connectionConfig);\n }\n }\n}\n\nmodule.exports.Pool = Pool;\n","const binary = require('@mapbox/node-pre-gyp');\nconst path = require('path');\n\nconst bindingPath = binary.find(path.resolve(path.join(__dirname, '../package.json')));\n\nconst nativeOdbc = require(bindingPath);\n\nconst { Connection } = require('./Connection');\nconst { Pool } = require('./Pool');\n\nfunction connect(connectionString, callback) {\n if (typeof callback !== 'function') {\n return new Promise((resolve, reject) => {\n nativeOdbc.connect(connectionString, (error, odbcConnection) => {\n if (error) {\n reject(error);\n } else {\n const connection = new Connection(odbcConnection);\n resolve(connection);\n }\n });\n });\n }\n\n return nativeOdbc.connect(connectionString, (error, odbcConnection) => {\n if (!error) {\n return callback(error, new Connection(odbcConnection));\n }\n return callback(error, null);\n });\n}\n\nfunction pool(options, callback) {\n const poolObj = new Pool(options);\n\n if (typeof callback !== 'function') {\n return new Promise(async (resolve, reject) => {\n try {\n await poolObj.init();\n resolve(poolObj);\n } catch(e) {\n reject(e);\n }\n });\n }\n\n return poolObj.init((error) => {\n callback(error, poolObj);\n });\n}\n\nmodule.exports = {\n pool,\n connect,\n ...nativeOdbc.odbcConstants,\n};\n","import odbc from \"odbc\";\nimport { PsqlConfiguration } from \"./configuration\";\nimport { ERPResponse } from \"../../types/erp-types\";\nimport { OdbcErrorResponse } from \"./internal/types/psql-types\";\nimport logger from \"../reporting-service/logger\";\n\ntype PagingParams = {\n limit?: number;\n offset?: number;\n};\n\nexport class PsqlService {\n private connection: odbc.Connection | null = null;\n private config: PsqlConfiguration;\n\n constructor(config: PsqlConfiguration) {\n this.config = config;\n }\n\n async dispose() {\n await this.closeConnection();\n }\n\n /**\n * Build PSQL ODBC connection string\n * CRITICAL: ServerName must use IP.PORT format (e.g., 10.4.0.11.1583)\n */\n private buildConnectionString(): string {\n // PSQL requires ServerName in format IP.PORT (not IP:PORT)\n const serverName = `${this.config.host}.${this.config.port}`;\n\n return (\n [\n \"Driver={Pervasive ODBC Interface}\",\n `ServerName=${serverName}`,\n `DBQ=${this.config.database}`,\n `UID=${this.config.username}`,\n `PWD=${this.config.password}`,\n \"AutoDoubleQuote=0\",\n ].join(\";\") + \";\"\n );\n }\n\n /**\n * Execute a query and return the results\n * Interface matches SqlServerService for consistency\n *\n * @param query The SQL query to execute\n * @param params Query parameters (currently unused for PSQL read operations)\n * @param paging Optional paging parameters\n * @returns The entities fetched from the database, along with paging information\n */\n public async executePreparedStatement(\n query: string,\n params: Record<string, string> = {},\n paging?: PagingParams\n ): Promise<ERPResponse | undefined> {\n const connection = await this.openConnection();\n\n let records;\n try {\n // For Phase 1 (read-only), we execute queries directly\n // Phase 2 will add proper parameter binding for INSERT/UPDATE/DELETE\n if (Object.keys(params).length > 0) {\n logger.warn(\n \"PsqlService: Query parameters provided but parameter binding not yet implemented. \" +\n \"Using direct query execution. This is acceptable for Phase 1 read operations.\"\n );\n }\n\n records = await connection.query(query);\n } catch (error) {\n const errorInfo = error as OdbcErrorResponse;\n logger.error(\"Error fetching data from PSQL\", {\n error: errorInfo.message,\n odbcErrors: errorInfo.odbcErrors,\n });\n\n throw this.handleOdbcError(errorInfo);\n }\n\n const allRecords = PsqlService.recordsetToRecords(records);\n const rowsFetched = allRecords.length;\n\n // Apply paging if requested\n const pagedData =\n paging?.offset !== undefined || paging?.limit !== undefined\n ? allRecords.slice(\n paging.offset || 0,\n (paging.offset || 0) + (paging.limit || allRecords.length)\n )\n : allRecords;\n\n return {\n data: pagedData,\n paging: {\n count: rowsFetched,\n limit: paging?.limit || 0,\n offset: paging?.offset || 0,\n nextPage:\n paging?.limit && (paging.offset || 0) + paging.limit < rowsFetched\n ? String((paging.offset || 0) + paging.limit)\n : undefined,\n previousPage: paging?.offset\n ? String(Math.max(0, (paging.offset || 0) - (paging.limit || 10)))\n : undefined,\n },\n };\n }\n\n /**\n * Opens a connection to PSQL database\n * Caches the connection so that it can be reused.\n * On failure to connect, throws\n */\n async openConnection(): Promise<odbc.Connection> {\n // If we have a connection, reuse it\n // Note: ODBC connections don't have a .connected property like SQL Server\n // We'll keep it simple and reuse if not null\n if (this.connection) {\n logger.debug(\"Reusing existing PSQL connection\");\n return this.connection;\n }\n\n try {\n const connStr = this.buildConnectionString();\n logger.info(\"Opening new PSQL connection\");\n logger.debug(\n \"Connection string (password hidden):\",\n connStr.replace(/PWD=[^;]+/, \"PWD=***\")\n );\n\n this.connection = await odbc.connect(connStr);\n logger.info(\"Successfully connected to PSQL database\");\n return this.connection;\n } catch (error) {\n logger.error(\"PsqlService>>openConnection>> Connection failed\", {\n error,\n });\n throw this.handleOdbcError(error as OdbcErrorResponse);\n }\n }\n\n /**\n * Transform ODBC result set to array of Record<string, string> instances.\n * IMPORTANT: PSQL CHAR fields are often padded with spaces - we trim them\n *\n * @param recordset Result set from ODBC query\n * @returns array of Record<string, string> instances\n */\n public static recordsetToRecords(recordset: any[]): Record<string, string>[] {\n if (!Array.isArray(recordset)) {\n return [];\n }\n\n const data: Record<string, string>[] = recordset.map((row) => {\n const transformedRow: Record<string, string> = {};\n Object.keys(row).forEach((key) => {\n const value = row[key];\n // Convert to string and trim (PSQL CHAR fields have trailing spaces)\n transformedRow[key] =\n value !== null && value !== undefined ? String(value).trim() : \"\";\n });\n return transformedRow;\n });\n\n return data;\n }\n\n /**\n * Handle ODBC errors and provide meaningful messages\n */\n private handleOdbcError(error: OdbcErrorResponse): Error {\n const odbcError = error.odbcErrors?.[0];\n const errorCode = odbcError?.state;\n const message = odbcError?.message || error.message;\n\n switch (errorCode) {\n case \"08S01\":\n return new Error(\n \"PSQL connection failed. Check: \" +\n \"1) PVSW environment variable set to /usr/local/psql/etc/pvsw.ini, \" +\n \"2) Network connectivity to ports 1583/3351, \" +\n \"3) ODBC configuration files in /usr/local/psql/etc/ and /etc/. \" +\n `Original error: ${message}`\n );\n case \"28000\":\n return new Error(\n `PSQL authentication failed. Check username/password. Original error: ${message}`\n );\n case \"42000\":\n return new Error(`PSQL SQL syntax error. Original error: ${message}`);\n case \"42S02\":\n return new Error(\n `PSQL table or view not found. Check table names in query. Original error: ${message}`\n );\n default:\n return new Error(`PSQL error (${errorCode || \"unknown\"}): ${message}`);\n }\n }\n\n private async closeConnection(): Promise<void> {\n if (this.connection) {\n logger.info(\"Closing PSQL connection\");\n try {\n await this.connection.close();\n } catch (error) {\n logger.error(\"PsqlService::closeConnection: Error closing connection\", {\n error,\n });\n }\n this.connection = null;\n }\n }\n}\n","/**\n * PSQL Labor Ticket Operations\n *\n * Phase 2: This will handle INSERT/UPDATE/DELETE operations for labor tickets\n * Phase 1: Placeholder - throws errors if called\n */\n\nimport { PsqlService } from \"../psql-service\";\nimport { MMReceiveLaborTicket } from \"../../../services/mm-api-service\";\nimport logger from \"../../reporting-service/logger\";\n\nexport class PsqlLaborTicketOperations {\n constructor(private service: PsqlService) {}\n\n /**\n * Create labor ticket in START_LABOR table\n *\n * Phase 2 Implementation Notes:\n * - Will use prepared statements with parameter binding\n * - Insert into START_LABOR table\n * - Return GUID as erpUid\n *\n * @param laborTicket Labor ticket from MachineMetrics\n * @returns Labor ticket and ERP unique ID\n */\n async createLaborTicket(\n laborTicket: MMReceiveLaborTicket\n ): Promise<{ laborTicket: MMReceiveLaborTicket; erpUid: string }> {\n logger.warn(\n \"PsqlLaborTicketOperations.createLaborTicket not yet implemented (Phase 2)\"\n );\n throw new Error(\n \"Labor ticket creation not implemented for PSQL. This is a Phase 2 feature.\"\n );\n }\n\n /**\n * Update labor ticket (move from START_LABOR to COMPLETED_LABOR)\n *\n * Phase 2 Implementation Notes:\n * - Insert into COMPLETED_LABOR\n * - Delete from START_LABOR\n * - Should be done in a transaction\n *\n * @param laborTicket Labor ticket to update\n * @returns Updated labor ticket\n */\n async updateLaborTicket(\n laborTicket: MMReceiveLaborTicket\n ): Promise<MMReceiveLaborTicket> {\n logger.warn(\n \"PsqlLaborTicketOperations.updateLaborTicket not yet implemented (Phase 2)\"\n );\n throw new Error(\n \"Labor ticket update not implemented for PSQL. This is a Phase 2 feature.\"\n );\n }\n}\n","/**\n * Helper functions for PSQL/Pervasive database operations\n */\n\n/**\n * Formats a date from PSQL YYMMDD format to ISO date string\n * @param psqlDate Date in YYMMDD format (e.g., \"250105\" for Jan 5, 2025)\n * @returns ISO date string (e.g., \"2025-01-05\") or null if invalid\n */\nexport function formatPsqlDate(psqlDate: string): string | null {\n if (!psqlDate || psqlDate === \"000000\" || psqlDate.trim() === \"\") {\n return null;\n }\n\n try {\n const year = parseInt(psqlDate.substring(0, 2), 10);\n const month = parseInt(psqlDate.substring(2, 4), 10);\n const day = parseInt(psqlDate.substring(4, 6), 10);\n\n // Convert 2-digit year to 4-digit (assuming 2000s)\n const fullYear = year + 2000;\n\n // Basic validation\n if (month < 1 || month > 12 || day < 1 || day > 31) {\n return null;\n }\n\n const date = new Date(fullYear, month - 1, day);\n return date.toISOString().split(\"T\")[0];\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Formats a time from PSQL HHMM format to HH:MM:SS\n * @param psqlTime Time in HHMM format (e.g., \"1430\" for 2:30 PM)\n * @returns Time string in HH:MM:SS format or null if invalid\n */\nexport function formatPsqlTime(psqlTime: string): string | null {\n if (!psqlTime || psqlTime.trim() === \"\") {\n return null;\n }\n\n try {\n const hours = psqlTime.substring(0, 2);\n const minutes = psqlTime.substring(2, 4);\n return `${hours}:${minutes}:00`;\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Combines PSQL date and time into ISO datetime string\n * @param psqlDate Date in YYMMDD format\n * @param psqlTime Time in HHMM format\n * @returns ISO datetime string or null if invalid\n */\nexport function combinePsqlDateTime(\n psqlDate: string,\n psqlTime: string\n): string | null {\n const date = formatPsqlDate(psqlDate);\n const time = formatPsqlTime(psqlTime);\n\n if (!date || !time) {\n return null;\n }\n\n return `${date}T${time}`;\n}\n\n/**\n * Helper to check if a PSQL date is \"empty\" (000000 or blank)\n */\nexport function isPsqlDateEmpty(psqlDate: string): boolean {\n return !psqlDate || psqlDate === \"000000\" || psqlDate.trim() === \"\";\n}\n\n/**\n * Clean and trim PSQL CHAR field (removes trailing spaces)\n * PSQL CHAR fields are fixed-width and padded with spaces\n */\nexport function cleanPsqlCharField(value: string | null | undefined): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n return String(value).trim();\n}\n"],"names":["ERPType","ERPObjType","Operator","config","timeout","error","c","httpError","UrlBase","path","name","description","a","laborTicketResult","DEFAULT_RETRY_ATTEMPTS","filter","query","messageToSend","fs","require$$1","require$$2","os","require$$4","s3","require$$5","abbrev","require$$3","nopt","types","val","d","validate","require$$0","util","TrackerBase","trackerBaseModule","Tracker","trackerModule","TrackerStream","trackerStreamModule","trackerStream","tracker","TrackerGroup","trackerGroupModule","trackerGroup","trackerId","up","down","forward","back","nextLine","previousLine","horizontalAbsolute","eraseData","eraseLine","hideCursor","showCursor","color","ansiRegex","stripAnsi","isFullwidthCodePoint","isFullwidthCodePointModule","_default","emojiRegex","stringWidth","stringWidthModule","align","wideTruncate","User","MissingTemplateValue","Internal","TemplateItem","renderTemplate","renderTemplateModule","index","Plumbing","plumbingModule","hasUnicode","hasUnicodeModule","colorSupport","hasColor","process","global","signalExitModule","unload","emit","load","processReallyExit","processEmit","objectAssign","spin","progressBar","parent","themes","themesModule","process_1","setImmediateModule","setInterval","require$$6","setImmediate","require$$7","stream","Gauge","log","setBlocking","consoleControl","prefix","err","base","version","old","range","left","right","concatMap","z","minimatch","Minimatch","makeRe","braceExpand","set","re","pathIsAbsoluteModule","m","common","cb","onceModule","once","require$$8","require$$9","require$$10","require$$11","g","sync","er","stat","p","binary","semver","valid","comparator","constants","identifiers","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","require$$39","require$$40","reject","family","napi","require","versioning","Cursor","Cursor_1","Statement","sql","Statement_1","Connection","Connection_1","applyEach","dependencies","promiseCallback","hasOwnProperty","EventEmitter","async","bindingPath","odbc","pool","Pool","resolve","Pool_1"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACO,IAAK,4BAAAA,aAAL;AACLA,WAAA,SAAA,IAAU;AACVA,WAAA,MAAA,IAAO;AACPA,WAAA,UAAA,IAAW;AACXA,WAAA,WAAA,IAAY;AACZA,WAAA,SAAA,IAAU;AACVA,WAAA,UAAA,IAAW;AACXA,WAAA,UAAA,IAAW;AACXA,WAAA,YAAA,IAAa;AARH,SAAAA;AAAA,GAAA,WAAA,CAAA,CAAA;AAWL,IAAK,+BAAAC,gBAAL;AACLA,cAAAA,YAAA,WAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,OAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,gBAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,aAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,uBAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,SAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,SAAA,IAAA,CAAA,IAAA;AACAA,cAAAA,YAAA,eAAA,IAAA,CAAA,IAAA;AARU,SAAAA;AAAA,GAAA,cAAA,CAAA,CAAA;ACRL,IAAK,6BAAAC,cAAL;AACLA,YAAA,IAAA,IAAK;AACLA,YAAA,IAAA,IAAK;AACLA,YAAA,KAAA,IAAM;AACNA,YAAA,IAAA,IAAK;AACLA,YAAA,KAAA,IAAM;AALI,SAAAA;AAAA,GAAA,YAAA,CAAA,CAAA;AAgDL,MAAM,wBAAwB,CACnC,YACA,aACW;AACX,SAAO,WACJ;AAAA,IACC,CAAC,cACC,GAAG,UAAU,KAAK,IAAI,UAAU,QAAQ,KAAK,UAAU,KAAK;AAAA,EAAA,EAE/D,KAAK,IAAI,QAAQ,GAAG;AACzB;AC1DO,MAAM,qBAAqB;AAAA,EAChC,YAAY,MAAqC;AAC/C,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,+BAA8C;AAChD,UAAM,aAAa,KAAK,oBAAoB;AAC5C,WAAO,OAAO,eAAe,YAC3B,eAAe,MACf,CAAC,MAAM,KAAK,MAAM,UAAU,CAAC,IAC3B,aACA;AAAA,EACN;AAAA,EAEA,IAAI,6BAA6B,OAAsB;AACrD,QAAI,KAAK,oBAAoB;AAC3B,WAAK,mBAAmB,aAAa;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,sBAA8B;AAChC,WAAO,KAAK,iCAAiC,OAAO,IAAI;AAAA,EAC1D;AAAA;AAAA,EAIA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AACF;ACnDO,MAAM,kBAAkB,MAAM;AAAA,EACnC,YACE,SACO,QACA,MACA,MACP;AACA,UAAM,OAAO;AAJN,SAAA,SAAA;AACA,SAAA,OAAA;AACA,SAAA,OAAA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAiCO,MAAM,kBAAkB;AAAA,EAC7B,OAAO,YAAYC,SAAsC;AACvD,WAAO,IAAI,YAAYA,QAAO,SAASA,QAAO,aAAa;AAAA,EAC7D;AACF;AAEA,MAAM,YAAkC;AAAA,EAC9B,SAA+B;AAAA,EAC/B;AAAA,EACA,cAAuB;AAAA,EACvB,0CAAgD,IAAA;AAAA,EAChD,sCAA0D,IAAA;AAAA,EAC1D,4CAA6C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrD,YAAY,SAAiB,eAAuB;AAClD,SAAK,SAAS,MAAM,OAAO;AAAA,MACzB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,QACP,gBAAgB;AAAA,MAAA;AAAA,IAClB,CACD;AACD,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,UAAI,KAAK,aAAa;AACpB,gBAAA;AACA;AAAA,MACF;AACA,YAAMC,WAAU,WAAW,MAAM;AAC/B,aAAK,gBAAgB,OAAOA,QAAO;AACnC,aAAK,sBAAsB,OAAO,OAAO;AACzC,gBAAA;AAAA,MACF,GAAG,EAAE;AACL,WAAK,gBAAgB,IAAIA,QAAO;AAChC,WAAK,sBAAsB,IAAI,OAAO;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QACJD,SAC0B;AAC1B,QAAI,KAAK,eAAe,CAAC,KAAK,QAAQ;AACpC,YAAM,IAAI,UAAU,kCAAkC,GAAG;AAAA,IAC3D;AAEA,UAAM,aAAa,IAAI,gBAAA;AACvB,SAAK,oBAAoB,IAAI,UAAU;AAEvC,UAAM,cAAkC;AAAA,MACtC,QAAQA,QAAO;AAAA,MACf,KAAKA,QAAO;AAAA,MACZ,SAASA,QAAO;AAAA,MAChB,MAAMA,QAAO;AAAA,MACb,QAAQA,QAAO;AAAA,MACf,QAAQ,WAAW;AAAA,IAAA;AAGrB,WAAO,KAAK,yBAAyB;AAAA,MACnC,KAAKA,QAAO;AAAA,MACZ,QAAQA,QAAO;AAAA,MACf,SAAS,KAAK,OAAO,SAAS;AAAA,MAC9B,eAAe,KAAK;AAAA,IAAA,CACrB;AAGD,YAAQ,IAAI,wBAAwB;AACpC,YAAQ,IAAI,YAAY,KAAK,OAAO,SAAS,OAAO;AACpD,YAAQ,IAAI,iBAAiBA,QAAO,GAAG;AACvC,YAAQ,IAAI,0BAA0B,KAAK,OAAO,SAAS,WAAW,MAAMA,QAAO,GAAG;AACtF,YAAQ,IAAI,WAAWA,QAAO,MAAM;AAEpC,QAAI;AACJ,QAAI;AACF,eAAS,UAAU,GAAG,WAAW,KAAK,eAAe,WAAW;AAC9D,YAAI;AACF,iBAAO,KAAK,wBAAwB,UAAU,CAAC,IAAI,KAAK,gBAAgB,CAAC,EAAE;AAC3E,gBAAM,WAAW,MAAM,KAAK,OAAO,QAAW,WAAW;AACzD,iBAAO,KAAK,0BAA0B,EAAE,QAAQ,SAAS,QAAQ;AACjE,iBAAO;AAAA,YACL,MAAM,SAAS;AAAA,YACf,QAAQ,SAAS;AAAA,YACjB,SAAS,SAAS;AAAA,UAAA;AAAA,QAEtB,SAASE,QAAO;AACd,sBAAYA;AAEZ,gBAAM,aAAaA,kBAAiB;AACpC,gBAAM,OAAO,aAAaA,OAAM,OAAO;AACvC,gBAAM,SAAS,aAAaA,OAAM,UAAU,SAAS;AACrD,gBAAM,mBAAmBA,kBAAiB,QAAQA,OAAM,YAAY,OAAO;AAC3E,gBAAM,UAAUA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AAErE,iBAAO,KAAK,wBAAwB,UAAU,CAAC,WAAW;AAAA,YACxD,WAAW,OAAOA;AAAA,YAClB;AAAA,YACA,cAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,UAAA,CACD;AAGD,cACEA,kBAAiB,cACjBA,OAAM,UAAU,UAChBA,OAAM,SAAS,UAAU,OACzBA,OAAM,SAAS,SAAS,KACxB;AACA,mBAAO,KAAK,sCAAsC;AAClD;AAAA,UACF;AAGA,cAAIA,kBAAiB,cAAcA,OAAM,SAAS,gBAAgB;AAChE;AAAA,UACF;AAGA,cAAI,UAAU,KAAK,eAAe;AAChC,kBAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI;AACxC,mBAAO,KAAK,WAAW,QAAQ,iBAAiB;AAChD,kBAAM,KAAK,MAAM,QAAQ;AACzB,gBAAI,KAAK,aAAa;AACpB,oBAAM,IAAI,UAAU,kCAAkC,GAAG;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAA;AACE,WAAK,oBAAoB,OAAO,UAAU;AAAA,IAC5C;AACA,WAAO,KAAK,uDAAuD;AACnE,UAAM,KAAK,YAAY,WAAWF,OAAM;AAAA,EAC1C;AAAA,EAEA,YAAYE,QAAgB,eAA8C;AACxE,QAAIA,kBAAiB,YAAY;AAE/B,YAAM,UAAU,KAAK,QAAQ,SAAS,WAAW;AACjD,YAAM,UAAU,gBACZ,GAAG,OAAO,GAAG,cAAc,GAAG,KAC9B;AACJ,YAAM,SAAS,eAAe,UAAU;AAExC,YAAM,eAAe,GAAGA,OAAM,OAAO,KAAK,MAAM,IAAI,OAAO;AAE3D,aAAO,IAAI;AAAA,QACT;AAAA,QACAA,OAAM,UAAU,UAAU;AAAA,QAC1BA,OAAM;AAAA,QACNA,OAAM,UAAU;AAAA,MAAA;AAAA,IAEpB;AACA,WAAO,IAAI;AAAA,MACTA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,MACzC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AAGnB,eAAWC,MAAK,KAAK,qBAAqB;AACxC,UAAI;AAAE,QAAAA,GAAE,MAAA;AAAA,MAAS,QAAQ;AAAA,MAAqD;AAAA,IAChF;AACA,SAAK,oBAAoB,MAAA;AAGzB,eAAW,KAAK,KAAK,iBAAiB;AACpC,mBAAa,CAAC;AAAA,IAChB;AACA,SAAK,gBAAgB,MAAA;AACrB,eAAW,WAAW,KAAK,uBAAuB;AAChD,UAAI;AAAE,gBAAA;AAAA,MAAW,QAAQ;AAAA,MAAiD;AAAA,IAC5E;AACA,SAAK,sBAAsB,MAAA;AAG3B,SAAK,SAAS;AAAA,EAChB;AACF;AC/NO,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,UAAM,SAAS,iBAAA;AACf,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,kBAAkB,QAAQ,aAC3B,IAAI,KAAK,OAAO,UAAU,IAC1B;AACJ,UAAMH,UAAS,kBAAkB,KAAA;AACjC,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,IAAI,wBAAwBA,QAAO,YAAY;AACvD,YAAQ,IAAI,uBAAuB,OAAO,KAAKA,OAAM,CAAC;AACtD,SAAK,UAAUA,QAAO;AACtB,YAAQ,IAAI,wBAAwB,KAAK,OAAO;AAChD,YAAQ,IAAI,mCAAmC;AAC/C,SAAK,MAAM,kBAAkB,YAAY;AAAA,MACvC,SAAS,KAAK;AAAA,MACd,eAAeA,QAAO;AAAA,IAAA,CACvB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAA0B;AAChC,QAAI,CAAC,KAAK,gBAAiB,QAAO;AAGlC,UAAM,eAAe;AACrB,UAAM,YACJ,KAAK,gBAAgB,YAAY,gBAAgB,KAAK,IAAA;AACxD,QAAI,WAAW;AACb,aAAO,KAAK,mDAAmD;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBAAmB,OAA4B;AACrD,QAAI;AAEF,YAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,UAAI,MAAM,WAAW,GAAG;AACtB,gBAAQ,KAAK,iDAAiD;AAC9D,eAAO;AAAA,MACT;AAGA,YAAM,UAAU,OAAO,KAAK,MAAM,CAAC,GAAG,QAAQ,EAAE,SAAS,OAAO;AAChE,YAAM,iBAAiB,KAAK,MAAM,OAAO;AAGzC,UAAI,OAAO,eAAe,QAAQ,UAAU;AAC1C,gBAAQ,KAAK,kDAAkD;AAC/D,eAAO;AAAA,MACT;AAGA,aAAO,IAAI,KAAK,eAAe,MAAM,GAAI;AAAA,IAC3C,SAASE,QAAO;AACd,cAAQ,KAAK,4BAA4BA,MAAK;AAC9C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,WAA4B;AACvC,QAAI,KAAK,SAAS,CAAC,KAAK,kBAAkB;AACxC,aAAO,KAAK;AAAA,IACd;AAEA,UAAMF,UAAS,kBAAkB,KAAA;AACjC,UAAM,eAAeA,QAAO;AAC5B,UAAM,gBAAgB,MAAM,KAAK,IAAI,QAAgB;AAAA,MACnD,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,YAAY;AAAA,MAAA;AAAA,IACvC,CACD;AAED,SAAK,QAAQ,cAAc;AAC3B,SAAK,kBAAkB,KAAK,mBAAmB,KAAK,KAAK;AAGzD,qBAAiB;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK,iBAAiB,aAAa;AAAA,IAAA,CAChD;AAED,WAAO,KAAK,oDAAoD;AAChE,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAwB;AAC7B,SAAK,QAAQ;AACb,SAAK,kBAAkB;AACvB,qBAAiB,EAAE,OAAO,IAAI,YAAY,MAAM;AAAA,EAClD;AACF;ACvHO,MAAM,qBAAqB,MAAM;AAAA,EACtC,YACE,SACO,QACP;AACA,UAAM,OAAO;AAFN,SAAA,SAAA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAMO,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,OAAO,OAAOE,QAAuB;AAEnC,QAAIA,kBAAiB,WAAW;AAE9B,UACEA,OAAM,QACN,OAAOA,OAAM,SAAS,YACtB,YAAYA,OAAM,MAClB;AACA,cAAM,eAAe,IAAI;AAAA,UACvB;AAAA,UACCA,OAAM,KAA0C;AAAA,QAAA;AAInD,eAAO,MAAM,kBAAkB;AAAA,UAC7B,SAAS,aAAa;AAAA,UACtB,QAAQ,aAAa;AAAA,QAAA,CACtB;AAED,cAAM;AAAA,MACR;AAGA,aAAO,MAAM,eAAe;AAAA,QAC1B,QAAQA,OAAM;AAAA,QACd,SAASA,OAAM;AAAA,QACf,MAAMA,OAAM;AAAA,QACZ,MAAMA,OAAM;AAAA,MAAA,CACb;AAED,YAAMA;AAAA,IACR;AAGA,QAAIA,kBAAiB,YAAY;AAE/B,UAAIA,OAAM,UAAU,MAAM,QAAQ;AAChC,cAAM,eAAe,IAAI;AAAA,UACvB;AAAA,UACAA,OAAM,SAAS,KAAK;AAAA,QAAA;AAItB,eAAO,MAAM,kBAAkB;AAAA,UAC7B,SAAS,aAAa;AAAA,UACtB,QAAQ,aAAa;AAAA,QAAA,CACtB;AAED,cAAM;AAAA,MACR;AAGA,YAAME,aAAY,IAAI;AAAA,QACpBF,OAAM;AAAA,QACNA,OAAM,UAAU,UAAU;AAAA,QAC1BA,OAAM;AAAA,QACNA,OAAM,UAAU;AAAA,MAAA;AAIlB,aAAO,MAAM,eAAe;AAAA,QAC1B,QAAQE,WAAU;AAAA,QAClB,SAASA,WAAU;AAAA,QACnB,MAAMA,WAAU;AAAA,QAChB,MAAMA,WAAU;AAAA,MAAA,CACjB;AAED,YAAMA;AAAAA,IACR;AAGA,UAAM,YAAY,IAAI;AAAA,MACpBF,kBAAiB,QAAQA,OAAM,UAAU;AAAA,MACzC;AAAA,IAAA;AAIF,WAAO,MAAM,kBAAkB;AAAA,MAC7B,SAAS,UAAU;AAAA,MACnB,QAAQ,UAAU;AAAA,IAAA,CACnB;AAED,UAAM;AAAA,EACR;AACF;AC9FA,MAAM,UAAU;AAChB,MAAM,cAAc;AACpB,MAAM,iBAAiB;AACvB,MAAM,UAAU;AAEhB,IAAK,4BAAAG,aAAL;AACEA,WAAA,eAAA,IAAgB;AAChBA,WAAA,SAAA,IAAU;AAFP,SAAAA;AAAA,GAAA,WAAA,CAAA,CAAA;AASE,MAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EAEQ;AAAA,EAER,eAAe;AAAA,IACb,CAAC,WAAW,SAAS,GAAG;AAAA,IACxB,CAAC,WAAW,KAAK,GAAG;AAAA,IACpB,CAAC,WAAW,cAAc,GAAG;AAAA,IAC7B,CAAC,WAAW,WAAW,GAAG;AAAA,IAC1B,CAAC,WAAW,qBAAqB,GAAG;AAAA,IACpC,CAAC,WAAW,OAAO,GAAG;AAAA,IACtB,CAAC,WAAW,OAAO,GAAG;AAAA,IACtB,CAAC,WAAW,aAAa,GAAG;AAAA,IAC5B,CAAC,OAAO,GAAG;AAAA,IACX,CAAC,WAAW,GAAG;AAAA,IACf,CAAC,cAAc,GAAG;AAAA,IAClB,CAAC,OAAO,GAAG;AAAA,EAAA;AAAA,EAGb,cAAc;AACZ,SAAK,WAAW,IAAI,eAAA;AACpB,SAAK,WAAW;AAAA,MACd;AAAA,QAAC;AAAA;AAAA,MAAA,GAAwB,kBAAkB,OAAO;AAAA,MAClD;AAAA,QAAC;AAAA;AAAA,MAAA,GAAkB,kBAAkB,OAAO;AAAA,IAAA;AAE9C,SAAK,MAAM,kBAAkB,YAAY;AAAA,MACvC,SAAS;AAAA,MACT,eAAe,kBAAkB,OAAO;AAAA,IAAA,CACzC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,qBACZ,WACA,UAA8B,IAClB;AACZ,QAAI,QAAQ,QAAQ,SAAU,MAAM,KAAK,SAAS,SAAA;AAElD,QAAI;AACF,aAAO,MAAM,UAAU,KAAK;AAAA,IAC9B,SAASH,QAAgB;AAEvB,YAAM,YAAY,CAAC,QAA4C;AAC7D,eAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,YAAY;AAAA,MAChE;AAGA,YAAM,cACJ,UAAUA,MAAK,MAAMA,OAAM,WAAW,OAAOA,OAAM,WAAW;AAEhE,UAAI,eAAe,CAAC,QAAQ,OAAO;AAEjC,eAAO,KAAK,qDAAqD;AACjE,aAAK,SAAS,gBAAA;AACd,gBAAQ,MAAM,KAAK,SAAS,SAAA;AAC5B,eAAO,MAAM,UAAU,KAAK;AAAA,MAC9B;AAEA,YAAMA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAc,QAGZI,OACA,cAAyC,CAAA,GACzC,UAII,CAAA,GAC4B;AAChC,QAAI;AACF,aAAO,MAAM,KAAK,qBAAqB,OAAO,UAAU;AACtD,cAAM,UAAU,QAAQ,WAAW;AACnC,cAAM,SAAS,IAAI,gBAAgB;AAAA,UACjC,GAAG;AAAA,UACH,GAAI,YAAY,kBAAwB,EAAE,KAAK,OAAA,IAAW,CAAA;AAAA,QAAC,CAC5D;AACD,cAAM,MAAM,OAAO,OAAO,IAAI,GAAGA,KAAI,IAAI,OAAO,SAAA,CAAU,KAAKA;AAC/D,cAAM,UAAU,KAAK,SAAS,OAAO,IAAI;AACzC,cAAM,SAAS,MAAM,KAAK,IAAI,QAAgB;AAAA,UAC5C,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe,UAAU,KAAK;AAAA,YAC9B,GAAG,QAAQ;AAAA,UAAA;AAAA,QACb,CACD;AAGD,eAAO;AAAA,UACL,GAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,QAAA;AAAA,MAEvB,GAAG,OAAO;AAAA,IACZ,SAASJ,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAc,SAGZI,OACA,OAAe,CAAA,GACf,cAAyC,CAAA,GACzC,UAII,IAC4B;AAChC,QAAI;AACF,aAAO,MAAM,KAAK,qBAAqB,OAAO,UAAU;AACtD,cAAM,UAAU,QAAQ,WAAW;AACnC,cAAM,SAAS,IAAI,gBAAgB;AAAA,UACjC,GAAG;AAAA,UACH,GAAI,YAAY,kBACZ,EAAE,QAAQ,QAAQ,KAAK,WACvB,CAAA;AAAA,QAAC,CACN;AACD,cAAM,MAAM,OAAO,OAAO,IAAI,GAAGA,KAAI,IAAI,OAAO,SAAA,CAAU,KAAKA;AAC/D,cAAM,UAAU,KAAK,SAAS,OAAO,IAAI;AACzC,cAAM,UAA6B;AAAA,UACjC,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,IAAI;AAAA,UACzB,SAAS;AAAA,YACP,eAAe,UAAU,KAAK;AAAA,YAC9B,GAAG,QAAQ;AAAA,UAAA;AAAA,QACb;AAGF,cAAM,SAAS,MAAM,KAAK,IAAI,QAAgB,OAAO;AAGrD,eAAO;AAAA,UACL,GAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,QAAA;AAAA,MAEvB,GAAG,OAAO;AAAA,IACZ,SAASJ,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAc,WAGZI,OACA,OAAe,CAAA,GACf,UAII,CAAA,GAC4B;AAChC,QAAI;AACF,aAAO,MAAM,KAAK,qBAAqB,OAAO,UAAU;AACtD,cAAM,UAAU,QAAQ,WAAW;AACnC,cAAM,SAAS,IAAI,gBAAgB;AAAA,UACjC,GAAI,YAAY,kBAAwB,EAAE,KAAK,OAAA,IAAW,CAAA;AAAA,QAAC,CAC5D;AACD,cAAM,MAAM,OAAO,OAAO,IAAI,GAAGA,KAAI,IAAI,OAAO,SAAA,CAAU,KAAKA;AAC/D,cAAM,UAAU,KAAK,SAAS,OAAO,IAAI;AACzC,cAAM,SAAS,MAAM,KAAK,IAAI,QAAgB;AAAA,UAC5C,KAAK;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,YACP,eAAe,UAAU,KAAK;AAAA,YAC9B,GAAG,QAAQ;AAAA,UAAA;AAAA,QACb,CACD;AAGD,eAAO;AAAA,UACL,GAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,QAAA;AAAA,MAEvB,GAAG,OAAO;AAAA,IACZ,SAASJ,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAc,UAGZI,OACA,OAAe,CAAA,GACf,UAII,CAAA,GAC4B;AAChC,QAAI;AACF,aAAO,MAAM,KAAK,qBAAqB,OAAO,UAAU;AACtD,cAAM,UAAU,QAAQ,WAAW;AACnC,cAAM,SAAS,IAAI,gBAAgB;AAAA,UACjC,GAAI,YAAY,kBAAwB,EAAE,KAAK,OAAA,IAAW,CAAA;AAAA,QAAC,CAC5D;AACD,cAAM,MAAM,OAAO,OAAO,IAAI,GAAGA,KAAI,IAAI,OAAO,SAAA,CAAU,KAAKA;AAC/D,cAAM,UAAU,KAAK,SAAS,OAAO,IAAI;AACzC,cAAM,UAA6B;AAAA,UACjC,KAAK;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,YACP,eAAe,UAAU,KAAK;AAAA,YAC9B,GAAG,QAAQ;AAAA,UAAA;AAAA,QACb;AAGF,cAAM,SAAS,MAAM,KAAK,IAAI,QAAgB,OAAO;AAGrD,eAAO;AAAA,UACL,GAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,QAAA;AAAA,MAEvB,GAAG,OAAO;AAAA,IACZ,SAASJ,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAc,eACZ,eACA,OAC4B;AAC5B,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,QAChB,KAAK,aAAa,OAAO;AAAA,QACzB,EAAE,eAAe,MAAA;AAAA,QACjB,CAAA;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,OAAO,kBAAkB,KAAA,EAAO;AAAA,UAChC,SAAS,EAAE,gBAAgB,mBAAA;AAAA,QAAmB;AAAA,MAChD;AAAA,IAEJ,SAASA,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,gBACZ,YAC4B;AAC5B,UAAM,EAAE,QAAQ,OAAO,eAAA,IAAmB;AAC1C,WAAO,KAAK,QAAQ,KAAK,aAAa,WAAW,GAAG;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBACJ,WAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,SAAS,GAAG;AAAA,MAClE,MAAM,UAAU,IAAI,CAAC,aAAa,SAAS,iBAAiB;AAAA,IAAA,CAC7D;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cACJ,OAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,KAAK,GAAG;AAAA,MAC9D,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,iBAAiB;AAAA,IAAA,CACjD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBACJ,YAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,cAAc,GAAG;AAAA,MACvE,MAAM,WAAW,IAAI,CAAC,cAAc,UAAU,iBAAiB;AAAA,IAAA,CAChE;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBACJ,YAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,WAAW,GAAG;AAAA,MACpE,MAAM,WAAW,IAAI,CAAC,cAAc,UAAU,iBAAiB;AAAA,IAAA,CAChE;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,4BACJ,qBAC4B;AAC5B,WAAO,MAAM,KAAK;AAAA,MAChB,KAAK,aAAa,WAAW,qBAAqB;AAAA,MAClD;AAAA,QACE,MAAM,oBAAoB;AAAA,UAAI,CAAC,cAC7B,UAAU,gBAAA;AAAA,QAAgB;AAAA,MAC5B;AAAA,IACF;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBACJ,SAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,OAAO,GAAG;AAAA,MAChE,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,iBAAiB;AAAA,IAAA,CACvD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBACJ,SAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,OAAO,GAAG;AAAA,MAChE,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,iBAAiB;AAAA,IAAA,CACvD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBACJ,cAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,aAAa,GAAG;AAAA,MACtE,MAAM,aAAa,IAAI,CAAC,WAAW,OAAO,iBAAiB;AAAA,IAAA,CAC5D;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBACJ,cAC4B;AAC5B,WAAO,MAAM,uBAAuB,EAAE,aAAA,CAAc;AACpD,WAAO,MAAM,KAAK,WAAW,KAAK,aAAa,WAAW,aAAa,GAAG;AAAA,MACxE;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,+BAA2D;AAC/D,WAAO,MAAM,KAAK;AAAA,MAChB,GAAG,KAAK,aAAa,WAAW,aAAa,CAAC;AAAA,IAAA;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBACJ,OACiC;AACjC,UAAM,UAAW,MAAM,KAAK;AAAA,MAC1B,GAAG,KAAK,aAAa,WAAW,aAAa,CAAC;AAAA,MAC9C;AAAA,IAAA;AAEF,WAAO,QAAQ,KAAK,IAAI,CAAC,WAAW,IAAI,qBAAqB,MAAM,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,YAAoD;AACtE,WAAO,MAAM,KAAK,gBAAgB,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,YAAoD;AACvE,WAAO,MAAM,KAAK,SAAS,KAAK,aAAa,WAAW,GAAG,UAAU;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAqB,YAAuC;AAChE,UAAM,oBAAoB,MAAM,KAAK,gBAAgB,UAAU;AAE/D,WAAO,KAAK,sBAAsB,EAAE,kBAAA,CAAmB;AACvD,WAAO,KAAK,2BAA2B;AAAA,MACrC,MAAM,OAAO,KAAK,qBAAqB,CAAA,CAAE;AAAA,IAAA,CAC1C;AAMD,UAAM,qBAAqB;AAC3B,UAAM,oBACJ,sBAAsB,mBAAmB;AAE3C,QAAI,CAAC,mBAAmB;AACtB,aAAO,KAAK,mDAAmD;AAC/D,YAAM,iBAAiB,MAAM,KAAK,eAAe,UAAU;AAC3D,aAAO,KAAK,mBAAmB,EAAE,eAAA,CAAgB;AAAA,IACnD,OAAO;AACL,aAAO,KAAK,8BAA8B;AAAA,QACxC,WAAW,mBAAmB;AAAA,MAAA,CAC/B;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,mBACX,MACA,SAC4B;AAC5B,YAAQ,MAAA;AAAA,MACN,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,KAAK,cAAc,OAAqC;AAAA,MACvE,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,KAAK;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ;AACE,cAAM,IAAI,MAAM,qBAAqB,WAAW,IAAI,CAAC,EAAE;AAAA,IAAA;AAAA,EAE7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,yBACJ,gBACA,eAC4B;AAC5B,WAAO,MAAM,KAAK;AAAA,MAChB,GAAG,KAAK,aAAa,WAAW,aAAa,CAAC,IAAI,cAAc;AAAA,MAChE,EAAE,cAAA;AAAA,IAAc;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBACJ,QACA,kBAC4B;AAC5B,WAAO,MAAM,KAAK;AAAA,MAChB,GAAG,KAAK,aAAa,WAAW,aAAa,CAAC;AAAA,MAC9C,EAAE,iBAAA;AAAA,MACF,EAAE,OAAA;AAAA,IAAO;AAAA,EAEb;AAAA,EAEA,MAAM,wBACJ,QACiC;AACjC,UAAM,gBAAiB,MAAM,KAAK;AAAA,MAChC,GAAG,KAAK,aAAa,WAAW,aAAa,CAAC;AAAA,MAC9C,EAAE,OAAA;AAAA,IAAO;AAEX,WAAO,cAAc,gBAAgB;AAAA,MACnC,CAAC,WAAW,IAAI,qBAAqB,MAAM;AAAA,IAAA;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,UAA0F;AAC/G,WAAO,MAAM,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,QAAE,SAAS;AAAA;AAAA,MAAA;AAAA,IAAgB;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAsB,MAAwF;AAClH,WAAO,MAAM,KAAK;AAAA,MAChB;AAAA,MACA,EAAE,KAAA;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QAAE,SAAS;AAAA;AAAA,MAAA;AAAA,IAAgB;AAAA,EAE/B;AAAA,EAEA,MAAM,2BACJ,QACA,iBAC4B;AAC5B,WAAO,MAAM,KAAK;AAAA,MAChB,GAAG,KAAK,aAAa,WAAW,aAAa,CAAC;AAAA,MAC9C,EAAE,gBAAA;AAAA,MACF,EAAE,OAAA;AAAA,IAAO;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAuD;AAC3D,WAAQ,MAAM,KAAK;AAAA,MACjB,KAAK,aAAa,cAAc;AAAA,MAChC,CAAA;AAAA,MACA;AAAA,QAAE,SAAS;AAAA;AAAA,MAAA;AAAA,IAAgB;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,4BAAgE;AACpE,WAAQ,MAAM,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAyB;AAC7B,UAAM,KAAK,IAAI,QAAA;AAAA,EAGjB;AAAA;AAGF;ACjsBO,MAAM,aAAyC;AAAA,EACpD,YACS,UACA,WACA,UACA,UACP;AAJO,SAAA,WAAA;AACA,SAAA,YAAA;AACA,SAAA,WAAA;AACA,SAAA,WAAA;AAAA,EACN;AAAA,EAEH,kBAA0C;AACxC,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK,WAAW,MAAM;AAAA,IAAA;AAAA,EAEpC;AAAA,EAEA,OAAO,gBAAgB,MAAmD;AACxE,WAAO,IAAI;AAAA,MACT,KAAK,YAAY;AAAA,MACjB,KAAK,aAAa;AAAA,MAClB,KAAK,YAAY;AAAA,MACjB,KAAK,aAAa;AAAA,IAAA;AAAA,EAEtB;AACF;AAEO,MAAM,eAA2C;AAAA,EACtD,YACS,YACAK,OACA,iBACAC,cACA,MACA,4BACA,uBACP;AAPO,SAAA,aAAA;AACA,SAAA,OAAAD;AACA,SAAA,kBAAA;AACA,SAAA,cAAAC;AACA,SAAA,OAAA;AACA,SAAA,6BAAA;AACA,SAAA,wBAAA;AAAA,EACN;AAAA,EAEH,kBAA0C;AACxC,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,iBAAiB,KAAK,kBAAkB,MAAM;AAAA,MAC9C,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,4BAA4B,KAAK,2BAA2B,SAAA;AAAA,MAC5D,uBAAuB,KAAK,sBAAsB,SAAA;AAAA,IAAS;AAAA,EAE/D;AAAA,EAEA,OAAO,gBAAgB,MAAqD;AAC1E,WAAO,IAAI;AAAA,MACT,KAAK,cAAc;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb,KAAK,oBAAoB;AAAA,MACzB,KAAK,eAAe;AAAA,MACpB,KAAK,QAAQ;AAAA,MACb,WAAW,KAAK,8BAA8B,GAAG;AAAA,MACjD,WAAW,KAAK,yBAAyB,GAAG;AAAA,IAAA;AAAA,EAEhD;AACF;AAEO,MAAM,WAAuC;AAAA,EAClD,YACS,YACA,cACA,QACP;AAHO,SAAA,aAAA;AACA,SAAA,eAAA;AACA,SAAA,SAAA;AAAA,EACN;AAAA,EAEH,kBAA0C;AACxC,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,OAAO,gBAAgB,MAAiD;AACtE,WAAO,IAAI;AAAA,MACT,KAAK,cAAc;AAAA,MACnB,KAAK,gBAAgB;AAAA,MACrB,KAAK,UAAU;AAAA,IAAA;AAAA,EAEnB;AACF;AAEO,MAAM,oBAAgD;AAAA,EAC3D,YACS,YACA,cACA,QACA,gBACA,YACA,aACA,aACAA,cACA,iBACP;AATO,SAAA,aAAA;AACA,SAAA,eAAA;AACA,SAAA,SAAA;AACA,SAAA,iBAAA;AACA,SAAA,aAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAAA;AACA,SAAA,kBAAA;AAAA,EACN;AAAA,EAEH,kBAAiD;AAC/C,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,gBAAgB,KAAK;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK,YAAY,SAAA;AAAA,MAC9B,aAAa,KAAK,YAAY,SAAA;AAAA,MAC9B,aAAa,KAAK;AAAA,MAClB,iBAAiB,KAAK,gBAAgB,SAAA;AAAA,IAAS;AAAA,EAEnD;AAAA,EAEA,OAAO,gBACL,MACqB;AACrB,WAAO,IAAI;AAAA,MACT,KAAK,cAAc;AAAA,MACnB,KAAK,gBAAgB;AAAA,MACrB,KAAK,UAAU;AAAA,MACf,KAAK,kBAAkB;AAAA,MACvB,KAAK,cAAc;AAAA,MACnB,SAAS,KAAK,eAAe,GAAG;AAAA,MAChC,SAAS,KAAK,eAAe,GAAG;AAAA,MAChC,KAAK,eAAe;AAAA,MACpB,WAAW,KAAK,mBAAmB,GAAG;AAAA,IAAA;AAAA,EAE1C;AACF;AAEO,MAAM,gBAA4C;AAAA,EACvD,YACS,aACA,KACA,OACA,KACA,QACA,SACAA,cACA,oBACA,kBACA,YACA,kBACA,YACA,cACA,QACP;AAdO,SAAA,cAAA;AACA,SAAA,MAAA;AACA,SAAA,QAAA;AACA,SAAA,MAAA;AACA,SAAA,SAAA;AACA,SAAA,UAAA;AACA,SAAA,cAAAA;AACA,SAAA,qBAAA;AACA,SAAA,mBAAA;AACA,SAAA,aAAA;AACA,SAAA,mBAAA;AACA,SAAA,aAAA;AACA,SAAA,eAAA;AACA,SAAA,SAAA;AAAA,EACN;AAAA,EAEH,kBAAiD;AAC/C,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,oBAAoB,KAAK;AAAA,MACzB,kBAAkB,KAAK;AAAA,MACvB,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK,iBAAiB,SAAA;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,OAAO,gBAAgB,MAAsD;AAC3E,WAAO,IAAI;AAAA,MACT,KAAK,eAAe;AAAA,MACpB,KAAK,OAAO;AAAA,MACZ,KAAK,SAAS;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,KAAK,UAAU;AAAA,MACf,KAAK,WAAW;AAAA,MAChB,KAAK,eAAe;AAAA,MACpB,KAAK,sBAAsB;AAAA,MAC3B,KAAK,oBAAoB;AAAA,MACzB,KAAK,cAAc;AAAA,MACnB,WAAW,KAAK,oBAAoB,GAAG;AAAA,MACvC,KAAK,cAAc;AAAA,MACnB,KAAK,gBAAgB;AAAA,MACrB,KAAK,UAAU;AAAA,IAAA;AAAA,EAEnB;AACF;AAEO,MAAM,yBAAqD;AAAA,EAChE,YACS,aACA,KACA,OACA,KACA,gBACA,YACA,eACA,gBACA,oBACA,oBACA,qBACA,YACA,aACA,aACA,4BACA,uBACA,eACA,iBACA,QACP;AAnBO,SAAA,cAAA;AACA,SAAA,MAAA;AACA,SAAA,QAAA;AACA,SAAA,MAAA;AACA,SAAA,iBAAA;AACA,SAAA,aAAA;AACA,SAAA,gBAAA;AACA,SAAA,iBAAA;AACA,SAAA,qBAAA;AACA,SAAA,qBAAA;AACA,SAAA,sBAAA;AACA,SAAA,aAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AACA,SAAA,6BAAA;AACA,SAAA,wBAAA;AACA,SAAA,gBAAA;AACA,SAAA,kBAAA;AACA,SAAA,SAAA;AAAA,EACN;AAAA,EAEH,kBAAiD;AAC/C,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB,eAAe,KAAK,cAAc,SAAA;AAAA,MAClC,gBAAgB,KAAK,eAAe,SAAA;AAAA,MACpC,oBAAoB,KAAK,mBAAmB,SAAA;AAAA,MAC5C,oBAAoB,KAAK;AAAA,MACzB,qBAAqB,KAAK;AAAA,MAC1B,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK,YAAY,SAAA;AAAA,MAC9B,aAAa,KAAK,YAAY,SAAA;AAAA,MAC9B,4BAA4B,KAAK,2BAA2B,SAAA;AAAA,MAC5D,uBAAuB,KAAK,sBAAsB,SAAA;AAAA,MAClD,eAAe,KAAK;AAAA,MACpB,iBAAiB,KAAK,gBAAgB,SAAA;AAAA,MACtC,QAAQ,KAAK;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,OAAO,gBACL,MAC0B;AAC1B,WAAO,IAAI;AAAA,MACT,KAAK,eAAe;AAAA,MACpB,KAAK,OAAO;AAAA,MACZ,KAAK,SAAS;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,KAAK,kBAAkB;AAAA,MACvB,KAAK,cAAc;AAAA,MACnB,WAAW,KAAK,iBAAiB,GAAG;AAAA,MACpC,WAAW,KAAK,kBAAkB,GAAG;AAAA,MACrC,WAAW,KAAK,sBAAsB,GAAG;AAAA,MACzC,KAAK,sBAAsB;AAAA,MAC3B,KAAK,uBAAuB;AAAA,MAC5B,KAAK,cAAc;AAAA,MACnB,SAAS,KAAK,eAAe,GAAG;AAAA,MAChC,SAAS,KAAK,eAAe,GAAG;AAAA,MAChC,WAAW,KAAK,8BAA8B,GAAG;AAAA,MACjD,WAAW,KAAK,yBAAyB,GAAG;AAAA,MAC5C,KAAK,iBAAiB;AAAA,MACtB,WAAW,KAAK,mBAAmB,GAAG;AAAA,MACtC,KAAK,UAAU;AAAA,IAAA;AAAA,EAEnB;AACF;AAEO,MAAM,aAAyC;AAAA,EACpD,YACS,UACA,UACA,MACAA,cACA,YACP;AALO,SAAA,WAAA;AACA,SAAA,WAAA;AACA,SAAA,OAAA;AACA,SAAA,cAAAA;AACA,SAAA,aAAA;AAAA,EACN;AAAA,EAEH,kBAA0C;AACxC,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IAAA;AAAA,EAErB;AAAA,EAEA,OAAO,gBAAgB,MAAmD;AACxE,WAAO,IAAI;AAAA,MACT,KAAK,YAAY;AAAA,MACjB,KAAK,YAAY;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,KAAK,eAAe;AAAA,MACpB,KAAK,cAAc;AAAA,IAAA;AAAA,EAEvB;AACF;AAEO,MAAM,kBAA8C;AAAA,EACzD,YACS,aACA,KACA,OACA,KACA,gBACA,YACA,UACA,eACA,iBACA,SACA,UACA,WACA,UACA,MACA,SACA,OACP;AAhBO,SAAA,cAAA;AACA,SAAA,MAAA;AACA,SAAA,QAAA;AACA,SAAA,MAAA;AACA,SAAA,iBAAA;AACA,SAAA,aAAA;AACA,SAAA,WAAA;AACA,SAAA,gBAAA;AACA,SAAA,kBAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,YAAA;AACA,SAAA,WAAA;AACA,SAAA,OAAA;AACA,SAAA,UAAA;AACA,SAAA,QAAA;AAAA,EACN;AAAA,EAEH,kBAAiD;AAC/C,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,eAAe,KAAK;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,WAAW,KAAK,UAAU,SAAA;AAAA,MAC1B,UAAU,KAAK,SAAS,SAAA;AAAA,MACxB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEA,OAAO,gBACL,MACmB;AACnB,WAAO,IAAI;AAAA,MACT,KAAK,eAAe;AAAA,MACpB,KAAK,OAAO;AAAA,MACZ,KAAK,SAAS;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,KAAK,kBAAkB;AAAA,MACvB,KAAK,cAAc;AAAA,MACnB,KAAK,YAAY;AAAA,MACjB,KAAK,iBAAiB;AAAA,MACtB,KAAK,mBAAmB;AAAA,MACxB,KAAK,WAAW;AAAA,MAChB,KAAK,YAAY;AAAA,MACjB,SAAS,KAAK,aAAa,GAAG;AAAA,MAC9B,SAAS,KAAK,YAAY,GAAG;AAAA,MAC7B,KAAK,QAAQ;AAAA,MACb,KAAK,WAAW;AAAA,MAChB,KAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AACF;AC5WO,SAAS,cACd,MACA,QACA,YACK;AACL,QAAM,qBAAqB,CAAC,SAAoB;AAC9C,WAAO,OAAO,IAAI,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,EAC5D;AAEA,QAAM,iCAAiB,IAAA;AACvB,QAAM,aAAkB,CAAA;AAExB,OAAK,QAAQ,CAAC,SAAS;AACrB,UAAM,MAAM,mBAAmB,IAAI;AACnC,QAAI,CAAC,WAAW,IAAI,GAAG,GAAG;AACxB,iBAAW,IAAI,GAAG;AAClB,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF,CAAC;AAED,MAAI,cAAc,WAAW,SAAS,GAAG;AACvC,eAAW,KAAK,CAACC,IAAG,MAAM;AACxB,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,QAAQ,WAAW,CAAC;AAC1B,YAAIA,GAAE,KAAK,IAAI,EAAE,KAAK,EAAG,QAAO;AAChC,YAAIA,GAAE,KAAK,IAAI,EAAE,KAAK,EAAG,QAAO;AAAA,MAClC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,cAAc,CAAA;AACvB;AClCO,MAAM,yBAAyB,CACpC,WACA,iBACgB;AAChB,QAAM,OACJ,UAAU,IAAI,CAAC,QAAQ;AACrB,UAAM,iBAA4B,CAAA;AAClC,WAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,QAAQ;AAChC,UAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,uBAAe,GAAG,IAAI,IAAI,GAAG,GAAG,cAAc;AAAA,MAChD;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,CAAC,KAAK,CAAA;AAER,SAAO;AACT;AChBO,MAAM,2BAA2B,CACtC,WACA,YACgB;AAChB,QAAM,OACJ,UAAU,IAAI,CAAC,QAAQ;AACrB,UAAM,iBAA4B,CAAA;AAClC,WAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,QAAQ;AAChC,UAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,uBAAe,GAAG,IAAI,IAAI,GAAG,GAAG,cAAc;AAAA,MAChD;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,CAAC,KAAK,CAAA;AAER,SAAO;AACT;AClBO,MAAM,mBAAmB,CAAmB,QAAc;AAC/D,SAAO,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,KAAK,QAAQ;AAC3C,UAAM,QAAQ,IAAI,GAAc;AAChC,QAAI,GAAc,IAChB,OAAO,UAAU,WAAW,MAAM,SAAS;AAE7C,WAAO;AAAA,EACT,GAAG,CAAA,CAAO;AACZ;ACXO,MAAM,iBAAiB,CAAC,SAAiB;AAE9C,SAAO,KAAK,SAAA,EAAW,QAAQ,cAAc,EAAE;AAC/C,SAAO;AACT;ACIO,MAAM,gCAAgC,CAC3C,MACA,gBACA,yBACA,cACA,eAAuB,QACM;AAC7B,SAAO,KAAK,IAAI,CAAC,YAAY;AAC3B,UAAM,aAAa,eAAe;AAAA,MAChC,CAAC,aACC,SAAS,uBAAuB,MAAM,QAAQ,uBAAuB;AAAA,IAAA;AAEzE,UAAM,gBAAgB,aAAa,YAAY,KAAK;AAEpD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,CAAC,YAAY,GAAG;AAAA,IAAA;AAAA,EAEpB,CAAC;AACH;AAWO,MAAM,6BAA6B,CACxC,MACA,gBACA,aACA,cACA,cACA,eAAuB,QACM;AAC7B,SAAO,KAAK,IAAI,CAAC,YAAY;AAC3B,UAAM,aAAa,eAAe;AAAA,MAChC,CAAC,aAAa,SAAS,WAAW,MAAM,QAAQ,YAAY;AAAA,IAAA;AAE9D,UAAM,gBAAgB,aAAa,YAAY,KAAK;AAEpD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,CAAC,YAAY,GAAG;AAAA,IAAA;AAAA,EAEpB,CAAC;AACH;ACjDO,MAAM,oBAAoB,YAA6B;AAC5D,MAAI;AAEF,UAAMT,UAAS,kBAAkB,KAAA;AACjC,UAAM,SAASA,QAAO;AACtB,UAAM,YAAYA,QAAO;AAEzB,QAAI,CAAC,UAAU,CAAC,WAAW;AACzB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAGA,UAAM,SAAS,kBAAkB,YAAY;AAAA,MAC3C,SAAS;AAAA,MACT,eAAeA,QAAO;AAAA,IAAA,CACvB;AAGD,UAAM,WAAW,MAAM,OAAO,QAA2C;AAAA,MACvE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,SAAS;AAAA,MAAA;AAAA,IACpC,CACD;AAED,UAAM,WAAW,SAAS;AAC1B,QAAI,CAAC,UAAU,SAAS,UAAU;AAChC,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAGA,UAAM,2BAAW,KAAA;AACjB,UAAM,UAAU,IAAI,KAAK,KAAK,eAAe,SAAS,EAAE,UAAU,MAAA,CAAO,CAAC;AAC1E,UAAM,SAAS,IAAI;AAAA,MACjB,KAAK,eAAe,SAAS,EAAE,UAAU,SAAS,QAAQ,UAAU;AAAA,IAAA;AAItE,YAAQ,OAAO,QAAA,IAAY,QAAQ,aAAa;AAAA,EAClD,SAASE,QAAO;AACd,UAAM,IAAI;AAAA,MACR,kCAAkCA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAAA;AAAA,EAE9F;AACF;AAQO,MAAM,qBAAqB,CAChC,UACA,mBACqB;AACrB,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,SAAO,IAAI,KAAK,KAAK,QAAA,IAAY,iBAAiB,KAAK,KAAK,GAAI;AAClE;AAQO,MAAM,yBAAyB,CACpC,MACA,mBACuB;AACvB,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,UAAU,KAAK,QAAQ,KAAK,GAAG;AAGrC,QAAM,OAAO,kBAAkB,IAAI,MAAM;AACzC,QAAM,YAAY,KAAK,IAAI,cAAc;AACzC,QAAM,QAAQ,KAAK,MAAM,SAAS,EAAE,WAAW,SAAS,GAAG,GAAG;AAC9D,QAAM,UAAU,KAAK,MAAO,YAAY,IAAK,EAAE,EAC5C,SAAA,EACA,SAAS,GAAG,GAAG;AAGlB,SAAO,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,IAAI,OAAO;AAC7C;AChFO,SAAS,+BACd,WACA,SACA,gBACQ;AACR,MAAI,CAAC,aAAa,CAAC,QAAS,QAAO;AAEnC,QAAM,iBAAiB,mBAAmB,WAAW,cAAc;AACnE,QAAM,eAAe,mBAAmB,SAAS,cAAc;AAE/D,MAAI,CAAC,kBAAkB,CAAC,aAAc,QAAO;AAG7C,QAAM,aAAa,eAAe,SAAA;AAClC,QAAM,eAAe,eAAe,WAAA;AACpC,QAAM,eAAe,eAAe,WAAA;AAEpC,QAAM,WAAW,aAAa,SAAA;AAC9B,QAAM,aAAa,aAAa,WAAA;AAChC,QAAM,aAAa,aAAa,WAAA;AAGhC,QAAM,oBACJ,aAAa,OAAO,eAAe,KAAK;AAC1C,QAAM,kBAAkB,WAAW,OAAO,aAAa,KAAK;AAE5D,MAAI,kBAAkB,mBAAmB;AACvC,WAAO,SAAS,kBAAkB,qBAAqB,MAAM,QAAQ,CAAC,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,MAAM,kBAAkB,CAAC,cAA6B;AAC3D,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,OAAO,IAAI,KAAK,SAAS;AAE/B,QAAM,WAAW,KAAK,YAAA;AACtB,QAAM,aAAa,KAAK,cAAA;AACxB,QAAM,aAAa,KAAK,cAAA;AAExB,UAAQ,WAAW,OAAO,aAAa,KAAK,YAAY,SAAA;AAC1D;AAUO,MAAM,+BAA+B,CAC1C,MACA,QACA,mBAC2B;AAC3B,QAAM,cAAc,EAAE,GAAG,KAAA;AACzB,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,YAAY,KAAK,KAAK,YAAY,KAAK,EAAE,QAAQ;AACnD,YAAM,gBAAgB;AAAA,QACpB,YAAY,KAAK;AAAA,QACjB;AAAA,MAAA;AAEF,kBAAY,KAAK,IAAI,iBAAiB;AAAA,IACxC,OAAO;AACL,kBAAY,KAAK,IAAI;AAAA,IACvB;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAcO,MAAM,8BAA8B,OACzC,SAA+B;AAAA,EAC7B,YAAY;AAAA;AAAA,EACZ,iBAAiB;AACnB,MACkB;AAClB,MAAI,UAAU;AACd,MAAI,UAAU;AACd,SAAO;AAAA,IACL;AAAA,EAAA;AAEF,SAAO,CAAC,WAAW,UAAU,OAAO,YAAY;AAC9C,QAAI;AACF,YAAM,cAAc,MAAM,kBAAA;AAC1B,aAAO,KAAK,oBAAoB,WAAW,QAAQ;AACnD,+BAAyB,WAAW;AACpC,gBAAU;AAAA,IACZ,SAASA,QAAO;AACd,aAAO,MAAM,kCAAkCA,MAAK;AACpD,aAAO,KAAK,eAAe,OAAO,kBAAkB,GAAI,aAAa;AACrE,YAAM,IAAI;AAAA,QAAQ,CAAC,YACjB,WAAW,SAAS,OAAO,eAAe;AAAA,MAAA;AAE5C;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,2CAA2C,OAAO,UAAU;AAAA,IAAA;AAAA,EAEhE;AACF;AC9HA,MAAM,qCAAqC;AAQpC,MAAM,sBAAsB;AAAA,EACjC;AAAA,EAEA,cAAc;AACZ,SAAK,KAAK,KAAK,OAAO,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAa,QAA8B;AAC/C,QAAI,OAAO,aAAa,OAAO,UAAU;AACvC,YAAM,gBAAgB,MAAM,KAAK,GAAG,kCAAkC,EACnE,MAAM,EAAE,YAAY,OAAO,WAAA,CAAY,EACvC,OAAO,MAAM;AAEhB,UAAI,gBAAgB,GAAG;AACrB,cAAM,KAAK,GAAG,kCAAkC,EAAE,OAAO,MAAM;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,MAAkB;AACxC,WAAO,MAAM,KAAK,GAAG,kCAAkC,EACpD,OAAO,GAAG,EACV,MAAM,EAAE,YAAY,KAAK,SAAA,GAAY;AAAA,EAC1C;AAAA,EAEA,MAAM,UAAU;AACd,WAAO,KAAK,GAAG,QAAA;AAAA,EACjB;AACF;AC3BO,MAAM,kBAAkB;AAAA,EACrB;AAAA,EAER,YAAY,SAAoC;AAC9C,SAAK,eAAe,IAAI,mBAAmB;AAAA,MACzC,KAAK,SAAS;AAAA,MACd,WAAW,SAAS;AAAA,IAAA,CACrB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YACJ,MACA,SAC8B;AAC9B,UAAM,SAA8B;AAAA,MAClC,YAAY,CAAA;AAAA,MACZ,eAAe,CAAA;AAAA,IAAC;AAIlB,eAAW,UAAU,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,aAAa,WAAW,MAAM,MAAM;AAElE,UAAI,YAAY;AACd,eAAO,cAAc,KAAK,MAAM;AAAA,MAClC,OAAO;AACL,eAAO,WAAW,KAAK,MAAM;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WACJ,MACA,SACoC;AAEpC,QAAI,gBAAgB;AACpB,eAAW,UAAU,SAAS;AAC5B,UAAI,MAAM,KAAK,aAAa,MAAM,MAAM,MAAM,GAAG;AAC/C;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,cAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,MAAkB,SAAkC;AAEtE,eAAW,UAAU,SAAS;AAC5B,YAAM,KAAK,aAAa,aAAa,MAAM,MAAM;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,MAAqC;AAC1D,WAAO,KAAK,aAAa,iBAAiB,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,MAAiC;AACzD,WAAO,KAAK,aAAa,oBAAoB,IAAI;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,WAAO,KAAK,aAAa,MAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,WAAO,KAAK,aAAa,QAAA;AAAA,EAC3B;AACF;ACrGO,SAAS,kCACd,aACA,gBACsB;AACtB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,aAAW,QAAQ,CAAC,UAAU;AAC5B,UAAM,YAAY,mBAAmB,YAAY,KAAK,GAAG,cAAc;AACvE,gBAAY,KAAK,IAAI,WAAW,YAAA,KAAiB;AAAA,EACnD,CAAC;AACD,SAAO;AACT;AChBO,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA,EAItC,aAAa,UACX,eACA,WACe;AACf,QAAI;AACF,YAAM,cAAc,IAAI,YAAA;AACxB,YAAM,wBAAkC,CAAA;AAExC,YAAM,YAAY,qBAAqB;AAAA,QACrC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,UACf,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY;AAAA,MACpC,CACD;AAED,YAAM,qBAAoB,oBAAI,KAAA,GAAO,YAAA;AACrC,YAAM,sBAAsB,MAAM,YAAY,wBAAwB;AAAA,QACpE,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAAA,CACjB;AAED,UAAI,oBAAoB,WAAW,GAAG;AACpC,eAAO,KAAK,sDAAsD;AAClE;AAAA,MACF;AAEA,aAAO;AAAA,QACL,gBAAgB,oBAAoB,MAAM;AAAA,QAC1C;AAAA,UACE,cAAc,oBAAoB;AAAA,YAChC,CAAC,YAAkC;AAAA,cACjC,KAAK,OAAO;AAAA,cACZ,IAAI,OAAO;AAAA,YAAA;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAKF,YAAM,mBAAmB,oBAAoB;AAAA,QAC3C,CAAC,QAAuB,WAAiC;AACvD,cAAI,CAAC,UAAU,CAAC,OAAO,UAAW,QAAO;AACzC,iBAAO,IAAI,KAAK,OAAO,SAAS,IAAI,IAAI,KAAK,MAAM,IAC/C,OAAO,YACP;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAGF,YAAM,QAAQ;AAAA,QACZ,oBAAoB,IAAI,OAAO,gBAAsC;AACnE,cAAI,CAAC,YAAY,gBAAgB;AAC/B,mBAAO;AAAA,cACL;AAAA,cACA,EAAE,YAAA;AAAA,YAAY;AAEhB,mBAAO;AAAA,UACT;AAEA,cAAI;AACF,mBAAO,MAAM,KAAK;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ,SAASA,QAAO;AACd,kCAAsB,KAAK,YAAY,cAAc;AACrD,mBAAO;AAAA,cACL,0DAA0D,YAAY,cAAc;AAAA,cACpF,EAAE,OAAAA,OAAA;AAAA,YAAM;AAEV,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MAAA;AAGH,aAAO;AAAA,QACL,0BAA0B,sBAAsB,MAAM;AAAA,MAAA;AAExD,UAAI,sBAAsB,SAAS,GAAG;AACpC,eAAO;AAAA,UACL,oCAAoC,sBAAsB,MAAM;AAAA,UAChE;AAAA,YACE;AAAA,UAAA;AAAA,QACF;AAEF,cAAM,kBAAkB,MAAM,YAAY;AAAA,UACxC;AAAA,UACA;AAAA,QAAA;AAEF,eAAO,KAAK,2CAA2C;AAAA,UACrD;AAAA,QAAA,CACD;AAAA,MACH;AAEA,kBAAY,eAAe;AAAA,QACzB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,UACf,WAAW,oBAAoB;AAAA,QAAA;AAAA,MACjC,CACD;AAAA,IACH,SAASA,QAAO;AACd,aAAO,MAAM,iCAAiCA,MAAK;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YACX,eACA,WACe;AACf,QAAI;AACF,YAAM,cAAc,IAAI,YAAA;AACxB,YAAM,wBAAkC,CAAA;AAExC,YAAM,eACJ,MAAM,YAAY,wBAAwB,aAAa;AACzD,UAAI,aAAa,WAAW,GAAG;AAC7B,eAAO,KAAK,wDAAwD;AACpE;AAAA,MACF;AACA,aAAO;AAAA,QACL,yDACE,aAAa;AAAA,MAAA;AAGjB,YAAM,QAAQ;AAAA,QACZ,aAAa,IAAI,OAAO,gBAAsC;AAC5D,cAAI,CAAC,YAAY,gBAAgB;AAC/B,mBAAO;AAAA,cACL;AAAA,cACA,EAAE,YAAA;AAAA,YAAY;AAEhB,mBAAO;AAAA,UACT;AAEA,cAAI;AACF,kBAAM,oBAAoB,MAAM,KAAK;AAAA,cACnC;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAEF,kCAAsB,KAAK,YAAY,cAAc;AACrD,mBAAO;AAAA,UACT,SAASA,QAAO;AACd,mBAAO;AAAA,cACL;AAAA,cACA,EAAE,gBAAgB,YAAY,gBAAgB,OAAAA,OAAA;AAAA,YAAM;AAEtD,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MAAA;AAGH,UAAI,sBAAsB,SAAS,GAAG;AACpC,eAAO,KAAK,qCAAqC;AAAA,UAC/C;AAAA,QAAA,CACD;AACD,cAAM,qBAAqB,MAAM,YAAY;AAAA,UAC3C;AAAA,UACA;AAAA,QAAA;AAEF,eAAO,KAAK,uBAAuB,EAAE,mBAAA,CAAoB;AAAA,MAC3D;AAAA,IACF,SAASA,QAAO;AACd,aAAO,MAAM,mCAAmCA,MAAK;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,uBACnB,aACA,aACA,mBACe;AACf,UAAM,uBAAuB,MAAM,YAAY;AAAA,MAC7C,YAAY;AAAA,MACZ,kBAAkB;AAAA,IAAA;AAEpB,WAAO;AAAA,MACL,yBAAyB,kBAAkB,aAAa,uBAAuB,YAAY,cAAc;AAAA,MACzG,EAAE,qBAAA;AAAA,IAAqB;AAAA,EAE3B;AAAA,EAEA,aAAqB,mBACnB,WACA,aACA,aAC+B;AAC/B,QAAI;AAEJ,wBAAoB;AAAA,MAClB;AAAA,MACA,wBAAA;AAAA,IAAwB;AAG1B,WAAO;AAAA,MACL,8BAA8B,YAAY,aAAa,SAAS,YAAY,cAAc;AAAA,IAAA;AAE5F,WAAO,MAAM,EAAE,aAAa;AAa5B,QAAI,CAAC,YAAY,eAAe;AAC9B,YAAM,EAAE,aAAaQ,oBAAmB,OAAA,IACtC,MAAM,UAAU,uBAAuB,WAAW;AACpDA,yBAAkB,gBAAgB;AAClC,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACAA;AAAAA,MAAA;AAAA,IAEJ,OAAO;AACL,0BAAoB,MAAM,UAAU,uBAAuB,WAAW;AAAA,IACxE;AAEA,WAAO,KAAK,qCAAqC;AAAA,MAC/C,mBACE,qBAAqB;AAAA,MACvB,gBAAgB,YAAY;AAAA,MAC5B,WAAW,YAAY,gBAAgB,WAAW;AAAA,IAAA,CACnD;AAED,WAAO;AAAA,EACT;AACF;ACnPO,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY7B,OAAO,kBACL,YACA,QACQ;AACR,YAAQ,YAAA;AAAA,MACN,KAAK,WAAW;AACd,eAAO,KAAK,iBAAiB,MAAM;AAAA,MACrC,KAAK,WAAW;AACd,eAAO,KAAK,mBAAmB,MAAM;AAAA,MACvC,KAAK,WAAW;AACd,eAAO,KAAK,eAAe,MAAM;AAAA,MACnC,KAAK,WAAW;AACd,eAAO,KAAK,wBAAwB,MAAM;AAAA,MAC5C,KAAK,WAAW;AACd,eAAO,KAAK,oBAAoB,MAAM;AAAA,MACxC,KAAK,WAAW;AACd,eAAO,KAAK,6BAA6B,MAAM;AAAA,MACjD,KAAK,WAAW;AACd,eAAO,KAAK,sBAAsB,MAAM;AAAA,MAC1C,KAAK,WAAW;AACd,eAAO,KAAK,iBAAiB,MAAM;AAAA,MACrC;AACE,cAAM,IAAI;AAAA,UACR,uDAAuD,UAAU;AAAA,QAAA;AAAA,IACnE;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,yBACL,YACA,WACkB;AAClB,YAAQ,YAAA;AAAA,MACN,KAAK,WAAW;AACd,eAAO,KAAK,kBAAkB,SAAS;AAAA,MACzC,KAAK,WAAW;AACd,eAAO,KAAK,oBAAoB,SAAS;AAAA,MAC3C,KAAK,WAAW;AACd,eAAO,KAAK,gBAAgB,SAAS;AAAA,MACvC,KAAK,WAAW;AACd,eAAO,KAAK,yBAAyB,SAAS;AAAA,MAChD,KAAK,WAAW;AACd,eAAO,KAAK,qBAAqB,SAAS;AAAA,MAC5C,KAAK,WAAW;AACd,eAAO,KAAK,8BAA8B,SAAS;AAAA,MACrD,KAAK,WAAW;AACd,eAAO,KAAK,uBAAuB,SAAS;AAAA,MAC9C,KAAK,WAAW;AACd,eAAO,KAAK,kBAAkB,SAAS;AAAA,MACzC;AACE,cAAM,IAAI;AAAA,UACR,+CAA+C,UAAU;AAAA,QAAA;AAAA,IAC3D;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,iCACL,YACA,gBACoB;AACpB,WAAO,eAAe;AAAA,MAAI,CAAC,cACzB,KAAK,yBAAyB,YAAY,SAAS;AAAA,IAAA;AAAA,EAEvD;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,iBAAiB,QAAkC;AAChE,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK,sBAAsB,eAAe,CAAC,UAAU,GAAG,WAAW;AAAA,MACxE;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,OAAe,mBAAmB,QAAkC;AAClE,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,CAAC,YAAY;AAAA,MACb;AAAA,MACA,CAAC,YAAY;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,OAAe,eAAe,QAAkC;AAC9D,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,CAAC,cAAc,gBAAgB,QAAQ;AAAA,MACvC;AAAA,MACA,CAAC,YAAY;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,OAAe,wBAAwB,QAAkC;AACvE,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,CAAC,cAAc,gBAAgB,UAAU,gBAAgB;AAAA,MACzD;AAAA,MACA,CAAC,cAAc,gBAAgB;AAAA,IAAA;AAAA,EAEnC;AAAA,EAEA,OAAe,oBAAoB,QAAkC;AACnE,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,CAAC,eAAe,OAAO,SAAS,KAAK;AAAA,MACrC;AAAA,MACA,CAAC,aAAa;AAAA,IAAA;AAAA,EAElB;AAAA,EAEA,OAAe,6BACb,QACQ;AACR,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,CAAC,eAAe,OAAO,SAAS,OAAO,gBAAgB;AAAA,MACvD;AAAA,MACA,CAAC,eAAe,gBAAgB;AAAA,IAAA;AAAA,EAEpC;AAAA,EAEA,OAAe,sBAAsB,QAAkC;AACrE,UAAM,gBAAgB,OAAO,gBAAA;AAG7B,QAAI,cAAc,eAAe;AAC/B,aAAO,KAAK;AAAA,QACV;AAAA,QACA,CAAC,eAAe;AAAA,QAChB;AAAA,QACA,CAAC,eAAe;AAAA,MAAA;AAAA,IAEpB,OAAO;AACL,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEF;AAAA,QACA,CAAC,eAAe,kBAAkB,cAAc,UAAU;AAAA,MAAA;AAAA,IAE9D;AAAA,EACF;AAAA,EAEA,OAAe,iBAAiB,QAAkC;AAChE,UAAM,gBAAgB,OAAO,gBAAA;AAC7B,WAAO,KAAK,sBAAsB,eAAe,CAAC,UAAU,GAAG,WAAW;AAAA,MACxE;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,kBACb,WACkB;AAClB,WAAO,aAAa,gBAAgB,SAAS;AAAA,EAC/C;AAAA,EAEA,OAAe,oBACb,WACkB;AAClB,WAAO,eAAe,gBAAgB,SAAS;AAAA,EACjD;AAAA,EAEA,OAAe,gBACb,WACkB;AAClB,WAAO,WAAW,gBAAgB,SAAS;AAAA,EAC7C;AAAA,EAEA,OAAe,yBACb,WACkB;AAClB,WAAO,oBAAoB,gBAAgB,SAAS;AAAA,EACtD;AAAA,EAEA,OAAe,qBACb,WACkB;AAClB,WAAO,gBAAgB,gBAAgB,SAAS;AAAA,EAClD;AAAA,EAEA,OAAe,8BACb,WACkB;AAClB,WAAO,yBAAyB,gBAAgB,SAAS;AAAA,EAC3D;AAAA,EAEA,OAAe,uBACb,WACkB;AAClB,WAAO,kBAAkB,gBAAgB,SAAS;AAAA,EACpD;AAAA,EAEA,OAAe,kBACb,WACkB;AAClB,WAAO,aAAa,gBAAgB,SAAS;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAe,sBACb,eACA,WACA,gBACA,gBACQ;AACR,UAAM,YAAsB,CAAA;AAE5B,eAAW,SAAS,WAAW;AAC7B,YAAM,QAAQ,cAAc,KAAK;AAGjC,UAAI,eAAe,SAAS,KAAK,GAAG;AAClC,YAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,gBAAM,IAAI;AAAA,YACR,sBAAsB,KAAK,yCAAyC,cAAc;AAAA,UAAA;AAAA,QAEtF;AAAA,MACF;AAGA,gBAAU,KAAK,SAAS,EAAE;AAAA,IAC5B;AAEA,WAAO,UAAU,KAAK,GAAG;AAAA,EAC3B;AACF;AC5RO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1B,OAAO,yBACL,YACA,aAIa;AACb,UAAM,mCAAmB,IAAA;AAEzB,gBAAY,QAAQ,CAAC,eAAe;AAClC,iBAAW,iBAAiB,QAAQ,CAAC,mBAAmB;AACtD,YAAI;AACF,gBAAM,aAAa,kBAAkB;AAAA,YACnC;AAAA,YACA;AAAA,UAAA;AAEF,uBAAa,IAAI,UAAU;AAAA,QAC7B,SAASR,QAAO;AACd,iBAAO;AAAA,YACL,oDAAoDA,MAAK;AAAA,UAAA;AAAA,QAG7D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,wBACL,YACA,YACA,cACoB;AACpB,UAAM,oBAAwC,CAAA;AAE9C,eAAW,QAAQ,CAAC,WAAW;AAC7B,UAAI;AACF,cAAM,aAAa,kBAAkB;AAAA,UACnC;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,CAAC,aAAa,IAAI,UAAU,GAAG;AACjC,4BAAkB,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF,SAASA,QAAO;AACd,eAAO;AAAA,UACL,+DAA+DA,MAAK;AAAA,QAAA;AAAA,MAGxE;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,uCACX,YACA,WACA,aAIA,mBACe;AAEf,UAAM,eAAe,KAAK,yBAAyB,YAAY,WAAW;AAG1E,UAAM,oBAAoB,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,WAAO;AAAA,MACL,WAAW,kBAAkB,MAAM,8BAA8B,UAAU,MAAM;AAAA,IAAA;AAInF,QAAI,kBAAkB,SAAS,GAAG;AAChC,YAAM,kBAAkB,WAAW,YAAY,iBAAiB;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,oBACL,eACA,YAOA;AAEA,UAAM,OAAO,cAAc;AAiB3B,QAAI,YAGC,CAAA;AAEL,QAAI,eAAe,WAAW,eAAe;AAE3C,YAAM,eAAe,MAAM,gBAAgB,CAAA;AAC3C,YAAM,eAAe,MAAM,gBAAgB,CAAA;AAG3C,UAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,cAAc;AAC9C,eAAO;AAAA,UACL;AAAA,QAAA;AAAA,MAEJ;AAEA,kBAAY,CAAC,GAAG,cAAc,GAAG,YAAY;AAAA,IAC/C,OAAO;AAEL,YAAM,SAAS,MAAM,UAAU,CAAA;AAG/B,UAAI,CAAC,MAAM,QAAQ;AACjB,eAAO;AAAA,UACL,GAAG,UAAU;AAAA,QAAA;AAAA,MAEjB;AAEA,kBAAY;AAAA,IACd;AAEA,UAAM,cAAc,UACjB;AAAA,MACC,CAACA,WAGK;AACJ,eAAOA,OAAM,aAAaA,OAAM,UAAU,SAAS;AAAA,MACrD;AAAA,IAAA,EAED;AAAA,MACC,CAACA,WAGK;AAEJ,cAAM,sBAAsBA,OAAM,aAAa,CAAA,GAAI,IAAI,CAAC,WAAW;AACjE,cACE,OAAO,WAAW,YAClB,WAAW,QACX,qBAAqB,UACrB,OAAO,OAAO,oBAAoB,YAClC;AAEA,mBAAO;AAAA,UACT,OAAO;AAEL,mBAAO,kBAAkB;AAAA,cACvB;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAASA,OAAM;AAAA,UACf,kBAAkB;AAAA,QAAA;AAAA,MAEtB;AAAA,IAAA;AAGJ,UAAM,aAAa,YAAY,OAAO,CAAC,OAAe,eAAe;AACnE,aAAO,QAAQ,WAAW,iBAAiB;AAAA,IAC7C,GAAG,CAAC;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,oCACL,WACA,YAOO;AACP,QAAI;AAEF,YAAM,KAAK;AACX,YAAM,OAAO,IAAI;AAGjB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,QAAQ,IAAI;AAAA,UACZ,MAAM,IAAI;AAAA,UACV,iBAAiB,CAAC,CAAC;AAAA,UACnB,kBAAkB,OAAO,OAAO,KAAK,IAAI,IAAI,CAAA;AAAA,UAC7C,cAAc,MAAM;AAAA,UACpB,kBAAkB,CAAC,CAAC,MAAM;AAAA,UAC1B,mBAAmB,MAAM,UACrB,OAAO,KAAK,KAAK,OAAkC,IACnD,CAAA;AAAA,UACJ;AAAA,UACA,eAAe,OAAO;AAAA,UACtB,eAAe,KAAK,OAAO,KAAK,EAAE,IAAI,CAAA;AAAA,QAAC;AAAA,MACzC;AAIF,UACE,IAAI,WAAW,OACf,OAAO,MAAM,UAAU,YACvB,CAAC,KAAK,MAAM,WAAW,kBAAkB,GACzC;AACA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,QAAQ,IAAI;AAAA,YACZ,cAAc,MAAM;AAAA,YACpB,gBAAgB;AAAA,YAChB,uBAAuB;AAAA,UAAA;AAAA,QACzB;AAEF,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL;AAAA,MAAA;AAGF,YAAM,gBAAgB,MAAM;AAC5B,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,UACL;AAAA,QAAA;AAEF,eAAO;AAAA,MACT;AAEA,UAAI,YAAuB,CAAA;AAE3B,UAAI,eAAe,WAAW,eAAe;AAE3C,cAAM,eAAe,MAAM,QAAQ,eAAe,YAAY,IAC1D,cAAc,eACd,CAAA;AACJ,cAAM,eAAe,MAAM,QAAQ,eAAe,YAAY,IAC1D,cAAc,eACd,CAAA;AAEJ,eAAO,KAAK,yDAAyD;AAAA,UACnE,mBAAmB,aAAa;AAAA,UAChC,mBAAmB,aAAa;AAAA,QAAA,CACjC;AAED,YAAI,aAAa,WAAW,KAAK,aAAa,WAAW,GAAG;AAC1D,iBAAO;AAAA,YACL;AAAA,UAAA;AAAA,QAEJ;AAEA,oBAAY,CAAC,GAAG,cAAc,GAAG,YAAY;AAAA,MAC/C,OAAO;AAEL,cAAM,SAAS,MAAM,QAAQ,eAAe,MAAM,IAC9C,cAAc,SACd,CAAA;AAEJ,eAAO,KAAK,0DAA0D;AAAA,UACpE,aAAa,OAAO;AAAA,QAAA,CACrB;AAED,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO;AAAA,YACL,sBAAsB,UAAU;AAAA,UAAA;AAAA,QAEpC;AAEA,oBAAY;AAAA,MACd;AAEA,YAAM,cAAc,UACjB,OAAO,CAACA,WAAU;AACjB,cAAM,MAAMA;AACZ,eAAO,MAAM,QAAQ,KAAK,SAAS,KAAK,IAAI,UAAU,SAAS;AAAA,MACjE,CAAC,EACA,IAAI,CAACA,WAAU;AACd,cAAM,MAAMA;AACZ,cAAM,YAAY,KAAK;AAMvB,cAAM,sBAAsB,aAAa,CAAA,GAAI,IAAI,CAAC,WAAW;AAC3D,cACE,OAAO,WAAW,YAClB,WAAW,QACX,qBAAqB,UACrB,OAAO,OAAO,oBAAoB,YAClC;AAEA,mBAAO;AAAA,UACT,OAAO;AAEL,mBAAO,kBAAkB;AAAA,cACvB;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SACE,OAAO,KAAK,YAAY,WAAW,IAAI,UAAU;AAAA,UACnD,kBAAkB;AAAA,QAAA;AAAA,MAEtB,CAAC;AAEH,YAAM,aAAa,YAAY,OAAO,CAAC,OAAe,eAAe;AACnE,eAAO,QAAQ,WAAW,iBAAiB;AAAA,MAC7C,GAAG,CAAC;AAEJ,aAAO,KAAK,kDAAkD;AAAA,QAC5D,kBAAkB,YAAY;AAAA,QAC9B,iBAAiB;AAAA,QACjB;AAAA,MAAA,CACD;AAED,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,SAASA,QAAO;AAEd,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,OAAOA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AAAA,UAC5D,eAAe,OAAO;AAAA,UACtB;AAAA,QAAA;AAAA,MACF;AAEF,aAAO;AAAA,IACT;AAAA,EACF;AACF;ACnYO,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAI7B,aAAa,cACX,YACA,WACA,mBACkC;AAClC,UAAM,EAAE,WAAW,WAAW,MAAM,KAAK;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO,UACL;AACF,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,sBAAgB,MAAM,KAAK,WAAW,YAAY,SAAS;AAAA,IAC7D,SAAS,WAAW;AAClB,WAAK,iBAAiB,WAAW,YAAY,MAAM;AAAA,IACrD;AAEA,WAAO,MAAM,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAqB,kBACnB,YACA,WACA,mBAIC;AACD,QAAI,YAAgC,CAAA;AACpC,UAAM,SAAkC;AAAA,MACtC,SAAS;AAAA,MACT,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA;AAGlB,QAAI,mBAAmB;AACrB,YAAM,EAAE,eAAe,WAAA,IACpB,MAAM,kBAAkB,YAAY,YAAY,SAAS;AAI5D,kBAAY;AACZ,aAAO,mBAAmB,WAAW;AAAA,IACvC,OAAO;AACL,kBAAY;AAAA,IACd;AAEA,WAAO,EAAE,WAAW,OAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,WACnB,YACA,WAC4B;AAC5B,UAAM,cAAc,IAAI,YAAA;AAExB,YAAQ,YAAA;AAAA,MACN,KAAK,WAAW;AACd,eAAO,MAAM,YAAY,gBAAgB,SAA2B;AAAA,MACtE,KAAK,WAAW;AACd,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,YAAY,cAAc,SAAyB;AAAA,MAClE,KAAK,WAAW;AACd,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,QAAA;AAAA,MAEJ,KAAK,WAAW;AACd,eAAO,MAAM,YAAY,gBAAgB,SAA2B;AAAA,MACtE;AACE,cAAM,IAAI,MAAM,wBAAwB,UAAU,EAAE;AAAA,IAAA;AAAA,EAE1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,iBACb,WACA,YACA,QACO;AAEP,UAAM,6BACJ,eAAe,oCAAoC,WAAW,UAAU;AAE1E,QAAI,4BAA4B;AAC9B,YAAM,KAAK;AACX,YAAM,OAAO,IAAI;AACjB,YAAM,eACJ,OAAO,MAAM,UAAU,WACnB,KAAK,QACL;AAEN,YAAM,IAAI,uBAAuB;AAAA,QAC/B,SAAS;AAAA,QACT,kBAAkB;AAAA,QAClB,kBAAkB,OAAO;AAAA,QACzB,gBAAgB;AAAA,QAChB,YAAY,2BAA2B;AAAA,QACvC,YAAa,UAAwB;AAAA,QACrC,aAAa,2BAA2B;AAAA,MAAA,CACzC;AAAA,IACH;AAGA,UAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAqB,gBACnB,eACA,YACA,WACA,QACA,mBACkC;AAClC,QAAI,cAAc,eAAe,KAAK;AAEpC,UAAI,mBAAmB;AACrB,cAAM,kBAAkB,WAAW,YAAY,SAAS;AAAA,MAC1D;AAEA,UAAI,eAAe,WAAW,eAAe;AAC3C,cAAM,UAAU;AAChB,eAAO,UAAU,QAAQ,WAAW;AACpC,eAAO,oBACJ,QAAQ,WAAW,MAAM,QAAQ,YAAY;AAAA,MAClD,OAAO;AACL,cAAM,UAAU;AAChB,eAAO,UAAU,QAAQ,WAAW;AACpC,eAAO,mBAAmB,QAAQ,gBAAgB;AAAA,MACpD;AACA,aAAO,iBAAiB,UAAU,SAAS,OAAO;AAElD,aAAO;AAAA,IACT,WAAW,cAAc,eAAe,KAAK;AAE3C,YAAM,kBAAkB;AAGxB,YAAM,EAAE,YAAY,YAAA,IAAgB,eAAe;AAAA,QACjD;AAAA,QACA;AAAA,MAAA;AAGF,UAAI,mBAAmB;AACrB,cAAM,eAAe;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,mBAAmB;AACvB,UAAI,eAAe,WAAW,eAAe;AAC3C,cAAM,UAAU;AAChB,4BACG,QAAQ,KAAK,WAAW,MAAM,QAAQ,KAAK,YAAY;AAAA,MAC5D,OAAO;AACL,cAAM,UAAU;AAChB,2BAAmB,QAAQ,KAAK,gBAAgB;AAAA,MAClD;AAEA,YAAM,IAAI,uBAAuB;AAAA,QAC/B,SACE,gBAAgB,WAAW;AAAA,QAC7B;AAAA,QACA,kBAAkB,OAAO;AAAA,QACzB,gBAAgB,UAAU,SAAS,mBAAmB;AAAA,QACtD;AAAA,QACA,YAAY,cAAc;AAAA,QAC1B;AAAA,MAAA,CACD;AAAA,IACH,OAAO;AACL,YAAM,IAAI;AAAA,QACR,gDAAgD,cAAc,UAAU;AAAA,MAAA;AAAA,IAE5E;AAAA,EACF;AACF;AChPO,MAAM,+BAA+B,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAKhB,YAAY,SAWT;AACD,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,mBAAmB,QAAQ;AAChC,SAAK,mBAAmB,QAAQ;AAChC,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,aAAa,QAAQ;AAC1B,SAAK,aAAa,QAAQ;AAC1B,SAAK,cAAc,QAAQ;AAAA,EAC7B;AACF;AAOO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlC,aAAa,sBACX,eACA,WACe;AACf,WAAO,2BAA2B,UAAU,eAAe,SAAS;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,wBACX,eACA,WACe;AACf,WAAO,2BAA2B,YAAY,eAAe,SAAS;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2EA,aAAa,kBACX,YACA,WACA,mBACkC;AAClC,WAAO,kBAAkB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,aAAa,wBACX,gBACA,mBAMC;AAID,UAAM,cAAc,MAAM,kBAAkB;AAAA,MAC1C,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,IAAA;AAIF,UAAM,uBAAuB,MAAM,kBAAkB;AAAA,MACnD,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,IAAA;AAIF,UAAM,mBAAmB,MAAM,kBAAkB;AAAA,MAC/C,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,IAAA;AAIF,UAAM,4BAA4B,MAAM,kBAAkB;AAAA,MACxD,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,IAAA;AAGF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,qBAAqB;AAAA,IAAA;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,aAAa,gCACX,eACA,mBAMC;AACD,QAAI,CAAC,iBAAiB,cAAc,WAAW,GAAG;AAChD,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAGA,UAAM,kCAAkB,IAAA;AACxB,UAAM,2CAA2B,IAAA;AACjC,UAAM,uCAAuB,IAAA;AAC7B,UAAM,sBAAsB,CAAA;AAG5B,eAAW,OAAO,eAAe;AAE/B,YAAM,UAAU,GAAG,IAAI,UAAU,IAAI,IAAI,YAAY,IAAI,IAAI,MAAM;AACnE,UAAI,CAAC,YAAY,IAAI,OAAO,GAAG;AAC7B,oBAAY,IAAI,SAAS;AAAA,UACvB,YAAY,IAAI;AAAA;AAAA,UAChB,cAAc,IAAI;AAAA;AAAA,UAClB,QAAQ,IAAI;AAAA;AAAA,QAAA,CACb;AAAA,MACH;AAGA,YAAM,YAAY,GAAG,IAAI,UAAU,IAAI,IAAI,YAAY,IAAI,IAAI,MAAM,IAAI,IAAI,cAAc;AAC3F,UAAI,CAAC,qBAAqB,IAAI,SAAS,GAAG;AACxC,6BAAqB,IAAI,WAAW;AAAA,UAClC,YAAY,IAAI;AAAA;AAAA,UAChB,cAAc,IAAI;AAAA;AAAA,UAClB,QAAQ,IAAI;AAAA;AAAA,UACZ,gBAAgB,IAAI;AAAA;AAAA,UACpB,YAAY,IAAI;AAAA;AAAA,UAChB,aAAa,IAAI;AAAA;AAAA,UACjB,aAAa,IAAI;AAAA;AAAA,UACjB,aAAa,IAAI,wBAAwB;AAAA;AAAA,UACzC,iBAAiB,IAAI,mBAAmB;AAAA;AAAA,QAAA,CACzC;AAAA,MACH;AAGA,YAAM,eAAe,IAAI;AACzB,UAAI,CAAC,iBAAiB,IAAI,YAAY,GAAG;AACvC,yBAAiB,IAAI,cAAc;AAAA,UACjC,aAAa,IAAI;AAAA;AAAA,UACjB,KAAK,IAAI;AAAA;AAAA,UACT,OAAO,IAAI;AAAA;AAAA,UACX,KAAK,IAAI;AAAA;AAAA,UACT,QAAQ,IAAI;AAAA;AAAA,UACZ,SAAS,IAAI;AAAA;AAAA,UACb,aAAa,IAAI;AAAA;AAAA,UACjB,oBAAoB,IAAI;AAAA;AAAA,UACxB,kBAAkB,IAAI;AAAA;AAAA,UACtB,YAAY,IAAI;AAAA;AAAA,UAChB,kBAAkB,IAAI;AAAA;AAAA,UACtB,YAAY,IAAI;AAAA;AAAA,UAChB,cAAc,IAAI;AAAA;AAAA,UAClB,QAAQ,IAAI;AAAA;AAAA,QAAA,CACb;AAAA,MACH;AAGA,0BAAoB,KAAK;AAAA,QACvB,aAAa,IAAI;AAAA;AAAA,QACjB,KAAK,IAAI;AAAA;AAAA,QACT,OAAO,IAAI;AAAA;AAAA,QACX,KAAK,IAAI;AAAA;AAAA,QACT,gBAAgB,IAAI;AAAA;AAAA,QACpB,YAAY,IAAI;AAAA;AAAA,QAChB,eAAe,IAAI;AAAA;AAAA,QACnB,gBAAgB,IAAI;AAAA;AAAA,QACpB,oBAAoB,IAAI;AAAA;AAAA,QACxB,oBAAoB,IAAI;AAAA;AAAA,QACxB,qBAAqB,IAAI;AAAA;AAAA,QACzB,YAAY,IAAI;AAAA;AAAA,QAChB,aAAa,IAAI;AAAA;AAAA,QACjB,aAAa,IAAI;AAAA;AAAA,QACjB,4BAA4B,IAAI;AAAA;AAAA,QAChC,uBAAuB,IAAI;AAAA;AAAA,QAC3B,eAAe,IAAI;AAAA;AAAA,QACnB,iBAAiB,IAAI;AAAA;AAAA,QACrB,QAAQ,IAAI,YAAY,IAAI;AAAA;AAAA,MAAA,CAC7B;AAAA,IACH;AAGA,UAAM,QAAQ,MAAM,KAAK,YAAY,OAAA,CAAQ,EAAE;AAAA,MAC7C,CAAC,SACC,IAAI;AAAA,QACF,KAAK,cAAc;AAAA;AAAA,QACnB,KAAK,gBAAgB;AAAA;AAAA,QACrB,KAAK,UAAU;AAAA;AAAA,MAAA;AAAA,IACjB;AAGJ,UAAM,iBAAiB,MAAM,KAAK,qBAAqB,OAAA,CAAQ,EAAE;AAAA,MAC/D,CAAC,SACC,IAAI;AAAA,QACF,KAAK,cAAc;AAAA;AAAA,QACnB,KAAK,gBAAgB;AAAA;AAAA,QACrB,KAAK,UAAU;AAAA;AAAA,QACf,KAAK,gBAAgB,SAAA,KAAc;AAAA;AAAA,QACnC,KAAK,YAAY,SAAA,KAAc;AAAA;AAAA,QAC/B,KAAK,eAAe;AAAA;AAAA,QACpB,KAAK,eAAe;AAAA;AAAA,QACpB,KAAK,eAAe;AAAA;AAAA,QACpB,KAAK,mBAAmB;AAAA;AAAA,MAAA;AAAA,IAC1B;AAGJ,UAAM,wBAAwB,MAAM,KAAK,iBAAiB,OAAA,CAAQ,EAAE;AAAA,MAClE,CAAC,SACC,IAAI;AAAA,QACF,KAAK,aAAa,SAAA,KAAc;AAAA;AAAA,QAChC,KAAK,OAAO;AAAA;AAAA,QACZ,KAAK,SAAS;AAAA;AAAA,QACd,KAAK,OAAO;AAAA;AAAA,QACZ,KAAK,UAAU;AAAA;AAAA,QACf,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,EAAE,gBAAgB;AAAA;AAAA,QACtD,KAAK,eAAe;AAAA;AAAA,QACpB,KAAK,qBACD,IAAI,KAAK,KAAK,kBAAkB,EAAE,gBAClC;AAAA;AAAA,QACJ,KAAK,mBACD,IAAI,KAAK,KAAK,gBAAgB,EAAE,gBAChC;AAAA;AAAA,QACJ,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,EAAE,gBAAgB;AAAA;AAAA,QAC5D,KAAK,oBAAoB;AAAA;AAAA,QACzB,KAAK,cAAc;AAAA;AAAA,QACnB,KAAK,gBAAgB;AAAA;AAAA,QACrB,KAAK,UAAU;AAAA;AAAA,MAAA;AAAA,IACjB;AAGJ,UAAM,iCAAiC,oBAAoB;AAAA,MACzD,CAAC,SACC,IAAI;AAAA,QACF,KAAK,aAAa,SAAA,KAAc;AAAA;AAAA,QAChC,KAAK,OAAO;AAAA;AAAA,QACZ,KAAK,SAAS;AAAA;AAAA,QACd,KAAK,OAAO;AAAA;AAAA,QACZ,KAAK,gBAAgB,SAAA,KAAc;AAAA;AAAA,QACnC,KAAK,YAAY,SAAA,KAAc;AAAA;AAAA,QAC/B,KAAK,iBAAiB;AAAA;AAAA,QACtB,KAAK,kBAAkB;AAAA;AAAA,QACvB,KAAK,sBAAsB;AAAA;AAAA,QAC3B,KAAK,qBACD,IAAI,KAAK,KAAK,kBAAkB,EAAE,gBAClC;AAAA;AAAA,QACJ,KAAK,sBACD,IAAI,KAAK,KAAK,mBAAmB,EAAE,gBACnC;AAAA;AAAA,QACJ,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,EAAE,gBAAgB;AAAA;AAAA,QAC5D,KAAK,eAAe;AAAA;AAAA,QACpB,KAAK,eAAe;AAAA;AAAA,QACpB,WAAW,KAAK,8BAA8B,GAAG;AAAA;AAAA,QACjD,WAAW,KAAK,yBAAyB,GAAG;AAAA;AAAA,QAC5C,KAAK,iBAAiB;AAAA;AAAA,QACtB,KAAK,mBAAmB;AAAA;AAAA,QACxB,KAAK,UAAU;AAAA;AAAA,MAAA;AAAA,IACjB;AAIJ,UAAM,cAAc,MAAM,kBAAkB;AAAA,MAC1C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,uBAAuB,MAAM,kBAAkB;AAAA,MACnD,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,mBAAmB,MAAM,kBAAkB;AAAA,MAC/C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,4BAA4B,MAAM,kBAAkB;AAAA,MACxD,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAGF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,qBAAqB;AAAA,IAAA;AAAA,EAEzB;AACF;AClcA,MAAMS,2BAAyB;AAC/B,MAAM,2BAA2B;AAY1B,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACEX,SACA,eACA,iBACA;AACA,SAAK,SAASA;AACd,SAAK,kBAAkB,mBAAmB;AAC1C,SAAK,SAAS,kBAAkB,YAAY;AAAA,MAC1C,SAASA,QAAO;AAAA,MAChB,eAAe,iBAAiBW;AAAAA,IAAA,CACjC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,aAA8C;AAC1D,UAAM,QAAQ,MAAM,KAAK,OAAO,aAAA;AAChC,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,GAAI,QAAQ,EAAE,eAAe,UAAU,KAAK,OAAO,CAAA;AAAA,IAAC;AAAA,EAExD;AAAA,EAEQ,iBAAiB,QAAqB,IAAqB;AACjE,UAAM,EAAE,OAAO,UAAU,QAAAC,QAAA,IAAW;AACpC,UAAM,cAAsC,CAAA;AAE5C,QAAI,OAAO;AACT,kBAAY,OAAO,MAAM,SAAA;AAAA,IAC3B;AACA,QAAI,UAAU;AACZ,kBAAY,OAAO;AAAA,IACrB;AAEA,QAAIA,SAAQ;AACV,UAAIA,QAAO,IAAI;AACb,QAAAA,QAAO,GAAG,QAAQ,CAAC,aAAa;AAC9B,gBAAMC,SAAQ,SAAS,MAAM,KAAK,GAAG;AACrC,sBAAY,GAAG,SAAS,KAAK,MAAM,IAAIA;AAAAA,QACzC,CAAC;AAAA,MACH;AAEA,UAAID,QAAO,KAAK;AACd,oBAAY,aAAa,IAAI,sBAAsBA,QAAO,KAAK,KAAK;AAAA,MACtE;AAEA,UAAIA,QAAO,IAAI;AACb,oBAAY,YAAY,IAAI,sBAAsBA,QAAO,IAAI,IAAI;AAAA,MACnE;AAAA,IACF;AAEA,WAAO,IAAI,gBAAgB,WAAW;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,gBACN,OACA,UACA,cACA,aAAqB,GACrB,YACY;AACZ,UAAM,SAAqB;AAAA,MACzB,OAAO,cAAc;AAAA,MACrB,OAAO,SAAS,KAAK;AAAA,MACrB,UAAU;AAAA,MACV;AAAA,IAAA;AAGF,QAAI,OAAO;AACT,aAAO,QAAQ;AACf,YAAM,cAAc,SAAS,YAAY,GAAG;AAK5C,UAAI,aAAa,MAAM,CAAC,cAAc,cAAc,QAAQ,aAAa;AACvE,eAAO,WAAW,GAAG,cAAc,KAAK;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,UAAkB,aAAuC;AACxE,UAAM,YAAY,CAAC,KAAK,OAAO,UAAU,EAAE;AAC3C,cAAU,KAAK,QAAQ;AAEvB,UAAMN,QAAO,UAAU,OAAO,OAAO,EAAE,KAAK,GAAG;AAC/C,WAAO,cAAc,GAAGA,KAAI,IAAI,YAAY,SAAA,CAAU,KAAKA;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,IACJ,UACA,QAAqB,IACM;AAC3B,QAAI;AACF,YAAM,SAAS,KAAK,iBAAiB,KAAK;AAC1C,YAAM,MAAM,KAAK,SAAS,UAAU,MAAM;AAC1C,YAAM,UAAU,MAAM,KAAK,WAAA;AAE3B,YAAM,WAAW,MAAM,KAAK,OAAO,QAGhC;AAAA,QACD,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MAAA,CACD;AAED,YAAM,SAAS,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,MAAM;AAAA,QACpB,SAAS,KAAK;AAAA,MAAA;AAGhB,aAAO;AAAA,QACL,MAAM,SAAS,KAAK,QAAQ,CAAA;AAAA,QAC5B,UAAU;AAAA,UACR,YAAY;AAAA,QAAA;AAAA,MACd;AAAA,IAEJ,SAASJ,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,UACA,IACA,MACyB;AACzB,QAAI;AACF,YAAM,MAAM,KAAK,SAAS,GAAG,QAAQ,IAAI,EAAE,EAAE;AAC7C,YAAM,UAAU,MAAM,KAAK,WAAA;AAE3B,YAAM,WAAW,MAAM,KAAK,OAAO,QAAW;AAAA,QAC5C,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAED,aAAO;AAAA,QACL,MAAM,SAAS;AAAA,MAAA;AAAA,IAEnB,SAASA,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,UACA,MACiC;AACjC,QAAI;AACF,YAAM,MAAM,KAAK,SAAS,QAAQ;AAClC,YAAM,UAAU,MAAM,KAAK,WAAA;AAE3B,YAAM,WAAW,MAAM,KAAK,OAAO,QAAmB;AAAA,QACpD,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAED,aAAO;AAAA,QACL,MAAM,SAAS;AAAA,MAAA;AAAA,IAEnB,SAASA,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAyB;AAC7B,UAAM,KAAK,OAAO,QAAA;AAAA,EACpB;AACF;ACzNO,SAAS,wBACd,QACA,WACwB;AAExB,QAAM,QAAQ,OAAO,QAAQ,SAAS,EAAE;AAAA,IACtC,CAAC,CAAC,GAAG,KAAK,MAAM,MAAM,WAAW;AAAA,EAAA;AAEnC,SAAO,QAAS,OAAO,MAAM,CAAC,CAAC,IAAmB;AACpD;ACLA,MAAM,mBAAmB,CAAC,MAA4B,OAAO,MAAM,YAAY,EAAE,OAAO,SAAS;AAE1F,SAAS,aAAaA,QAAwB;AACnD,MAAIA,UAAS,OAAOA,WAAU,UAAU;AACtC,UAAM,IAAIA;AACV,QAAI,iBAAiB,EAAE,IAAI,UAAU,EAAE;AACvC,QAAI,iBAAiB,EAAE,IAAI,UAAU,EAAE;AACvC,UAAM,WAAW,EAAE,aAAa;AAChC,QAAI,iBAAiB,QAAQ,KAAK,aAAa,SAAU,QAAO;AAAA,EAClE;AACA,SAAO;AACT;ACJO,MAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAsE;AAChF,SAAK,QAAQ,OAAO;AACpB,SAAK,UAAU,OAAO;AACtB,SAAK,YAAY,OAAO;AACxB,SAAK,YAAa,KAAK,IAAA;AAAA,EACzB;AACF;AAaA,SAAS,cAAc,OAAsC;AAC3D,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,YAAY,SAAU,QAAO;AAC1C,MAAI,eAAe,KAAK,OAAO,EAAE,cAAc,SAAU,QAAO;AAChE,SAAO;AACT;AAWO,MAAM,kBAAkB;AAAA,EACZ,cAAc;AAAA,EAEvB;AAAA,EACS;AAAA,EACA;AAAA,EAEjB,YAAY,QAAgB,SAAsB;AAChD,QAAI,OAAO,SAAS,KAAK,OAAO,SAAS,IAAI;AAC3C,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,SAAK,cAAc,IAAI,YAAA;AACvB,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,QAAQ,UAAiD;AAC7D,SAAK,iBAAiB,QAAQ;AAE9B,UAAM,MAAM,KAAK,IAAA;AACjB,QAAI,gBAAgB,SAAS;AAC7B,QAAI,KAAK,SAAS;AAChB,YAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,UAAU,GAAG;AACxD,UAAI,aAAa,KAAM,QAAO;AAC9B,sBAAgB;AAAA,IAClB;AAEA,QAAI;AACF,YAAM,iBAAiB;AAAA,QACrB,QAAQ,KAAK;AAAA,QACb,OAAO,SAAS;AAAA,QAChB,SAAS;AAAA,MAAA;AAGX,YAAM,WAAW,MAAM,KAAK,YAAY,iBAAiB,cAAc;AACvE,UAAI,KAAK,SAAS;AAChB,cAAM,KAAK,QAAQ,UAAU,UAAU,GAAG;AAAA,MAC5C;AAEA,UAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,eAAO,KAAK,oEAAoE,EAAE,SAAA,CAAU;AAC5F,eAAO,EAAE,SAAS,sDAAA;AAAA,MACpB;AACA,aAAO,EAAE,SAAS,SAAS,QAAA;AAAA,IAE7B,SAASA,QAAO;AACd,aAAO,MAAM,kCAAkC;AAAA,QAC7C,OAAO,SAAS;AAAA,QAChB,OAAOA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,MAAA,CACjD;AACD,YAAMA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,UAA0B;AACjD,UAAM,gBAA+C,CAAC,QAAQ,QAAQ,OAAO;AAC7E,QAAI,CAAC,SAAS,SAAS,CAAC,cAAc,SAAS,SAAS,KAAK,GAAG;AAC9D,YAAM,IAAI,MAAM,yBAAyB,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IACrE;AAEA,QAAI,CAAC,SAAS,WAAW,OAAO,SAAS,YAAY,UAAU;AAC7D,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAGA,aAAS,UAAU,SAAS,QAAQ,MAAM,GAAG,KAAK,WAAW;AAE7D,QAAI,CAAC,SAAS,aAAa,OAAO,SAAS,cAAc,UAAU;AACjE,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,QAAI,SAAS,UAAU,KAAA,EAAO,SAAS,GAAG;AACxC,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,2BAA0C;AAC9C,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,0BAA0B;AAC3D;AAAA,IACF;AACA,UAAM,KAAK,QAAQ,yBAAyB,OAAO,OAAO,YAAY;AACpE,YAAM,KAAK,YAAY,iBAAiB;AAAA,QACtC,QAAQ,KAAK;AAAA,QACb,OAAO,MAAM;AAAA,QACb;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,UAAM,KAAK,YAAY,QAAA;AAAA,EACzB;AACF;AC9IO,MAAM,eAAqC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAES,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,mCAAmC;AAAA,EACnC,0BAA0BI,OAAK,KAAK,QAAQ,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUrF,YAAY;AAAA,IACV,gBAAgB,KAAK;AAAA,IACrB,gBAAgB,KAAK;AAAA,IACrB,aAAa,KAAK;AAAA,IAClB,uBAAuB,KAAK;AAAA,EAAA,IAM1B,IAAI;AAEN,SAAK,gBAAgB;AACrB,SAAK,WAAW,KAAK,IAAI,GAAG,aAAa,IAAI;AAC7C,SAAK,QAAQ,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,GAAG,UAAU,IAAI,GAAI;AACnE,SAAK,kBAAkB,KAAK,IAAI,GAAG,oBAAoB,IAAI;AAC3D,SAAK,gBAAgB;AAErB,SAAK,sBAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,OAAiB,KAAqC;AACjE,QAAI,CAAC,MAAM,aAAa,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,OAAO,WAAW,GAAG;AAClG,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,UAAM,MAAM,MAAM;AAElB,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,QAAQ,KAAK,UAAA;AAGnB,UAAI,MAAM,KAAK,iBAAiB,KAAK,iBAAiB;AACpD,aAAK,oBAAoB,OAAO,GAAG;AACnC,aAAK,gBAAgB;AACrB,aAAK,WAAW,KAAK;AAAA,MACvB;AACA,YAAM,WAAW,MAAM,GAAG;AAE1B,UAAI,UAAU;AACZ,cAAM,eAAe,SAAS,kBAAkB,KAAM,SAAS,kBAAkB,KAAK,WAAY;AAClG,YAAI,cAAc;AAEhB,gBAAM,GAAG,IAAI;AAAA,YACX,GAAG;AAAA,YACH,iBAAiB,SAAS,kBAAkB;AAAA,YAC5C,oBAAoB,SAAS,oBAAoB,IAAK,MAAM,aAAa,MAAO,SAAS;AAAA,YACzF,aAAa,MAAM,aAAa;AAAA,YAChC,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,UAAA;AAEjB,eAAK,WAAW,KAAK;AACrB,iBAAO;AAAA,QACT;AAGA,cAAMQ,iBAAgB,KAAK,cAAc,MAAM,SAAS,MAAM,aAAa,KAAK,SAAS,iBAAiB,SAAS,kBAAkB;AACrI,cAAM,GAAG,IAAI;AAAA,UACX,GAAG;AAAA,UACH,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,aAAa,MAAM,aAAa;AAAA,UAChC,OAAO,MAAM;AAAA,UACb,SAAS,MAAM;AAAA,QAAA;AAEjB,aAAK,WAAW,KAAK;AACrB,eAAOA;AAAAA,MACT;AAGA,YAAM,gBAAgB,KAAK,cAAc,MAAM,SAAS,MAAM,aAAa,KAAK,CAAC;AACjF,YAAM,GAAG,IAAI;AAAA,QACX,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,oBAAoB,MAAM,aAAa;AAAA,QACvC,aAAa,MAAM,aAAa;AAAA,QAChC,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,MAAA;AAEjB,WAAK,WAAW,KAAK;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,OAAiB,KAA4B;AAC3D,QAAI,CAAC,MAAM,aAAa,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,OAAO,WAAW,GAAG;AAClG,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,UAAM,MAAM,MAAM;AAElB,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,QAAQ,KAAK,UAAA;AACnB,YAAM,WAAW,MAAM,GAAG;AAC1B,UAAI,UAAU;AACZ,cAAM,GAAG,IAAI;AAAA,UACX,GAAG;AAAA,UACH,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,iBAAiB;AAAA,QAAA;AAEnB,aAAK,WAAW,KAAK;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBAAyB,MAA0E;AAEvG,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,UAAU,MAAM,KAAK,SAAS,YAAY;AAC9C,YAAM,QAAQ,KAAK,UAAA;AAEnB,WAAK,oBAAoB,OAAO,GAAG;AACnC,WAAK,gBAAgB;AACrB,WAAK,WAAW,KAAK;AACrB,aAAO,OAAO,QAAQ,KAAK,EACxB,OAAO,CAAC,CAAA,EAAG,GAAG,MAAM,IAAI,oBAAoB,CAAC,EAC7C,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAA,EAAM;AAAA,IACvC,CAAC;AAED,eAAW,EAAE,KAAK,IAAA,KAAS,SAAS;AAClC,UAAI;AACF,cAAM,UAAU,KAAK,cAAc,IAAI,SAAS,IAAI,aAAa,IAAI,iBAAiB,IAAI,kBAAkB;AAC5G,cAAM,KAAK,EAAE,OAAO,IAAI,OAAO,SAAS,IAAI,SAAS,WAAW,KAAK,WAAW,IAAI,YAAA,GAAe,OAAO;AAE1G,cAAM,KAAK,SAAS,YAAY;AAC9B,gBAAM,QAAQ,KAAK,UAAA;AACnB,gBAAM,UAAU,MAAM,GAAG;AACzB,cAAI,SAAS;AACX,kBAAM,GAAG,IAAI;AAAA,cACX,GAAG;AAAA,cACH,iBAAiB,KAAK,IAAA;AAAA,cACtB,iBAAiB;AAAA,YAAA;AAEnB,iBAAK,WAAW,KAAK;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AAEZ,eAAO,MAAM,uCAAuC,EAAE,KAAK,KAAK,OAAO,KAAK;AAC5E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,wBAA8B;AACpC,QAAI;AACF,UAAI,CAAC,GAAG,WAAW,KAAK,aAAa,GAAG;AACtC,WAAG,cAAc,KAAK,eAAe,KAAK,UAAU,CAAA,CAAE,GAAG,OAAO;AAAA,MAClE;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,YAA4B;AAClC,QAAI;AACF,UAAI,CAAC,GAAG,WAAW,KAAK,aAAa,UAAU,CAAA;AAC/C,YAAM,UAAU,GAAG,aAAa,KAAK,eAAe,OAAO;AAC3D,aAAO,UAAW,KAAK,MAAM,OAAO,IAAuB,CAAA;AAAA,IAC7D,QAAQ;AACN,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,WAAW,OAA6B;AAC9C,QAAI;AACF,SAAG,cAAc,KAAK,eAAe,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,IAC9E,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,cAAc,SAAiB,SAAiB,iBAAyB,oBAAqC;AACpH,UAAM,YAAY,IAAI,KAAK,OAAO,EAAE,YAAA;AACpC,UAAM,OAAO,GAAG,SAAS,MAAM,OAAO;AACtC,QAAI,kBAAkB,GAAG;AACvB,YAAM,QAAQ,sBAAsB,qBAAqB,IAAI,UAAU,IAAI,KAAK,kBAAkB,EAAE,YAAA,CAAa,KAAK;AACtH,aAAO,GAAG,IAAI,KAAK,eAAe,cAAc,KAAK;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAY,IAAkC;AAC1D,UAAM,WAAW,GAAG,KAAK,aAAa;AACtC,UAAM,QAAQ,KAAK,IAAA;AAInB,WAAO,MAAM;AACX,UAAI;AACF,cAAM,KAAK,GAAG,SAAS,UAAU,IAAI;AACrC,YAAI;AACF,gBAAM,SAAS,MAAM,GAAA;AACrB,iBAAO;AAAA,QACT,UAAA;AACE,cAAI;AAAE,eAAG,UAAU,EAAE;AAAA,UAAG,QAAQ;AAAA,UAAa;AAC7C,cAAI;AAAE,eAAG,WAAW,QAAQ;AAAA,UAAG,QAAQ;AAAA,UAAa;AAAA,QACtD;AAAA,MACF,QAAQ;AAEN,YAAI,KAAK,QAAQ,QAAQ,KAAM;AAE7B,iBAAO,MAAM,GAAA;AAAA,QACf;AACA,cAAM,IAAI,QAAQ,CAAA,YAAW,WAAW,SAAS,EAAE,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAuB,KAAmB;AACpE,UAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,QAAI,KAAK,WAAW,EAAG;AACvB,eAAW,OAAO,MAAM;AACtB,YAAM,MAAM,MAAM,GAAG;AACrB,YAAM,cAAc,IAAI,kBAAkB,IAAI,IAAI,kBAAkB,IAAI;AACxE,UAAI,MAAM,cAAc,KAAK,OAAO;AAClC,eAAO,MAAM,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;ACjRO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlC,aAAoB,aAA4B;AAC9C,QAAI;AACF,aAAO;AAAA,QACL;AAAA,MAAA;AAIF,YAAM,aAAa,kBAAkB,KAAA;AACrC,aAAO,KAAK,8BAA8B,UAAU;AAGpD,aAAO,KAAK,uCAAuC;AACnD,YAAM,kBAAkB,oBAAA;AACxB,aAAO,KAAK,gDAAgD;AAG5D,aAAO,KAAK,gCAAgC;AAC5C,YAAM,uBAAuB,cAAA;AAC7B,aAAO,KAAK,4CAA4C;AAGxD,YAAM,4BAAA;AAEN,aAAO;AAAA,QACL;AAAA,MAAA;AAAA,IAEJ,SAASZ,QAAO;AACd,aAAO,MAAM,6CAA6CA,MAAK;AAC/D,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,gBAA+B;AAClD,UAAM,KAAK,KAAK,OAAO,KAAK;AAC5B,QAAI;AACF,YAAM,GAAG,QAAQ,OAAA;AAAA,IACnB,SAASA,QAAO;AACd,aAAO,MAAM,6BAA6BA,MAAK;AAC/C,YAAMA;AAAA,IACR,UAAA;AACE,YAAM,GAAG,QAAA;AAAA,IACX;AAAA,EACF;AACF;ACnDA,MAAM,yBAAyB;AAExB,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAYF,SAAsB,UAAkB,eAAwB;AAC1E,SAAK,SAASA;AACd,SAAK,WAAW,WACZ,SAAS,WAAW,GAAG,IACrB,WACA,IAAI,QAAQ,KACd;AACJ,SAAK,SAAS,kBAAkB,YAAY;AAAA,MAC1C,SAASA,QAAO;AAAA,MAChB,eAAe,iBAAiB;AAAA,IAAA,CACjC;AAAA,EACH;AAAA,EAEA,MAAc,aAA8C;AAC1D,UAAM,QAAQ,MAAM,KAAK,OAAO,aAAA;AAChC,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,GAAI,QAAQ,EAAE,eAAe,UAAU,KAAK,OAAO,CAAA;AAAA,IAAC;AAAA,EAExD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeQ,sBACN,UACgB;AAChB,WAAO;AAAA,MACL,MAAM,SAAS,KAAK;AAAA,MACpB,UAAU;AAAA,QACR,QAAQ,SAAS,KAAK;AAAA,QACtB,YAAY,SAAS,KAAK;AAAA,MAAA;AAAA,IAC5B;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MACJ,OACA,WACyB;AACzB,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAA;AAC3B,YAAM,WAAW,MAAM,KAAK,OAAO,QAA4B;AAAA,QAC7D,QAAQ;AAAA,QACR,KAAK,KAAK;AAAA,QACV,MAAM,EAAE,OAAO,UAAA;AAAA,QACf;AAAA,MAAA,CACD;AAED,aAAO,KAAK,sBAAsB,QAAQ;AAAA,IAC5C,SAASE,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACJ,UACA,WACyB;AACzB,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAA;AAC3B,YAAM,WAAW,MAAM,KAAK,OAAO,QAA4B;AAAA,QAC7D,QAAQ;AAAA,QACR,KAAK,KAAK;AAAA,QACV,MAAM,EAAE,OAAO,UAAU,UAAA;AAAA,QACzB;AAAA,MAAA,CACD;AAED,aAAO,KAAK,sBAAsB,QAAQ;AAAA,IAC5C,SAASA,QAAO;AACd,mBAAa,OAAOA,MAAK;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAyB;AAC7B,UAAM,KAAK,OAAO,QAAA;AAAA,EACpB;AACF;ACxFO,MAAM,YAAY;AAAA,EACvB,YAAoBF,SAAqB;AAArB,SAAA,SAAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ1C,MAAM,WAAwC;AAC5C,UAAM,WAAW,IAAI,gBAAgB;AAAA,MACnC,YAAY;AAAA,MACZ,WAAW,KAAK,OAAO;AAAA,MACvB,eAAe,KAAK,OAAO;AAAA,MAC3B,OAAO,KAAK,OAAO;AAAA,IAAA,CACpB;AAED,UAAM,WAAW,MAAM,MAAM,KAAK,OAAO,SAAS;AAAA,MAChD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAAA;AAAA,MAElB,MAAM;AAAA,IAAA,CACP;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,+BAA+B,SAAS,UAAU,EAAE;AAAA,IACtE;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAA;AAC7B,QAAI,KAAK,eAAe,UAAU;AAChC,YAAM,IAAI,MAAM,0BAA0B,KAAK,UAAU,EAAE;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AACF;AChEO,MAAM,qBAAqB,OAAO,kBAA0B;AACjE,QAAMA,UAAS,kBAAkB,KAAA;AAEjC,MAAI;AAEF,UAAM,iBAAiB,YAAY;AACnC,UAAM,kBAAkB,cAAc,cAAc;AAKpD,UAAM,cAAcM,OAAK,QAAQ,eAAe;AAChD,UAAM,WAAWA,OAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,OAAO,IAAI,KAAK;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,KAAK;AAAA,UACH,gBAAgB;AAAA;AAAA,UAEhB,wBAAwB,QAAQ,IAAI;AAAA,UACpC,6BAA6B,QAAQ,IAAI;AAAA,UACzC,0BAA0B,QAAQ,IAAI;AAAA,UACtC,YAAY,QAAQ,IAAI;AAAA,UACxB,WAAW,QAAQ,IAAI;AAAA,UACvB,UAAU,QAAQ,IAAI;AAAA,UACtB,gBAAgB,QAAQ,IAAI;AAAA,UAC5B,WAAW,QAAQ,IAAI;AAAA;AAAA,UAEvB,GAAG,QAAQ;AAAA,QAAA;AAAA,MACb;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA,QAIJ;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAUN,QAAO;AAAA,QAAA;AAAA,QAEnB;AAAA,UACE,MAAM;AAAA;AAAA,UAEN,UAAUA,QAAO;AAAA,QAAA;AAAA,QAEnB;AAAA,UACE,MAAM;AAAA,UACN,UAAUA,QAAO;AAAA,QAAA;AAAA,QAEnB;AAAA,UACE,MAAM;AAAA,UACN,UAAUA,QAAO;AAAA,QAAA;AAAA,MACnB;AAAA,IACF,CACD;AAED,WAAO;AAAA,MACL;AAAA,IAAA;AAEF,UAAM,aAAa,KAAK,OAAO,KAAK,IAAI,CAAC,SAAc;AAAA,MACrD,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,MACd,SAAS,IAAI;AAAA,IAAA,EACb;AACF,WAAO,KAAK,uBAAuB,EAAE,MAAM,YAAY;AAEvD,UAAM,WAAW,IAAI,SAAS,EAAE,OAAO,CAAC,IAAI,GAAG;AAC/C,aAAS,OAAA;AAET,KAAC,YAAY;AACX,YAAM,KAAK,MAAA;AAAA,IACb,GAAA;AAEA,SAAK,GAAG,cAAc,CAAC,QAAQ;AAC7B,cAAQ,IAAI,SAAS,IAAI,OAAO,UAAU;AAAA,IAC5C,CAAC;AAED,SAAK,GAAG,gBAAgB,CAAC,QAAQ;AAC/B,UAAI,IAAI,OAAO;AACb,gBAAQ,MAAM,SAAS,IAAI,OAAO,YAAY,IAAI,KAAK;AAAA,MACzD,OAAO;AACL,gBAAQ,IAAI,SAAS,IAAI,OAAO,0BAA0B;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,SAAK,GAAG,SAAS,CAACE,WAAU;AAC1B,cAAQ,MAAM,eAAeA,MAAK;AAAA,IACpC,CAAC;AAGD,WAAO;AAAA,MACL;AAAA,IAAA;AAAA,EAEJ,SAASA,QAAO;AACd,WAAO,MAAM,+CAA+CA,MAAK;AAAA,EACnE;AACF;AC7GO,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,MAAM,EAAE,SAAS,SAAS,mBAAmB;AAAA,EAC7C,UAAU,EAAE,SAAS,SAAS,uBAAuB;AAAA,EACrD,UAAU,EAAE,SAAS,SAAS,4BAA4B;AAAA,EAC1D,QAAQ,EAAE,SAAS,SAAS,qBAAqB;AAAA,EACjD,MAAM,EAAE,OAAO,SAAS,MAAM,SAAS,kCAAkC,EAAE,QAAQ,IAAI;AAAA,EACvF,mBAAmB,EAAE,OAClB,SACA,MACA,SAAS,gDAAgD,EACzD,QAAQ,GAAK;AAAA,EAChB,gBAAgB,EAAE,OACf,SACA,MACA,SAAS,6CAA6C,EACtD,QAAQ,GAAK;AAAA,EAChB,MAAM,EAAE,OAAO;AAAA,IACb,KAAK,EAAE,OACJ,SACA,MACA,SAAS,2CAA2C,EACpD,QAAQ,EAAE;AAAA,IACb,KAAK,EAAE,OACJ,SACA,MACA,YAAY,+CAA+C,EAC3D,QAAQ,CAAC;AAAA,IACZ,mBAAmB,EAAE,OAClB,OAAA,EACA,IAAA,EACA,YAAY,8CAA8C,EAC1D,QAAQ,GAAK;AAAA,EAAA,CACjB;AAAA,EACD,SAAS,EAAE,OAAO;AAAA,IAChB,SAAS,EAAE,OAAO,QAAA,EAAU,QAAQ,KAAK;AAAA,IACzC,wBAAwB,EAAE,OAAO,QAAA,EAAU,QAAQ,KAAK;AAAA,EAAA,CACzD;AACH,CAAC;AC3BM,MAAM,iBAAiB;AAAA,EACpB,aAAoC;AAAA,EACpC;AAAA,EAER,YAAYF,SAAgC;AAC1C,SAAK,SAASA;AAAA,EAChB;AAAA,EAEA,MAAM,UAAU;AACd,UAAM,KAAK,gBAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,yBACX,oBACA,QACA,QACkC;AAClC,UAAM,aAAa,MAAM,KAAK,eAAA;AAE9B,UAAM,oBAAoB,IAAI,IAAI,kBAAkB,UAAU;AAG9D,WAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACnC,wBAAkB,MAAM,KAAK,IAAI,OAAO;AAAA,IAC1C,CAAC;AAGD,UAAM,aACJ,QAAQ,UAAU,SACd,GAAG,kBAAkB,WAAW,OAAO,UAAU,CAAC,oBAAoB,OAAO,KAAK,eAClF;AAEN,UAAM,kBAAkB,QAAQ,UAAU;AAE1C,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,kBAAkB,QAAQ,MAAM;AAAA,IAClD,SAASE,QAAO;AACd,YAAM,YAAYA;AAClB,YAAM,eACJ,sCACC,UAAU,QAAQ,UAAU,UAAU,KAAK,OAAO,MACnD,SAAS,UAAU,IAAI,cACX,UAAU,OAAO,YACnB,UAAU,KAAK;AAE3B,YAAM,IAAI,MAAM,YAAY;AAAA,IAC9B,UAAA;AACE,UAAI;AACF,cAAM,kBAAkB,UAAA;AAAA,MAC1B,SAAS,gBAAgB;AACvB,eAAO,MAAM,2BAA2B,cAAc;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,aAAa,iBAAiB,mBAAmB,SAAS,SAAS;AACzE,UAAM,cAAc,SAAS,aAAa,CAAC,KAAK;AAGhD,UAAM,YACJ,QAAQ,WAAW,SACf,WAAW;AAAA,MACT,OAAO;AAAA,OACN,OAAO,UAAU,MAAM,OAAO,SAAS,WAAW;AAAA,IAAA,IAErD;AAEN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,OAAO,QAAQ,SAAS;AAAA,QACxB,QAAQ,QAAQ,UAAU;AAAA,QAC1B,WAAW,MAAM;AACf,gBAAM,kBAAkB,QAAQ,UAAU,MAAM,QAAQ,SAAS;AACjE,iBAAO,QAAQ,SAAS,iBAAiB,cACrC,OAAO,cAAc,IACrB;AAAA,QACN,GAAA;AAAA,QACA,cAAc,QAAQ,SAClB,OAAO,KAAK,IAAI,IAAI,OAAO,UAAU,MAAM,OAAO,SAAS,GAAG,CAAC,IAC/D;AAAA,MAAA;AAAA,IACN;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAA0C;AAE9C,QAAI,KAAK,YAAY,WAAW;AAC9B,aAAO,MAAM,wCAAwC;AACrD,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,KAAK,YAAY;AACnB,aAAO,MAAM,6CAA6C;AAC1D,WAAK,aAAa;AAAA,IACpB;AAEA,QAAI;AACF,aAAO,KAAK,mCAAmC;AAC/C,YAAM,YAAY,sBAAsB,MAAM;AAAA,QAC5C,MAAM,KAAK,OAAO;AAAA,QAClB,UAAU,KAAK,OAAO;AAAA,QACtB,UAAU,KAAK,OAAO;AAAA,QACtB,QAAQ,KAAK,OAAO;AAAA,QACpB,MAAM,SAAS,KAAK,OAAO,IAAI;AAAA,QAC/B,mBAAmB,SAAS,KAAK,OAAO,iBAAiB;AAAA,QACzD,gBAAgB,SAAS,KAAK,OAAO,cAAc;AAAA,QACnD,MAAM;AAAA,UACJ,KAAK,SAAS,KAAK,OAAO,OAAO;AAAA,UACjC,KAAK,SAAS,KAAK,OAAO,OAAO;AAAA,UACjC,mBAAmB,SAAS,KAAK,OAAO,iBAAiB;AAAA,QAAA;AAAA,QAE3D,SAAS;AAAA,UACP,SAAS,KAAK,OAAO;AAAA,UACrB,wBAAwB,KAAK,OAAO;AAAA,QAAA;AAAA,MACtC,CACD;AAED,WAAK,aAAa,MAAM,IAAI,QAAQ,SAAS;AAC7C,aAAO,KAAK;AAAA,IACd,SAASA,QAAO;AACd,aAAO,MAAM,wDAAwD;AAAA,QACnE,OAAAA;AAAA,MAAA,CACD;AACD,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,mBACZ,WAC0B;AAC1B,UAAM,OACJ,WAAW,IAAI,CAAC,QAAQ;AACtB,YAAM,iBAAyC,CAAA;AAC/C,aAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,QAAQ;AAChC,uBAAe,GAAG,IAAI,IAAI,GAAG,GAAG,cAAc;AAAA,MAChD,CAAC;AACD,aAAO;AAAA,IACT,CAAC,KAAK,CAAA;AAER,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI,KAAK,YAAY,WAAW;AAC9B,aAAO,KAAK,+BAA+B;AAC3C,UAAI;AACF,cAAM,KAAK,WAAW,MAAA;AAAA,MACxB,SAASA,QAAO;AACd,eAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,OAAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AACF;ACnLO,MAAM,sBAAsB;AAAA,EACjC,YAAoB,YAAgC;AAAhC,SAAA,aAAA;AAAA,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrD,MAAM,mBACJ,WACA,MACAF,UAA+B,CAAA,GACP;AACxB,UAAM,cAAc,IAAI,IAAI,YAAY,KAAK,UAAU;AACvD,UAAM,iBACJA,QAAO,kBAAkB,IAAI,gBAAgB;AAE/C,QAAI;AACF,YAAM,YAAY,MAAM,cAAc;AACtC,YAAM,SAAS,MAAM,UAAU,QAAQ,aAAa,IAAI;AACxD,YAAM,YAAY,OAAA;AAClB,aAAO;AAAA,IACT,SAASE,QAAO;AACd,aAAO,MAAM,sBAAsBA,MAAK;AACxC,UAAI;AACF,cAAM,YAAY,SAAA;AAAA,MACpB,SAAS,eAAe;AACtB,eAAO,MAAM,mBAAmB,aAAa;AAAA,MAC/C;AACA,YAAMA;AAAA,IACR;AAAA,EACF;AACF;AC/BO,MAAM,8BAEb;AAAA,EACE,YAA6B,UAAkB;AAAlB,SAAA,WAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,QACJ,aACA,QACiB;AACjB,UAAM,UAAU,YAAY,QAAA;AAC5B,WAAO,QAAQ,CAAC,UAAU;AACxB,cAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IACnD,CAAC;AAED,UAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,QAAQ;AAEhD,QAAI,CAAC,OAAO,UAAU,CAAC,EAAE,gBAAgB;AACvC,YAAM,IAAI;AAAA,QACR,kEACE,KAAK,UAAU,QAAQ,YAAY,MAAM,CAAC;AAAA,MAAA;AAAA,IAEhD;AAEA,WAAO,OAAO,UAAU,CAAC,EAAE;AAAA,EAC7B;AACF;AAUO,MAAM,8BAEb;AAAA,EACE,YAA6B,UAAkB;AAAlB,SAAA,WAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,QACJ,aACA,QACiB;AACjB,UAAM,UAAU,YAAY,QAAA;AAC5B,WAAO,QAAQ,CAAC,UAAU;AACxB,cAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IACnD,CAAC;AAED,UAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,QAAQ;AAChD,WAAO,OAAO,aAAa,CAAC;AAAA,EAC9B;AACF;ACvDO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa3B,aAAa,kBACX,kBACA,aACA,WACA,aAC+B;AAC/B,UAAM,aAAa,MAAM,iBAAiB,eAAA;AAC1C,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,qBAAqB,IAAI,sBAAsB,UAAU;AAC/D,UAAM,gBAAgB,MAAM,mBAAmB;AAAA,MAC7C,IAAI,8BAA8B,WAAW;AAAA,MAC7C;AAAA,IAAA;AAGF,QAAI,eAAe;AACjB,kBAAY,gBAAgB,cAAc,SAAA;AAC1C,aAAO;AAAA,IACT,OAAO;AACL,YAAM,IAAI;AAAA,QACR,sEAAsE,YAAY,cAAc;AAAA,MAAA;AAAA,IAEpG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,aAAa,kBACX,kBACA,aACA,WACA,aAC+B;AAC/B,UAAM,aAAa,MAAM,iBAAiB,eAAA;AAC1C,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,qBAAqB,IAAI,sBAAsB,UAAU;AAC/D,UAAM,mBAAmB;AAAA,MACvB,IAAI,8BAA8B,WAAW;AAAA,MAC7C;AAAA,IAAA;AAGF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAe,QAA0B;AAC9C,WAAO,KAAK,sBAAsB;AAClC,WAAO,KAAK,0CAA0C;AACtD,WAAO,KAAK,+BAA+B;AAC3C,WAAO,KAAK,0CAA0C;AACtD,WAAO,QAAQ,CAAC,UAAU;AACxB,aAAO,KAAK,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC,MAAM,MAAM,KAAK,EAAE;AAAA,IACzD,CAAC;AACD,WAAO,KAAK,0CAA0C;AAAA,EACxD;AACF;;;;;AClGA;AAEA,SAAA,UAAiB;AAEjB,QAAM,MAAM;AACZ,QAAMa,OAAKC;AACX,QAAMV,QAAOW;AAEb,SAAA,QAAA,SAAwB,SAAS,MAAMjB,SAAQ;AAC7C,UAAM,KAAK,KAAK;AAChB,UAAM,MAAM,IAAI,MAAM,EAAE;AACxB,IAAAA,QAAO,SAAU,CAAC,IAAI,YAAY,IAAI,aAAa,MAAO,KAAK,IAAI,SAAS,QAAQ,KAAK,EAAE;AAC3F,QAAI,KAAK,UAAU,KAAK,QAAQ;AAC9B,MAAAA,QAAO,SAAS,KAAK;AACrB,MAAAA,QAAO,SAAS,KAAK;AACrB,MAAAA,QAAO,WAAW,KAAK;AACvB,MAAAA,QAAO,mBAAmB,KAAK;AAAA,IACnC,OAAS;AACL,YAAM,QAAQ,IAAI,SAAS,MAAM,KAAK;AACtC,YAAM,SAAS,MAAM,CAAC;AACtB,UAAI,CAAC,QAAQ;AACX;AAAA,MACN;AACI,UAAI,CAACA,QAAO,QAAQ;AAClB,QAAAA,QAAO,SAAS;AAAA,MACtB;AACI,UAAI,CAACA,QAAO,QAAQ;AAClB,cAAM,SAAS,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7C,YAAI,WAAW,aAAa;AAC1B,UAAAA,QAAO,SAAS;AAAA,QACxB,OAAa;AACL,UAAAA,QAAO,SAAS;AAAA,QACxB;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAEA,SAAA,QAAA,SAAwB,SAASA,SAAQ;AAEvC,QAAI,QAAQ,IAAI,sBAAsB;AAGpC,YAAM,UAAU;AAChB,YAAMkB,MAAKC;AAEX,cAAQ,OAAO,WAAW,GAAGD,IAAG,OAAM,CAAE;AAExC,YAAME,MAAK,QAAQ,GAAE;AAIrB,YAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,SAAS;AACpC,YAAI,OAAO,IAAI,SAAS,UAAU;AAChC,cAAI,OAAO;AAAA,QACnB;AACM,eAAO,GAAG,KAAK,GAAG,IAAI;AAAA,MAC5B;AAEI,aAAO;AAAA,QACL,YAAY,QAAQ,UAAU;AAC5B,iBAAOA,IAAG,YAAY,QAAQ,IAAI,QAAQ,CAAC;AAAA,QACnD;AAAA,QACM,WAAW,QAAQ,UAAU;AAC3B,iBAAOA,IAAG,WAAW,QAAQ,IAAI,QAAQ,CAAC;AAAA,QAClD;AAAA,QACM,aAAa,QAAQ,UAAU;AAC7B,iBAAOA,IAAG,aAAa,QAAQ,IAAI,QAAQ,CAAC;AAAA,QACpD;AAAA,QACM,UAAU,QAAQ,UAAU;AAC1B,iBAAOA,IAAG,UAAU,QAAQ,IAAI,QAAQ,CAAC;AAAA,QACjD;AAAA,MACA;AAAA,IACA;AAGE,UAAM,MAAMC;AAEZ,QAAI,OAAO,OAAOrB,OAAM;AACxB,UAAM,KAAK,IAAI,IAAI,GAAE;AAGrB,WAAO;AAAA,MACL,YAAY,QAAQ,UAAU;AAC5B,eAAO,GAAG,YAAY,QAAQ,QAAQ;AAAA,MAC5C;AAAA,MACI,WAAW,QAAQ,UAAU;AAC3B,eAAO,GAAG,WAAW,QAAQ,QAAQ;AAAA,MAC3C;AAAA,MACI,aAAa,QAAQ,UAAU;AAC7B,eAAO,GAAG,aAAa,QAAQ,QAAQ;AAAA,MAC7C;AAAA,MACI,UAAU,QAAQ,UAAU;AAC1B,eAAO,GAAG,UAAU,QAAQ,QAAQ;AAAA,MAC1C;AAAA,IACA;AAAA,EAIA;AAOA,SAAA,QAAA,iBAAgC,WAAW;AACzC,QAAI,UAAU;AACd,QAAI,CAAC,QAAQ,IAAI,sBAAsB;AACrC,aAAO,MAAM;AAAA,IACjB;AAEE,UAAM,OAAO;AAEb,UAAM,OAAO;AACb,UAAM,UAAU,QAAQ,IAAI,uBAAuB;AAGnD,UAAM,YAAY,MAAM;AAEtB,eAAS,IAAI,KAAK,aAAa;AAC7B,cAAM,WAAWM,MAAK,KAAK,SAAS,IAAI,QAAQ,OAAO,GAAG,CAAC;AAE3D,YAAI;AACFS,eAAG,WAAW,UAAUA,KAAG,UAAU,IAAI;AAAA,QACjD,SAAe,GAAG;AACV,iBAAO,CAAC,KAAK,aAAa;AAAA,QAClC;AAGM,eAAO,CAAC,KAAKA,KAAG,iBAAiB,QAAQ,CAAC;AAAA,MAChD;AAGI,aAAO,KAAK,IAAI,EACb,QAAO,EACP,IAAI,MAAM,OAAO,EACjB,MAAM,GAAG;AAAA,IAChB;AAGE,cAAU,MAAM,MAAM,OAAO;AAE7B,UAAM,aAAa,CAAC,WAAW;AAC7B,YAAM,WAAW;AACjB,UAAI,WAAW,OAAO;AACpB,kBAAU;AAAA,MAChB,WAAe,WAAW,MAAM;AAC1B,kBAAU;AAAA,MAChB,WAAe,WAAW,OAAO;AAC3B,cAAM,IAAI,MAAM,kCAAkC,MAAM,EAAE;AAAA,MAChE;AACI,aAAO;AAAA,IACX;AAME,WAAO;AAAA,EACT;;;;;;;;AC/JA,SAAA,UAAiB,UAAUO,QAAO,SAASA;AAE3C,EAAAA,QAAO,cAAc;AAErB,WAAS,cAAe;AACtB,WAAO,eAAe,MAAM,WAAW,UAAU;AAAA,MAC/C,OAAO,WAAY;AAAE,eAAOA,QAAO,IAAI;AAAA,MAAC;AAAA,MACxC,YAAY;AAAA,MAAO,cAAc;AAAA,MAAM,UAAU;AAAA,IACrD,CAAG;AAED,WAAO,eAAe,OAAO,WAAW,UAAU;AAAA,MAChD,OAAO,WAAY;AAAE,eAAOA,QAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MAAC;AAAA,MACrD,YAAY;AAAA,MAAO,cAAc;AAAA,MAAM,UAAU;AAAA,IACrD,CAAG;AAAA,EACH;AAEA,WAASA,QAAQ,MAAM;AACrB,QAAI,UAAU,WAAW,KAAK,CAAC,MAAM,QAAQ,IAAI,GAAG;AAClD,aAAO,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC;AAAA,IAClD;AACE,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,IAAK,IAAI,GAAI,KAAM;AACzD,WAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC;AAAA,IACpE;AAGE,WAAO,KAAK,KAAK,OAAO;AAGxB,QAAI,UAAU,CAAA,GACV,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,KAAK,QAAS,IAAI,GAAI,KAAM;AAC9C,UAAI,UAAU,KAAK,CAAC,GAChB,OAAO,KAAK,IAAI,CAAC,KAAK,IACtB,cAAc,MACd,cAAc;AAClB,UAAI,YAAY,KAAM;AACtB,eAAS,IAAI,GAAG,KAAK,QAAQ,QAAS,IAAI,IAAK,KAAM;AACnD,YAAI,UAAU,QAAQ,OAAO,CAAC;AAC9B,sBAAc,eAAe,YAAY,KAAK,OAAO,CAAC;AACtD,sBAAc,eAAe,YAAY,KAAK,OAAO,CAAC;AACtD,YAAI,CAAC,eAAe,CAAC,aAAa;AAChC;AACA;AAAA,QACR;AAAA,MACA;AACI,aAAO;AACP,UAAI,MAAM,IAAI;AACZ,gBAAQ,OAAO,IAAI;AACnB;AAAA,MACN;AACI,eAASb,KAAI,QAAQ,OAAO,GAAG,CAAC,GAAI,KAAK,IAAK,KAAM;AAClD,gBAAQA,EAAC,IAAI;AACb,QAAAA,MAAK,QAAQ,OAAO,CAAC;AAAA,MAC3B;AAAA,IACA;AACE,WAAO;AAAA,EACT;AAEA,WAAS,QAASA,IAAG,GAAG;AACtB,WAAOA,OAAM,IAAI,IAAIA,KAAI,IAAI,IAAI;AAAA,EACnC;;;;;;AC1DA,MAAI,QAAQ,QAAQ,IAAI,cAAc,QAAQ,IAAI,aAC9C,WAAY;AAAE,YAAQ,MAAM,MAAM,SAAS,SAAS;AAAA,EAAC,IACrD,WAAY;AAAA,EAAA;AAEhB,MAAI,MAAM,YACNH,QAAOU,QACP,SAASC,WAAkB,QAC3BK,UAASC,eACTL,MAAKC;AAET,SAAA,UAAiB,UAAUK;AAC3B,UAAA,QAAgB;AAEhB,UAAA,WACE;AAAA,IAAE,QAAU,EAAE,MAAM,QAAS,UAAU,eAAc;AAAA,IACnD,SAAU,EAAE,MAAM,SAAS,UAAU,gBAAe;AAAA,IACpD,KAAU,EAAE,MAAM,KAAS,UAAU,YAAW;AAAA,IAChD,QAAU,EAAE,MAAM,QAAS,UAAU,eAAc;AAAA,IACnD,MAAU,EAAE,MAAMlB,OAAS,UAAU,aAAY;AAAA,IACjD,QAAU,EAAE,MAAM,QAAS,UAAU,eAAc;AAAA,IACnD,MAAU,EAAE,MAAM,MAAS,UAAU,aAAY;AAAA;AAGrD,WAASkB,MAAMC,QAAO,YAAY,MAAM,OAAO;AAC7C,WAAO,QAAQ,QAAQ;AACvB,IAAAA,SAAQA,UAAS,CAAA;AACjB,iBAAa,cAAc,CAAA;AAC3B,QAAI,OAAO,UAAU,SAAU,SAAQ;AAEvC,UAAMA,QAAO,YAAY,MAAM,KAAK;AAEpC,WAAO,KAAK,MAAM,KAAK;AACvB,QAAI,OAAO,CAAA,GACP,KACA,OAAO;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,QAAQ;AAAA,MACR,UAAU,KAAK,MAAM,CAAC;AAAA;AAG5B,UAAM,MAAM,MAAM,KAAK,QAAQA,QAAO,UAAU;AAEhD,UAAM,MAAMA,QAAO,QAAQ,QAAQ;AACnC,SAAK,OAAO;AACZ,WAAO,eAAe,KAAK,MAAM,YAAY,EAAE,OAAO,WAAY;AAChE,aAAO,KAAK,SAAS,IAAI,KAAK,SAAS,EAAE,KAAK,GAAG;AAAA,IACrD,GAAK,YAAY,MAAK,CAAE;AACtB,WAAO;AAAA,EACT;AAEA,WAAS,MAAO,MAAMA,QAAO,UAAU;AACrC,eAAW,YAAY,QAAQ;AAC/B,QAAI,SAAS,CAAA,GACT,cAAc,CAAC,OAAO,MAAM,MAAM,QAAQ,KAAK;AAEnD,WAAO,KAAK,IAAI,EAAE,QAAQ,SAAU,GAAG;AACrC,UAAI,MAAM,OAAQ;AAClB,UAAI,MAAM,KAAK,CAAC,GACZ,UAAU,MAAM,QAAQ,GAAG,GAC3B,OAAOA,OAAM,CAAC;AAClB,UAAI,CAAC,QAAS,OAAM,CAAC,GAAG;AACxB,UAAI,CAAC,KAAM,QAAO;AAClB,UAAI,SAAS,MAAO,QAAO,YAAY,OAAO,KAAK;AACnD,UAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,YAAM,UAAU,GAAG;AACnB,YAAM,UAAU,IAAI;AACpB,YAAM,IAAI,IAAI,SAAUC,MAAK;AAE3B,YAAI,OAAOA,SAAQ,UAAU;AAC3B,gBAAM,aAAaA,IAAG;AACtB,UAAAA,OAAMA,KAAI,KAAI;AACd,cAAKA,SAAQ,UAAU,CAAC,KAAK,QAAQ,IAAI,KACjCA,SAAQ,WACR,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,QAAQ,OAAO,MAC5CA,SAAQ,YACR,CAAC,KAAK,QAAQ,KAAK,KAAK,CAAC,KAAK,QAAQ,OAAO,IAAK;AACxD,YAAAA,OAAM,KAAK,MAAMA,IAAG;AACpB,kBAAM,eAAeA,IAAG;AAAA,UAClC,WAAmB,CAAC,KAAK,QAAQ,MAAM,KAAK,CAAC,MAAMA,IAAG,GAAG;AAC/C,kBAAM,qBAAqBA,IAAG;AAC9B,YAAAA,OAAM,CAACA;AAAA,UACjB,WAAmB,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,MAAMA,IAAG,CAAC,GAAG;AACzD,kBAAM,mBAAmBA,IAAG;AAC5B,YAAAA,OAAM,IAAI,KAAKA,IAAG;AAAA,UAC5B;AAAA,QACA;AAEM,YAAI,CAACD,OAAM,eAAe,CAAC,GAAG;AAC5B,iBAAOC;AAAA,QACf;AAGM,YAAIA,SAAQ,SAAS,CAAC,KAAK,QAAQ,IAAI,KACnC,EAAE,CAAC,KAAK,QAAQ,KAAK,KAAK,CAAC,KAAK,QAAQ,OAAO,IAAI;AACrD,UAAAA,OAAM;AAAA,QACd;AAEM,YAAIC,KAAI,CAAA;AACR,QAAAA,GAAE,CAAC,IAAID;AACP,cAAM,oBAAoBC,IAAGD,MAAKD,OAAM,CAAC,CAAC;AAC1C,YAAI,CAACG,UAASD,IAAG,GAAGD,MAAKD,OAAM,CAAC,GAAG,QAAQ,GAAG;AAC5C,cAAI,QAAQ,gBAAgB;AAC1B,oBAAQ,eAAe,GAAGC,MAAKD,OAAM,CAAC,GAAG,IAAI;AAAA,UACvD,WAAmB,QAAQ,mBAAmB,OAAO;AAC3C,kBAAM,cAAY,IAAE,MAAIC,MAAKD,OAAM,CAAC,CAAC;AAAA,UAC/C;AACQ,iBAAO;AAAA,QACf;AACM,cAAM,iBAAiBE,IAAGD,MAAKD,OAAM,CAAC,CAAC;AACvC,eAAOE,GAAE,CAAC;AAAA,MAChB,CAAK,EAAE,OAAO,SAAUD,MAAK;AAAE,eAAOA,SAAQ;AAAA,OAAQ;AAIlD,UAAI,CAAC,IAAI,UAAU,KAAK,QAAQ,KAAK,MAAM,IAAI;AAC7C,cAAM,gCAAgC,KAAK,GAAG,KAAK,QAAQ,KAAK,CAAC;AACjE,eAAO,KAAK,CAAC;AAAA,MACnB,WACa,SAAS;AAChB,cAAM,SAAS,KAAK,CAAC,GAAG,GAAG;AAC3B,aAAK,CAAC,IAAI;AAAA,MAChB,MAAW,MAAK,CAAC,IAAI,IAAI,CAAC;AAEtB,YAAM,eAAe,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,IACxC,CAAG;AAAA,EACH;AAEA,WAAS,eAAgB,MAAM,GAAG,KAAK;AACrC,SAAK,CAAC,IAAI,OAAO,GAAG;AAAA,EACtB;AAEA,WAAS,aAAc,MAAM,GAAG,KAAK;AACnC,QAAI,QAAQ,KAAM,QAAO;AACzB,QAAI,QAAQ,KAAM,QAAO;AAEzB,UAAM,OAAO,GAAG;AAEhB,QAAI,QAAc,QAAQ,aAAa,SACnC,cAAc,QAAQ,cAAc,QACpC,OAAcR,IAAG,QAAO;AAE5B,QAAI,QAAQ,IAAI,MAAM,WAAW,GAAG;AAClC,WAAK,CAAC,IAAIZ,MAAK,QAAQ,MAAM,IAAI,OAAO,CAAC,CAAC;AAAA,IAC9C,OAAS;AACL,WAAK,CAAC,IAAIA,MAAK,QAAQ,GAAG;AAAA,IAC9B;AACE,WAAO;AAAA,EACT;AAEA,WAAS,eAAgB,MAAM,GAAG,KAAK;AACrC,UAAM,4BAA4B,GAAG,KAAK,MAAM,GAAG,CAAC;AACpD,QAAI,MAAM,GAAG,EAAG,QAAO;AACvB,SAAK,CAAC,IAAI,CAAC;AAAA,EACb;AAEA,WAAS,aAAc,MAAM,GAAG,KAAK;AACnC,QAAI,IAAI,KAAK,MAAM,GAAG;AACtB,UAAM,0BAA0B,GAAG,KAAK,CAAC;AACzC,QAAI,MAAM,CAAC,EAAG,QAAO;AACrB,SAAK,CAAC,IAAI,IAAI,KAAK,GAAG;AAAA,EACxB;AAEA,WAAS,gBAAiB,MAAM,GAAG,KAAK;AACtC,QAAI,eAAe,QAAS,OAAM,IAAI,QAAO;AAAA,aACpC,OAAO,QAAQ,UAAU;AAChC,UAAI,CAAC,MAAM,GAAG,EAAG,OAAM,CAAC,CAAE,CAAC;AAAA,eAClB,QAAQ,UAAU,QAAQ,QAAS,OAAM;AAAA,UAC7C,OAAM;AAAA,IACf,MAAS,OAAM,CAAC,CAAC;AACf,SAAK,CAAC,IAAI;AAAA,EACZ;AAEA,WAAS,YAAa,MAAM,GAAG,KAAK;AAClC,UAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAC3B,QAAI,CAAC,IAAI,KAAM,QAAO;AACtB,SAAK,CAAC,IAAI,IAAI;AAAA,EAChB;AAEA,WAAS,eAAgB,MAAM,GAAG,KAAK;AACrC,QAAI,EAAE,eAAe,QAAS,QAAO;AACrC,SAAK,CAAC,IAAI;AAAA,EACZ;AAEA,WAASsB,UAAU,MAAM,GAAG,KAAK,MAAM,UAAU;AAE/C,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAM;AAC5C,YAAI,KAAK,CAAC,MAAM,MAAO;AACvB,YAAIA,UAAS,MAAM,GAAG,KAAK,KAAK,CAAC,GAAG,QAAQ,EAAG,QAAO;AAAA,MAC5D;AACI,aAAO,KAAK,CAAC;AACb,aAAO;AAAA,IACX;AAGE,QAAI,SAAS,MAAO,QAAO;AAG3B,QAAI,SAAS,MAAM;AACjB,YAAM,cAAc,GAAG,KAAK,IAAI;AAChC,aAAO,KAAK,CAAC;AACb,aAAO;AAAA,IACX;AAGE,QAAI,QAAQ,MAAM;AAChB,YAAM,yBAAyB,GAAG;AAGlC,WAAK,CAAC,IAAI;AACV,aAAO;AAAA,IACX;AAGE,QAAI,KAAK,OACLH,SAAQ,OAAO,KAAK,QAAQ;AAChC,aAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,IAAI,GAAG,KAAM;AAC7C,YAAM,sBAAsB,GAAG,KAAKA,OAAM,CAAC,CAAC;AAC5C,UAAI,IAAI,SAASA,OAAM,CAAC,CAAC;AACzB,UAAI,MACA,QAAQ,KAAK,QAAQ,EAAE,QAAQ,EAAE,KAAK,OAAS,KAAK,SAAS,EAAE,KAAK,OAAS,SAAS,EAAE,OAAQ;AAClG,YAAIE,KAAI,CAAA;AACR,aAAK,UAAU,EAAE,SAASA,IAAG,GAAG,GAAG;AACnC,cAAMA,GAAE,CAAC;AACT,YAAI,IAAI;AAGN,eAAK,CAAC,IAAI;AACV;AAAA,QACR;AAAA,MACA;AAAA,IACA;AACE,UAAM,qBAAqB,IAAI,GAAG,KAAKF,OAAM,CAAC,CAAC;AAE/C,QAAI,CAAC,GAAI,QAAO,KAAK,CAAC;AACtB,WAAO;AAAA,EACT;AAEA,WAAS,MAAO,MAAM,MAAM,QAAQA,QAAO,YAAY;AACrD,UAAM,SAAS,MAAM,MAAM,MAAM;AAEjC,QAAI,MAAM,MACN,UAAUH,QAAO,OAAO,KAAKG,MAAK,CAAC,GACnC,YAAYH,QAAO,OAAO,KAAK,UAAU,CAAC;AAE9C,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAM;AACrC,UAAI,MAAM,KAAK,CAAC;AAChB,YAAM,OAAO,GAAG;AAEhB,UAAI,IAAI,MAAM,SAAS,GAAG;AAGxB,eAAO,KAAK,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC;AAC3C,aAAK,CAAC,IAAI;AACV;AAAA,MACN;AACI,UAAI,QAAQ;AACZ,UAAI,IAAI,OAAO,CAAC,MAAM,OAAO,IAAI,SAAS,GAAG;AAC3C,YAAI,KAAK,IAAI,QAAQ,GAAG;AACxB,YAAI,KAAK,IAAI;AACX,kBAAQ;AACR,cAAI,IAAI,IAAI,OAAO,KAAK,CAAC;AACzB,gBAAM,IAAI,OAAO,GAAG,EAAE;AACtB,eAAK,OAAO,GAAG,GAAG,KAAK,CAAC;AAAA,QAChC;AAIM,YAAI,QAAQ,aAAa,KAAK,YAAY,WAAW,OAAO;AAC5D,cAAM,mBAAmB,KAAK,KAAK;AACnC,YAAI,OAAO;AACT,gBAAM,KAAK,KAAK;AAChB,eAAK,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;AAC5C,cAAI,QAAQ,MAAM,CAAC,GAAG;AACpB;AACA;AAAA,UACV;AAAA,QACA;AACM,cAAM,IAAI,QAAQ,OAAO,EAAE;AAC3B,YAAI,KAAK;AACT,eAAO,IAAI,YAAW,EAAG,QAAQ,KAAK,MAAM,GAAG;AAC7C,eAAK,CAAC;AACN,gBAAM,IAAI,OAAO,CAAC;AAAA,QAC1B;AAEM,YAAI,QAAQ,GAAG,EAAG,OAAM,QAAQ,GAAG;AAEnC,YAAI,UAAUG,OAAM,GAAG;AACvB,YAAI,cAAc,MAAM,QAAQ,OAAO;AACvC,YAAI,eAAe,QAAQ,WAAW,GAAG;AACvC,wBAAc;AACd,oBAAU,QAAQ,CAAC;AAAA,QAC3B;AAEM,YAAI,UAAU,YAAY,SACxB,eAAe,QAAQ,QAAQ,KAAK,MAAM;AAG5C,YAAI,CAACA,OAAM,eAAe,GAAG,KAAK,KAAK,eAAe,GAAG,GAAG;AAC1D,cAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,CAAC;AAC1B,iBAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AACxB,oBAAU;AAAA,QAClB;AAEM,YAAI,KACA,KAAK,KAAK,IAAI,CAAC;AAEnB,YAAI,SAAS,OAAO,OAAO,aACzB,YAAY,WACZ,eAAe,QAAQ,QAAQ,OAAO,MAAM,MAC3C,OAAO,YAAY,eAAe,CAAC,SACnC,OAAO,YACN,YAAY,QACZ,eAAe,CAAC,QAAQ,QAAQ,IAAI;AAExC,YAAI,QAAQ;AAEV,gBAAM,CAAC;AAEP,cAAI,OAAO,UAAU,OAAO,SAAS;AACnC,kBAAM,KAAK,MAAM,EAAE;AACnB,iBAAK;AACL,gBAAI,GAAI,OAAM,CAAC;AACf;AAAA,UACV;AAGQ,cAAI,eAAe,IAAI;AACrB,gBAAI,CAAC,QAAQ,QAAQ,EAAE,GAAG;AAExB,oBAAM;AACN;AAAA,YACZ,WAAsB,OAAO,UAAU,CAAC,QAAQ,QAAQ,IAAI,GAAI;AAEpD,oBAAM;AACN;AAAA,YACZ,WAAsB,CAAC,GAAG,MAAM,YAAY,KACtB,CAAC,MAAM,EAAE,KACT,CAAC,QAAQ,QAAQ,MAAM,GAAI;AAErC,oBAAM,CAAC;AACP;AAAA,YACZ,WAAsB,CAAC,GAAG,MAAM,QAAQ,KAAK,CAAC,QAAQ,QAAQ,MAAM,GAAI;AAE5D,oBAAM;AACN;AAAA,YACZ;AAAA,UACA;AAEQ,cAAI,QAAS,EAAC,KAAK,GAAG,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG;AAAA,cAC9C,MAAK,GAAG,IAAI;AAEjB;AAAA,QACR;AAEM,YAAI,YAAY,QAAQ;AACtB,cAAI,OAAO,QAAW;AACpB,iBAAK;AAAA,UACf,WAAmB,GAAG,MAAM,cAAc,GAAG;AACnC,iBAAK;AACL;AAAA,UACV;AAAA,QACA;AAEM,YAAI,MAAM,GAAG,MAAM,SAAS,GAAG;AAC7B,eAAK;AACL;AAAA,QACR;AAEM,cAAM,OAAO,SAAY,OAAO;AAChC,YAAI,QAAS,EAAC,KAAK,GAAG,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG;AAAA,YAC9C,MAAK,GAAG,IAAI;AAEjB;AACA;AAAA,MACN;AACI,aAAO,KAAK,GAAG;AAAA,IACnB;AAAA,EACA;AAEA,WAAS,aAAc,KAAK,YAAY,WAAW,SAAS;AAK1D,UAAM,IAAI,QAAQ,OAAO,EAAE;AAG3B,QAAI,QAAQ,GAAG,MAAM;AACnB,aAAO;AAGT,QAAI,WAAW,GAAG,GAAG;AAEnB,UAAI,WAAW,GAAG,KAAK,CAAC,MAAM,QAAQ,WAAW,GAAG,CAAC;AACnD,mBAAW,GAAG,IAAI,WAAW,GAAG,EAAE,MAAM,KAAK;AAE/C,aAAO,WAAW,GAAG;AAAA,IACzB;AAGE,QAAI,UAAU,WAAW;AACzB,QAAI,CAAC,SAAS;AACZ,gBAAU,OAAO,KAAK,UAAU,EAAE,OAAO,SAAU,GAAG;AACpD,eAAO,EAAE,WAAW;AAAA,MAC1B,CAAK,EAAE,OAAO,SAAU,GAAE,GAAG;AACvB,UAAE,CAAC,IAAI;AACP,eAAO;AAAA,MACb,GAAO,CAAA,CAAE;AACL,iBAAW,aAAa;AACxB,YAAM,qBAAqB,OAAO;AAAA,IACtC;AAEE,QAAI,OAAO,IAAI,MAAM,EAAE,EAAE,OAAO,SAAUtB,IAAG;AAC3C,aAAO,QAAQA,EAAC;AAAA,IACpB,CAAG;AAED,QAAI,KAAK,KAAK,EAAE,MAAM,IAAK,QAAO,KAAK,IAAI,SAAUA,IAAG;AACtD,aAAO,WAAWA,EAAC;AAAA,IACvB,CAAG,EAAE,OAAO,SAAU,GAAG,GAAG;AACxB,aAAO,EAAE,OAAO,CAAC;AAAA,IACrB,GAAK,CAAA,CAAE;AAIL,QAAI,QAAQ,GAAG,KAAK,CAAC,WAAW,GAAG;AACjC,aAAO;AAGT,QAAI,UAAU,GAAG;AACf,YAAM,UAAU,GAAG;AAGrB,QAAI,WAAW,GAAG,KAAK,CAAC,MAAM,QAAQ,WAAW,GAAG,CAAC;AACnD,iBAAW,GAAG,IAAI,WAAW,GAAG,EAAE,MAAM,KAAK;AAE/C,WAAO,WAAW,GAAG;AAAA,EACvB;;;;;;;;;ACxbA;AACA,IAAI,eAAe0B,aAAkB;AACrC,IAAIC,SAAOd;AAEX,IAAI,YAAY;AAChB,IAAIe,gBAAcC,cAAA,UAAiB,SAAUzB,OAAM;AACjD,eAAa,KAAK,IAAI;AACtB,OAAK,KAAK,EAAE;AACZ,OAAK,OAAOA;AACd;AACAuB,OAAK,SAASC,eAAa,YAAY;;;;;ACVvC;AACA,IAAID,SAAOD;AACX,IAAIE,gBAAcf;AAElB,IAAIiB,YAAUC,UAAA,UAAiB,SAAU3B,OAAM,MAAM;AACnDwB,gBAAY,KAAK,MAAMxB,KAAI;AAC3B,OAAK,WAAW;AAChB,OAAK,WAAW,QAAQ;AAC1B;AACAuB,OAAK,SAASG,WAASF,aAAW;AAElCE,UAAQ,UAAU,YAAY,WAAY;AACxC,SAAO,KAAK,aAAa,IAAI,IAAI,KAAK,WAAW,KAAK;AACxD;AAEAA,UAAQ,UAAU,UAAU,SAAU,MAAM;AAC1C,OAAK,YAAY;AACjB,OAAK,KAAK,UAAU,KAAK,MAAM,KAAK,UAAS,GAAI,IAAI;AACvD;AAEAA,UAAQ,UAAU,eAAe,SAAU,MAAM;AAC/C,OAAK,YAAY;AACjB,MAAI,KAAK,WAAW,KAAK,UAAU;AACjC,SAAK,WAAW,KAAK;AAAA,EACzB;AACE,OAAK,KAAK,UAAU,KAAK,MAAM,KAAK,UAAS,GAAI,IAAI;AACvD;AAEAA,UAAQ,UAAU,SAAS,WAAY;AACrC,OAAK,WAAW,KAAK,WAAW;AAChC,OAAK,KAAK,UAAU,KAAK,MAAM,GAAG,IAAI;AACxC;;;;IC1BA,YAAiB;AAUjB,SAAS,UAAU,OAAO,QAAQ;AAChC,MAAI,EAAE,gBAAgB,WAAY,QAAO,IAAI,UAAU,OAAO,MAAM;AACpE,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,UAAU,CAAA;AACf,OAAK,UAAU,CAAA;AACf,OAAK,UAAU,CAAA;AACf,OAAK,UAAU,CAAA;AACjB;AAUA,UAAU,UAAU,SAAS,SAAS1B,OAAK;AACzC,MAAI,QAAQ,KAAK;AACjB,MAAI,SAAS,KAAK;AAClB,OAAK,QAAQ,KAAKA,KAAI;AAEtB,QAAMA,KAAI,IAAI,WAAU;AACtB,WAAO,KAAK,MAAM,EAAEA,KAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;AAAA,EAC3D;AAEE,SAAO;AACT;AAUA,UAAU,UAAU,SAAS,SAASA,OAAK;AACzC,SAAO,KAAK,OAAOA,KAAI,EAAE,OAAOA,KAAI;AACtC;AAUA,UAAU,UAAU,SAAS,SAASA,OAAK;AACzC,MAAI,QAAQ,KAAK;AACjB,MAAI,SAAS,KAAK;AAClB,OAAK,QAAQ,KAAKA,KAAI;AAEtB,QAAM,iBAAiBA,OAAM,WAAU;AACrC,WAAO,KAAK,MAAM,EAAEA,KAAI;AAAA,EAC5B,CAAG;AAED,SAAO;AACT;AAUA,UAAU,UAAU,SAAS,SAASA,OAAK;AACzC,MAAI,QAAQ,KAAK;AACjB,MAAI,SAAS,KAAK;AAClB,OAAK,QAAQ,KAAKA,KAAI;AAEtB,QAAM,iBAAiBA,OAAM,SAAS,KAAI;AACxC,WAAO,KAAK,MAAM,EAAEA,KAAI,IAAI;AAAA,EAChC,CAAG;AAED,SAAO;AACT;AAUA,UAAU,UAAU,SAAS,SAAUA,OAAM;AAC3C,MAAI,QAAQ,KAAK;AACjB,MAAI,SAAS,KAAK;AAClB,OAAK,QAAQ,KAAKA,KAAI;AAEtB,QAAMA,KAAI,IAAI,SAAS,KAAI;AACzB,QAAI,eAAe,OAAO,KAAK;AAC7B,WAAK,MAAM,EAAEA,KAAI,IAAI;AACrB,aAAO;AAAA,IACb,OAAW;AACL,aAAO,KAAK,MAAM,EAAEA,KAAI;AAAA,IAC9B;AAAA,EACA;AAEE,SAAO;AACT;;;ACxHA;AACA,IAAIuB,SAAOD;AACX,IAAI,SAASb;AACb,IAAI,WAAWC;AACf,IAAIgB,YAAUV;AAEd,IAAIY,kBAAgBC,gBAAA,UAAiB,SAAU7B,OAAM,MAAM,SAAS;AAClE,SAAO,UAAU,KAAK,MAAM,OAAO;AACnC,OAAK,UAAU,IAAI0B,UAAQ1B,OAAM,IAAI;AACrC,OAAK,OAAOA;AACZ,OAAK,KAAK,KAAK,QAAQ;AACvB,OAAK,QAAQ,GAAG,UAAU,eAAe,IAAI,CAAC;AAChD;AACAuB,OAAK,SAASK,iBAAe,OAAO,SAAS;AAE7C,SAAS,eAAgBE,gBAAe;AACtC,SAAO,SAAU9B,OAAM,YAAY+B,UAAS;AAC1C,IAAAD,eAAc,KAAK,UAAU9B,OAAM,YAAY8B,cAAa;AAAA,EAChE;AACA;AAEAF,gBAAc,UAAU,aAAa,SAAU,MAAM,UAAU,IAAI;AACjE,OAAK,QAAQ,aAAa,KAAK,SAAS,KAAK,SAAS,CAAC;AACvD,OAAK,KAAK,IAAI;AACd,KAAE;AACJ;AAEAA,gBAAc,UAAU,SAAS,SAAU,IAAI;AAC7C,OAAK,QAAQ,OAAM;AACnB,KAAE;AACJ;AAEA,SAASA,gBAAc,WAAW,SAAS,EACxC,OAAO,WAAW,EAClB,OAAO,SAAS,EAChB,OAAO,QAAQ;;;;ACnClB;AACA,IAAIL,SAAOD;AACX,IAAI,cAAcb;AAClB,IAAIiB,YAAUhB;AACd,IAAIkB,kBAAgBZ;AAEpB,IAAIgB,iBAAeC,eAAA,UAAiB,SAAUjC,OAAM;AAClD,cAAY,KAAK,MAAMA,KAAI;AAC3B,OAAK,cAAc;AACnB,OAAK,WAAW,CAAA;AAChB,OAAK,aAAa,CAAA;AAClB,OAAK,SAAS,CAAA;AACd,OAAK,cAAc;AACnB,OAAK,WAAW;AAChB,OAAK,eAAe,aAAa,IAAI;AACvC;AACAuB,OAAK,SAASS,gBAAc,WAAW;AAEvC,SAAS,aAAcE,eAAc;AACnC,SAAO,SAAUlC,OAAM,WAAW+B,UAAS;AACzC,IAAAG,cAAa,WAAWH,SAAQ,EAAE,IAAI;AACtC,QAAIG,cAAa,UAAU;AACzB;AAAA,IACN;AACI,IAAAA,cAAa,KAAK,UAAUlC,SAAQkC,cAAa,MAAMA,cAAa,UAAS,GAAIA,aAAY;AAAA,EACjG;AACA;AAEAF,eAAa,UAAU,aAAa,WAAY;AAC9C,MAAI,QAAQ,CAAA;AACZ,MAAI,OAAO;AACX,SAAO,MAAM;AACX,UAAM,QAAQ,KAAK,IAAI;AACvB,WAAO,KAAK;AAAA,EAChB;AACE,SAAO,MAAM,KAAK,GAAG;AACvB;AAEAA,eAAa,UAAU,UAAU,SAAU,MAAM,QAAQ;AACvD,MAAI,KAAK,SAAS;AAChB,QAAI,SAAS;AACb,WAAO,QAAQ;AACb,UAAI,SAAS,QAAQ;AACnB,cAAM,IAAI;AAAA,UACR,oCACA,KAAK,OAAO,uCACZ,KAAK,WAAW,IAAI;AAAA,QAAC;AAAA,MAC/B;AACM,eAAS,OAAO;AAAA,IACtB;AACI,SAAK,cAAc;AAAA,EACvB;AACE,OAAK,OAAO,KAAK,EAAE,IAAI,UAAU;AACjC,OAAK,eAAe,KAAK,OAAO,KAAK,EAAE;AACvC,OAAK,SAAS,KAAK,IAAI;AACvB,OAAK,WAAW,KAAK,EAAE,IAAI,KAAK,UAAS;AACzC,OAAK,GAAG,UAAU,KAAK,YAAY;AACnC,MAAI,CAAC,KAAK,UAAU;AAClB,SAAK,KAAK,UAAU,KAAK,MAAM,KAAK,WAAW,KAAK,EAAE,GAAG,IAAI;AAAA,EACjE;AACE,SAAO;AACT;AAEAA,eAAa,UAAU,YAAY,WAAY;AAC7C,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO;AAAA,EACX;AACE,MAAI,eAAe,IAAI,KAAK;AAC5B,MAAI,YAAY;AAChB,WAAS,KAAK,GAAG,KAAK,KAAK,SAAS,QAAQ,MAAM;AAChD,QAAIG,aAAY,KAAK,SAAS,EAAE,EAAE;AAClC,iBACE,eAAe,KAAK,OAAOA,UAAS,IAAI,KAAK,WAAWA,UAAS;AAAA,EACvE;AACE,SAAO;AACT;AAEAH,eAAa,UAAU,WAAW,SAAUhC,OAAM,QAAQ;AACxD,SAAO,KAAK,QAAQ,IAAIgC,eAAahC,KAAI,GAAG,MAAM;AACpD;AAEAgC,eAAa,UAAU,UAAU,SAAUhC,OAAM,MAAM,QAAQ;AAC7D,SAAO,KAAK,QAAQ,IAAI0B,UAAQ1B,OAAM,IAAI,GAAG,MAAM;AACrD;AAEAgC,eAAa,UAAU,YAAY,SAAUhC,OAAM,MAAM,QAAQ;AAC/D,SAAO,KAAK,QAAQ,IAAI4B,gBAAc5B,OAAM,IAAI,GAAG,MAAM;AAC3D;AAEAgC,eAAa,UAAU,SAAS,WAAY;AAC1C,OAAK,WAAW;AAChB,MAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,SAAK,QAAQ,IAAIN,UAAO,GAAI,GAAG,IAAI;AAAA,EACvC;AACE,WAAS,KAAK,GAAG,KAAK,KAAK,SAAS,QAAQ,MAAM;AAChD,QAAIK,WAAU,KAAK,SAAS,EAAE;AAC9B,IAAAA,SAAQ,OAAM;AACd,IAAAA,SAAQ,eAAe,UAAU,KAAK,YAAY;AAAA,EACtD;AACE,OAAK,KAAK,UAAU,KAAK,MAAM,GAAG,IAAI;AACxC;AAEA,IAAI,SAAS;AACbC,eAAa,UAAU,QAAQ,SAAU,OAAO;AAC9C,UAAQ,SAAS;AACjB,MAAI,SAAS,QAAQ,OAAO,OAAO,GAAG,KAAK,IAAI;AAC/C,MAAI,SAAS,UAAU,KAAK,QAAQ,SAAS,OAAO,KAAK,cAAc;AACvE,OAAK,SAAS,QAAQ,SAAUD,UAAS;AACvC,QAAIA,oBAAmBC,gBAAc;AACnC,gBAAUD,SAAQ,MAAM,QAAQ,CAAC;AAAA,IACvC,OAAW;AACL,gBAAU,SAAS,MAAMA,SAAQ,OAAO,OAAOA,SAAQ,cAAc;AAAA,IAC3E;AAAA,EACA,CAAG;AACD,SAAO;AACT;;;ACnHA;AACA,IAAA,eAAA,IAAA,eAAuBT;AACvB,IAAA,UAAA,IAAA,UAAkBb;AAClB,IAAA,gBAAA,IAAA,gBAAwBC;;;ACHxB;AAIA,IAAI,SAAS;AAEb,IAAA,KAAA,sBAAA,KAAa,SAAS0B,IAAI,KAAK;AAC7B,SAAO,UAAU,OAAO,MAAM;AAChC;AAEA,IAAA,OAAA,sBAAA,OAAe,SAASC,MAAM,KAAK;AACjC,SAAO,UAAU,OAAO,MAAM;AAChC;AAEA,IAAA,UAAA,sBAAA,UAAkB,SAASC,SAAS,KAAK;AACvC,SAAO,UAAU,OAAO,MAAM;AAChC;AAEA,IAAA,OAAA,sBAAA,OAAe,SAASC,MAAM,KAAK;AACjC,SAAO,UAAU,OAAO,MAAM;AAChC;AAEA,IAAA,WAAA,sBAAA,WAAmB,SAASC,UAAU,KAAK;AACzC,SAAO,UAAU,OAAO,MAAM;AAChC;AAEA,IAAA,eAAA,sBAAA,eAAuB,SAASC,cAAc,KAAK;AACjD,SAAO,UAAU,OAAO,MAAM;AAChC;AAEA,IAAA,qBAAA,sBAAA,qBAA6B,SAASC,oBAAoB,KAAK;AAC7D,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM,qDAAqD;AACtF,SAAO,SAAS,MAAM;AACxB;AAEA,IAAA,YAAA,sBAAA,YAAoB,SAASC,aAAa;AACxC,SAAO,SAAS;AAClB;AAEA,IAAA,YAAA,sBAAA,YAAoB,SAASC,aAAa;AACxC,SAAO,SAAS;AAClB;AAEA,IAAA,OAAA,sBAAA,OAAe,SAAU,GAAG,GAAG;AAC7B,SAAO,SAAS,IAAI,MAAM,IAAI;AAChC;AAEA,IAAA,UAAA,sBAAA,UAAkB,WAAY;AAC5B,SAAO;AACT;AAEA,IAAA,OAAA,sBAAA,OAAe,WAAY;AACzB,SAAO;AACT;AAEA,IAAA,aAAA,sBAAA,aAAqB,SAASC,cAAc;AAC1C,SAAO,SAAS;AAClB;AAEA,IAAA,aAAA,sBAAA,aAAqB,SAASC,cAAc;AAC1C,SAAO,SAAS;AAClB;AAEA,IAAI,SAAS;AAAA,EACX,OAAO;AAAA;AAAA,EAEP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA;AAAA,EAET,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EAEV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EAEb,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AACjB;AAEA,IAAAC,UAAA,sBAAA,QAAgB,SAAS,MAAO,WAAW;AACzC,MAAI,UAAU,WAAW,KAAK,CAAC,MAAM,QAAQ,SAAS,GAAG;AACvD,gBAAY,MAAM,UAAU,MAAM,KAAK,SAAS;AAAA,EACpD;AACE,SAAO,SAAS,UAAU,IAAI,eAAe,EAAE,KAAK,GAAG,IAAI;AAC7D;AAEA,SAAS,gBAAiBA,QAAO;AAC/B,MAAI,OAAOA,MAAK,KAAK,KAAM,QAAO,OAAOA,MAAK;AAC9C,QAAM,IAAI,MAAM,kCAAkCA,MAAK;AACzD;;;;AC5HA;IAEAC,cAAiB,CAAC,EAAC,YAAY,MAAK,IAAI,CAAA,MAAO;AAC9C,QAAM,UAAU;AAAA,IACf;AAAA,IACA;AAAA,EACF,EAAG,KAAK,GAAG;AAEV,SAAO,IAAI,OAAO,SAAS,YAAY,SAAY,GAAG;AACvD;;ACTA;AACA,MAAM,YAAY1B;AAElB,IAAA2B,cAAiB,YAAU,OAAO,WAAW,WAAW,OAAO,QAAQ,UAAS,GAAI,EAAE,IAAI;;;;ACF1F;AAEA,MAAMC,yBAAuB,eAAa;AACzC,MAAI,OAAO,MAAM,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AAIC,MACC,aAAa,SACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAEb,SAAU,aAAa,aAAa,SAAU,cAAc;AAAA,EAE5D,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa;AAAA,EAEpC,SAAU,aAAa,aAAa,SACpC,SAAU,aAAa,aAAa;AAAA,EAEpC,UAAW,aAAa,aAAa;AAAA,EAErC,UAAW,aAAa,aAAa;AAAA,EAErC,UAAW,aAAa,aAAa,SAEtC;AACD,WAAO;AAAA,EACT;AAEC,SAAO;AACR;AAEAC,uBAAA,UAAiBD;AACjB,IAAAE,aAAAD,uBAAA,QAAA,UAAyBD;;;ACjDzB;AAEA,IAAAG,eAAiB,WAAY;AAE3B,SAAO;AACT;;;ACLA;AACA,MAAMJ,cAAY3B;AAClB,MAAM,uBAAuBb;AAC7B,MAAM,aAAaC;AAEnB,MAAM4C,gBAAc,YAAU;AAC7B,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG;AACtD,WAAO;AAAA,EACT;AAEC,WAASL,YAAU,MAAM;AAEzB,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEC,WAAS,OAAO,QAAQ,WAAU,GAAI,IAAI;AAE1C,MAAI,QAAQ;AAEZ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,UAAM,OAAO,OAAO,YAAY,CAAC;AAGjC,QAAI,QAAQ,MAAS,QAAQ,OAAQ,QAAQ,KAAO;AACnD;AAAA,IACH;AAGE,QAAI,QAAQ,OAAS,QAAQ,KAAO;AACnC;AAAA,IACH;AAGE,QAAI,OAAO,OAAQ;AAClB;AAAA,IACH;AAEE,aAAS,qBAAqB,IAAI,IAAI,IAAI;AAAA,EAC5C;AAEC,SAAO;AACR;AAEAM,cAAA,UAAiBD;AAEjB,IAAA,WAAAC,cAAA,QAAA,UAAyBD;;;AC9CzB;AACA,IAAIA,gBAAchC;AAElB,IAAA,SAAAkC,QAAA,SAAiB;AACjB,IAAA,OAAAA,QAAA,OAAe;AACf,IAAA,QAAAA,QAAA,QAAgB;AAIhB,SAAS,cAAe,OAAO;AAC7B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,IAAI;AACR,KAAG;AACD,QAAI,IAAI,GAAG;AACT,gBAAU;AAAA,IAChB;AACI,QAAI,KAAK,MAAM,IAAI,CAAC;AACpB,cAAU;AAAA,EACd,SAAW;AAET,SAAO;AACT;AAEA,SAAS,UAAW,KAAK,OAAO;AAC9B,MAAI,UAAU,IAAI,UAAS;AAC3B,MAAI,QAAQ,WAAW,KAAK,IAAI,UAAU,MAAO,QAAO;AACxD,MAAI,UAAU;AACd,MAAI,WAAWF,cAAY,OAAO;AAElC,MAAI,WAAW,OAAO;AACpB,cAAU,cAAc,QAAQ,QAAQ;AAAA,EAC5C;AAEE,SAAO,UAAU;AACnB;AAEA,SAAS,WAAY,KAAK,OAAO;AAC/B,MAAI,UAAU,IAAI,SAAQ;AAC1B,MAAI,QAAQ,WAAW,KAAK,IAAI,UAAU,MAAO,QAAO;AACxD,MAAI,UAAU;AACd,MAAI,WAAWA,cAAY,OAAO;AAElC,MAAI,WAAW,OAAO;AACpB,cAAU,cAAc,QAAQ,QAAQ;AAAA,EAC5C;AAEE,SAAO,UAAU;AACnB;AAEA,SAAS,YAAa,KAAK,OAAO;AAChC,MAAI,UAAU,IAAI,KAAI;AACtB,MAAI,QAAQ,WAAW,KAAK,IAAI,UAAU,MAAO,QAAO;AACxD,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,WAAWA,cAAY,OAAO;AAElC,MAAI,WAAW,OAAO;AACpB,QAAI,YAAY,UAAU,QAAQ,YAAY,GAAG,EAAE;AACnD,cAAU,cAAc,SAAS;AACjC,eAAW,cAAc,SAAS,WAAW,UAAU;AAAA,EAC3D;AAEE,SAAO,UAAU,UAAU;AAC7B;AChEA;AACA,IAAA,SAAiBjC;AAEjB,SAAS,YAAa,QAAQ;AAC5B,SAAO,UAAU,QAAQ,OAAO,WAAW,YAAY,OAAO,eAAe,QAAQ;AACvF;AAEA,MAAM,QAAQ;AAAA,EACZ,KAAK,EAAC,OAAO,OAAO,OAAO,MAAM,KAAI;AAAA,EACrC,GAAG,EAAC,OAAO,SAAS,OAAO,OAAK,MAAM,QAAQ,CAAC,KAAK,YAAY,CAAC,EAAC;AAAA,EAClE,GAAG,EAAC,OAAO,UAAU,OAAO,OAAK,OAAO,MAAM,SAAQ;AAAA,EACtD,GAAG,EAAC,OAAO,UAAU,OAAO,OAAK,OAAO,MAAM,SAAQ;AAAA,EACtD,GAAG,EAAC,OAAO,YAAY,OAAO,OAAK,OAAO,MAAM,WAAU;AAAA,EAC1D,GAAG,EAAC,OAAO,UAAU,OAAO,OAAK,OAAO,MAAM,YAAY,KAAK,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAC;AAAA,EAC7G,GAAG,EAAC,OAAO,WAAW,OAAO,OAAK,OAAO,MAAM,UAAS;AAAA,EACxD,GAAG,EAAC,OAAO,SAAS,OAAO,OAAK,aAAa,MAAK;AAAA,EAClD,GAAG,EAAC,OAAO,QAAQ,OAAO,OAAK,KAAK,KAAI;AAC1C;AAEA,SAAS,UAAW,QAAQ,OAAO;AACjC,QAAM,QAAQ,MAAM,OAAO,MAAM,IAAI,MAAM,OAAO,MAAM,KAAK,CAAA;AAC7D,MAAI,MAAM,QAAQ,MAAM,MAAM,GAAI,OAAM,KAAK,MAAM;AACrD;AAEA,SAASA,WAAU,YAAY,MAAM;AACnC,MAAI,UAAU,WAAW,EAAG,OAAM,kBAAkB,CAAC,IAAI,GAAG,UAAU,MAAM;AAC5E,MAAI,CAAC,WAAY,OAAM,mBAAmB,GAAG,YAAY;AACzD,MAAI,CAAC,KAAM,OAAM,mBAAmB,GAAG,MAAM;AAC7C,MAAI,CAAC,MAAM,EAAE,MAAM,UAAU,EAAG,OAAM,YAAY,GAAG,CAAC,QAAQ,GAAG,UAAU;AAC3E,MAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAG,OAAM,YAAY,GAAG,CAAC,OAAO,GAAG,IAAI;AAC9D,QAAM,UAAU,WAAW,MAAM,GAAG;AACpC,QAAM,QAAQ,CAAA;AAEd,UAAQ,QAAQ,YAAU;AACxB,aAAS,KAAK,GAAG,KAAK,OAAO,QAAQ,EAAE,IAAI;AACzC,YAAM,OAAO,OAAO,EAAE;AACtB,UAAI,CAAC,MAAM,IAAI,EAAG,OAAM,YAAY,IAAI,IAAI;AAAA,IAClD;AACI,QAAI,OAAO,KAAK,MAAM,EAAG,OAAM,iBAAiB,MAAM;AACtD,cAAU,QAAQ,KAAK;AACvB,QAAI,IAAI,KAAK,MAAM,GAAG;AACpB,gBAAU,OAAO,QAAQ,QAAQ,GAAG,GAAG,KAAK;AAC5C,gBAAU,OAAO,QAAQ,KAAK,GAAG,GAAG,KAAK;AACzC,UAAI,OAAO,WAAW,EAAG,WAAU,IAAI,KAAK;AAAA,IAClD;AAAA,EACA,CAAG;AACD,MAAI,WAAW,MAAM,KAAK,MAAM;AAChC,MAAI,CAAC,UAAU;AACb,UAAM,kBAAkB,OAAO,KAAK,KAAK,GAAG,KAAK,MAAM;AAAA,EAC3D;AACE,WAAS,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE,IAAI;AACvC,QAAI,cAAc,SAAS,OAAO,YAAU;AAC1C,YAAM,OAAO,OAAO,EAAE;AACtB,YAAM,YAAY,MAAM,IAAI,EAAE;AAC9B,aAAO,UAAU,KAAK,EAAE,CAAC;AAAA,IAC/B,CAAK;AACD,QAAI,CAAC,YAAY,QAAQ;AACvB,YAAM,SAAS,SAAS,IAAI,OAAK,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,OAAK,KAAK,IAAI;AAC1E,YAAM,YAAY,IAAI,QAAQ,KAAK,EAAE,CAAC;AAAA,IAC5C;AACI,eAAW;AAAA,EACf;AACA;AAEA,SAAS,mBAAoB,KAAK;AAChC,SAAO,aAAa,eAAe,iCAAiC,MAAM,EAAE;AAC9E;AAEA,SAAS,YAAa,KAAK,MAAM;AAC/B,SAAO,aAAa,gBAAgB,kBAAkB,OAAO,oBAAoB,MAAM,EAAE;AAC3F;AAEA,SAAS,YAAa,KAAK,eAAe,OAAO;AAC/C,MAAI;AACJ,SAAO,KAAK,KAAK,EAAE,QAAQ,cAAY;AACrC,QAAI,MAAM,QAAQ,EAAE,MAAM,KAAK,EAAG,aAAY,MAAM,QAAQ,EAAE;AAAA,EAClE,CAAG;AACD,SAAO,aAAa,gBAAgB,gBAAgB,MAAM,KAAK,gBAC7D,YAAY,aAAa,IAAI,cAAc,SAAS;AACxD;AAEA,SAAS,YAAa,MAAM;AAC1B,SAAO,KAAK,KAAK,IAAI,EAAE,QAAQ,cAAc,QAAQ;AACvD;AAEA,SAAS,kBAAmB,UAAU,KAAK;AACzC,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,OAAO,SAAS,MAAM,QAAM,GAAG,WAAW,CAAC,IAC7C,aACA;AACJ,SAAO,aAAa,kBAAkB,cAAc,UAAU,MAAM,OAAO,cAAc,GAAG;AAC9F;AAEA,SAAS,iBAAkB,QAAQ;AACjC,SAAO;AAAA,IAAa;AAAA,IAClB,oFAAoF,SAAS;AAAA,EAAG;AACpG;AAEA,SAAS,aAAc,MAAM,KAAK;AAChC,QAAM,MAAM,IAAI,UAAU,GAAG;AAC7B,MAAI,OAAO;AAEX,MAAI,MAAM,kBAAmB,OAAM,kBAAkB,KAAKA,UAAQ;AAClE,SAAO;AACT;;ACxGA;AACA,IAAIiC,gBAAchC;AAClB,IAAI,YAAYb;AAEhB,IAAA,iBAAiBgD;AAEjB,SAASA,eAAc,KAAK,QAAQ;AAClC,MAAIH,cAAY,GAAG,MAAM,EAAG,QAAO;AACnC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAIA,cAAY,GAAG,KAAK,OAAQ,QAAO;AAKvC,MAAI,SAAS,UAAU,GAAG;AAC1B,MAAI,WAAW,IAAI,SAAS,OAAO;AACnC,MAAI,YAAY,IAAI,MAAM,GAAG,SAAS,QAAQ;AAI9C,SAAOA,cAAY,SAAS,IAAI,QAAQ;AACtC,gBAAY,UAAU,MAAM,GAAG,EAAE;AAAA,EACrC;AACE,SAAO;AACT;;;;ACxBA;AACA,IAAI,OAAOhC;AAEX,IAAI,OAAO,SAAA3B,QAAA,OAAe,SAAS+D,MAAM,KAAK;AAC5C,MAAI,MAAM,IAAI,MAAM,GAAG;AACvB,QAAM,kBAAkB,KAAKA,KAAI;AACjC,MAAI,OAAO;AACX,SAAO;AACT;AAEA,IAAA,uBAAA/D,QAAA,uBAA+B,SAASgE,sBAAsB,MAAM,QAAQ;AAC1E,MAAI,MAAM,IAAI,KAAK,KAAK,OAAO,+BAA+B,KAAK,IAAI,CAAC;AACxE,QAAM,kBAAkB,KAAKA,qBAAoB;AACjD,MAAI,WAAW;AACf,MAAI,SAAS;AACb,SAAO;AACT;AAEA,IAAA,WAAAhE,QAAA,WAAmB,SAASiE,UAAU,KAAK;AACzC,MAAI,MAAM,IAAI,MAAM,GAAG;AACvB,QAAM,kBAAkB,KAAKA,SAAQ;AACrC,MAAI,OAAO;AACX,SAAO;AACT;ACvBA;AACA,IAAIN,gBAAchC;AAElB,IAAA,eAAiBuC;AAEjB,SAAS,UAAW,KAAK;AACvB,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,SAAO,IAAI,MAAM,EAAE,MAAM;AAC3B;AAEA,SAAS,QAAS,KAAK;AACrB,SAAO,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI;AACpC;AAEA,SAASA,eAAc,QAAQ,cAAc;AAC3C,OAAK,sBAAsB;AAC3B,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,YAAY;AACjB,OAAK,YAAY;AACjB,OAAK,UAAU;AACf,OAAK,QAAQ;AACb,OAAK,UAAU;AACf,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,OAAO;AACZ,MAAI,OAAO,WAAW,UAAU;AAC9B,SAAK,QAAQ;AAAA,EACjB,OAAS;AACL,aAAS,QAAQ,OAAQ,MAAK,IAAI,IAAI,OAAO,IAAI;AAAA,EACrD;AAEE,MAAI,UAAU,KAAK,MAAM,GAAG;AAC1B,SAAK,SAAS,KAAK,MAAM,KAAK,sBAAsB,QAAQ,KAAK,MAAM,CAAC;AAAA,EAC5E;AACE,MAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,SAAK,YAAY,KAAK,MAAM,KAAK,sBAAsB,QAAQ,KAAK,SAAS,CAAC;AAAA,EAClF;AACE,MAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,SAAK,YAAY,KAAK,MAAM,KAAK,sBAAsB,QAAQ,KAAK,SAAS,CAAC;AAAA,EAClF;AACE,SAAO;AACT;AAEAA,eAAa,YAAY,CAAA;AAEzBA,eAAa,UAAU,gBAAgB,WAAY;AACjD,MAAI,SAAS,KAAK;AAClB,MAAI,UAAU,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,aAAa,QAAQ,KAAK,aAAa,MAAM;AACxG,aAASP,cAAY,KAAK,KAAK;AAAA,EACnC;AACE,SAAO;AACT;AAEAO,eAAa,UAAU,YAAY,WAAY;AAC7C,MAAI,SAAS,KAAK,cAAa;AAC/B,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,SAAS,KAAK,UAAU,KAAK;AACtC;AAEAA,eAAa,UAAU,eAAe,WAAY;AAChD,MAAI,KAAK,aAAa,KAAM,QAAO;AACnC,SAAO,KAAK,YAAY,KAAK,UAAU,KAAK;AAC9C;AAEAA,eAAa,UAAU,eAAe,WAAY;AAChD,MAAI,KAAK,aAAa,KAAM,QAAO;AACnC,SAAO,KAAK,YAAY,KAAK,UAAU,KAAK;AAC9C;;;ACvEA;AACA,IAAI,QAAQvC;AACZ,IAAID,aAAWZ;AACf,IAAIgD,iBAAe/C;AACnB,IAAI,QAAQM;AACZ,IAAI,eAAeJ;AAEnB,SAAS,sBAAuB,QAAQ;AACtC,SAAO,SAAU,MAAM;AACrB,WAAO,YAAY,MAAM,MAAM;AAAA,EACnC;AACA;AAEA,IAAIkD,mBAAiBC,iBAAA,UAAiB,SAAU,OAAO,UAAU,QAAQ;AACvE,MAAI,QAAQ,aAAa,OAAO,UAAU,MAAM;AAChD,MAAI,WAAW,MAAM,IAAI,sBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE;AAC/D,SAAO,MAAM,KAAKN,eAAa,UAAU,KAAK,GAAG,KAAK;AACxD;AAEA,SAAS,QAAS,MAAM;AACtB,MAAI,iBAAiB,KAAK,KAAK,CAAC,EAAE,YAAW,IAAK,KAAK,KAAK,MAAM,CAAC;AACnE,SAAO,QAAQ;AACjB;AAEA,SAAS,SAAU,MAAM;AACvB,MAAI,iBAAiB,KAAK,KAAK,CAAC,EAAE,YAAW,IAAK,KAAK,KAAK,MAAM,CAAC;AACnE,SAAO,SAAS;AAClB;AAEA,SAAS,aAAc,MAAM,QAAQ;AACnC,MAAI,CAAC,KAAK,KAAM;AAChB,SAAO,OAAO,QAAQ,IAAI,CAAC,KAAK,OAAO,SAAS,IAAI,CAAC;AACvD;AAEA,SAAS,mBAAoB,UAAU,cAAc;AACnD,MAAI,OAAO,OAAO,OAAO,CAAA,GAAI,QAAQ;AACrC,MAAI,SAAS,OAAO,OAAO,YAAY;AACvC,MAAI,WAAW,CAAA;AACf,MAAI,MAAM,QAAQ,IAAI;AACtB,MAAI,OAAO,SAAS,IAAI;AACxB,MAAI,OAAO,GAAG,GAAG;AACf,aAAS,KAAK,EAAC,OAAO,OAAO,GAAG,EAAC,CAAC;AAClC,WAAO,GAAG,IAAI;AAAA,EAClB;AACE,OAAK,YAAY;AACjB,OAAK,SAAS;AACd,OAAK,YAAY;AACjB,WAAS,KAAK,IAAI;AAClB,SAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI;AACpC,MAAI,OAAO,IAAI,GAAG;AAChB,aAAS,KAAK,EAAC,OAAO,OAAO,IAAI,EAAC,CAAC;AACnC,WAAO,IAAI,IAAI;AAAA,EACnB;AACE,SAAO,SAAU,IAAI,IAAI,QAAQ;AAC/B,WAAOK,iBAAe,QAAQ,UAAU,MAAM;AAAA,EAClD;AACA;AAEA,SAAS,aAAc,OAAO,UAAU,QAAQ;AAC9C,WAAS,kBAAmB,MAAME,QAAO,KAAK;AAC5C,QAAI,SAAS,IAAI,aAAa,MAAM,KAAK;AACzC,QAAI,OAAO,OAAO;AAClB,QAAI,OAAO,SAAS,MAAM;AACxB,UAAI,EAAE,QAAQ,SAAS;AACrB,YAAI,OAAO,WAAW,MAAM;AAC1B,gBAAM,IAAI,MAAM,qBAAqB,QAAQ,MAAM;AAAA,QAC7D,OAAe;AACL,iBAAO,QAAQ,OAAO;AAAA,QAChC;AAAA,MACA,OAAa;AACL,eAAO,QAAQ,OAAO,IAAI;AAAA,MAClC;AAAA,IACA;AACI,QAAI,OAAO,SAAS,QAAQ,OAAO,UAAU,GAAI,QAAO;AACxD,WAAO,QAAQA;AACf,WAAO,QAAQA,WAAU;AACzB,WAAO,OAAOA,WAAU,IAAI,SAAS;AACrC,QAAI,aAAa,QAAQ,MAAM,EAAG,QAAO,QAAQ,mBAAmB,QAAQ,MAAM;AAClF,WAAO;AAAA,EACX;AAEE,MAAI,SAAS,SAAS,IAAI,iBAAiB,EAAE,OAAO,SAAU,MAAM;AAAE,WAAO,QAAQ;AAAA,EAAI,CAAE;AAE3F,MAAI,iBAAiB;AACrB,MAAI,gBAAgB,OAAO;AAE3B,WAAS,aAAc,QAAQ;AAC7B,QAAI,SAAS,eAAgB,UAAS;AACtC,sBAAkB;AAAA,EACtB;AAEE,WAAS,aAAc,MAAM,QAAQ;AACnC,QAAI,KAAK,SAAU,OAAM,IAAI,MAAM,SAAS,yDAAyD;AACrG,QAAI,WAAW,SAAU,OAAM,IAAI,MAAM,SAAS,4CAA4C;AAC9F,QAAI,UAAU,KAAM,MAAK,SAAS;AAClC,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,MAAE;AACF,SAAK,WAAW;AAChB,QAAI,KAAK,UAAU,KAAM,MAAK,SAAS,KAAK,cAAa;AACzD,QAAI,KAAK,UAAU,KAAM,OAAM,IAAI,MAAM,SAAS,4CAA4C;AAC9F,iBAAa,KAAK,UAAS,CAAE;AAAA,EACjC;AAEE,SAAO,QAAQ,SAAU,MAAM;AAC7B,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,eAAe,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAE;AAC3D,QAAI,CAAC,KAAK,SAAS,eAAe,KAAK,QAAS,MAAK,UAAU,KAAK,UAAU;AAC9E,QAAI,CAAC,KAAK,KAAM,MAAK,WAAW,KAAK;AAAA,EACzC,CAAG;AAGD,SAAO,QAAQ,SAAU,MAAM;AAC7B,QAAI,KAAK,cAAa,KAAM,KAAM;AAClC,iBAAa,IAAI;AAAA,EACrB,CAAG;AAED,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,KAAG;AACD,eAAW;AACX,eAAW,KAAK,MAAM,iBAAiB,aAAa;AACpD,WAAO,QAAQ,SAAU,MAAM;AAC7B,UAAI,KAAK,SAAU;AACnB,UAAI,CAAC,KAAK,UAAW;AACrB,UAAI,KAAK,aAAY,IAAK,UAAU;AAClC,qBAAa,MAAM,KAAK,SAAS;AACjC,mBAAW;AAAA,MACnB;AAAA,IACA,CAAK;AAAA,EACL,SAAW,YAAY,YAAY,OAAO;AACxC,MAAI,SAAU,OAAM,IAAI,MAAM,SAAS,iEAAiE;AAExG,YAAU;AACV,KAAG;AACD,eAAW;AACX,eAAW,KAAK,MAAM,iBAAiB,aAAa;AACpD,WAAO,QAAQ,SAAU,MAAM;AAC7B,UAAI,KAAK,SAAU;AACnB,UAAI,CAAC,KAAK,UAAW;AACrB,UAAI,KAAK,aAAY,KAAM,UAAU;AACnC,qBAAa,MAAM,KAAK,SAAS;AACjC,mBAAW;AAAA,MACnB;AAAA,IACA,CAAK;AAAA,EACL,SAAW,YAAY,YAAY,OAAO;AACxC,MAAI,SAAU,OAAM,IAAI,MAAM,SAAS,iEAAiE;AAExG,aAAW,KAAK,MAAM,iBAAiB,aAAa;AACpD,SAAO,QAAQ,SAAU,MAAM;AAC7B,QAAI,KAAK,SAAU;AACnB,iBAAa,MAAM,QAAQ;AAAA,EAC/B,CAAG;AAED,SAAO;AACT;AAEA,SAAS,eAAgB,MAAM,QAAQ,QAAQ;AAC7C3C,aAAS,OAAO,SAAS;AACzB,MAAI,KAAK,MAAM;AACb,WAAO,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,OAAO,KAAK,CAAA,GAAI,MAAM;AAAA,EACvE,OAAS;AACL,WAAO,KAAK,MAAM,QAAQ,CAAA,GAAI,MAAM;AAAA,EACxC;AACA;AAEA,SAAS,YAAa,MAAM,QAAQ;AAClC,MAAI,SAAS,KAAK,cAAa;AAC/B,MAAI,QAAQ,OAAO,KAAK,UAAU,aAAa,eAAe,MAAM,QAAQ,MAAM,IAAI,KAAK;AAC3F,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,MAAI,YAAY,MAAM,KAAK,KAAK,KAAK,MAAM;AAC3C,MAAI,cAAc,KAAK,UAAU,MAAM,KAAK,IAAI,KAAK,OAAO,IAAI;AAChE,MAAI,eAAe,KAAK,WAAW,MAAM,MAAM,IAAI,KAAK,QAAQ,IAAI;AACpE,MAAI,YAAYoC,eAAa,OAAO,KAAK,GAAG,MAAM;AAClD,MAAI,UAAU,UAAU,WAAW,MAAM;AACzC,SAAO,cAAc,UAAU;AACjC;;;;ACjLA;AACA,IAAI,iBAAiBnC;AACrB,IAAIwC,mBAAiBrD;AACrB,IAAIY,aAAWX;AAEf,IAAIuD,aAAWC,WAAA,UAAiB,SAAU,OAAO,UAAU,OAAO;AAChE,MAAI,CAAC,MAAO,SAAQ;AACpB7C,aAAS,OAAO,CAAC,OAAO,UAAU,KAAK,CAAC;AACxC,OAAK,UAAU;AACf,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,WAAW;AAClB;AACA4C,WAAS,YAAY,CAAA;AAErBA,WAAS,UAAU,WAAW,SAAU,OAAO;AAC7C5C,aAAS,KAAK,CAAC,KAAK,CAAC;AACrB,OAAK,QAAQ;AACf;AAEA4C,WAAS,UAAU,cAAc,SAAU,UAAU;AACnD5C,aAAS,KAAK,CAAC,QAAQ,CAAC;AACxB,OAAK,WAAW;AAClB;AAEA4C,WAAS,UAAU,WAAW,SAAU,OAAO;AAC7C5C,aAAS,KAAK,CAAC,KAAK,CAAC;AACrB,OAAK,QAAQ;AACf;AAEA4C,WAAS,UAAU,OAAO,WAAY;AACpC,SAAO,eAAe,YAAY,eAAe,UAAS;AAC5D;AAEAA,WAAS,UAAU,aAAa,eAAe;AAE/CA,WAAS,UAAU,aAAa,eAAe;AAE/CA,WAAS,UAAU,OAAO,SAAU,QAAQ;AAC1C,MAAI,SAAS,OAAO,OAAO,KAAK,KAAK;AACrC,WAAS,OAAO,QAAQ;AACtB,WAAO,GAAG,IAAI,OAAO,GAAG;AAAA,EAC5B;AAEE,SAAOH,iBAAe,KAAK,OAAO,KAAK,UAAU,MAAM,EAAE,KAAI,IACtD,eAAe,MAAM,OAAO,IAC5B,eAAe,cAAc,eAAe,QAAO;AAC5D;;;;;AC/CA;AACA,IAAI,KAAKxC;AAET,IAAI6C,eAAaC,aAAA,UAAiB,WAAY;AAO5C,MAAI,GAAG,KAAI,KAAM,cAAc;AAAE,WAAO;AAAA,EAAK;AAE7C,MAAI,SAAS;AACb,MAAI,QAAQ,QAAQ,IAAI,UAAU,QAAQ,IAAI,YAAY,QAAQ,IAAI;AACtE,SAAO,OAAO,KAAK,KAAK;AAC1B;;;ICfA,UAAiBC,eAAa,EAAE,cAAc,KAAI,GAAIA,cAAY;AAElE,SAASA,eAAa,SAAS,KAAK;AAClC,QAAM,OAAO,CAAA;AACb,YAAU,WAAW,CAAA;AACrB,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,CAAC,QAAQ,cAAc;AACzB,WAAO;AAAA,EACX;AACE,SAAO;AACT;;ACbA;AACA,IAAI,eAAe/C;IAEnBgD,aAAiB,aAAY,EAAG;;;;;;;;;;ACiBhC,WAAA,UAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAGF,QAAI,QAAQ,aAAa,SAAS;AAChC,aAAO,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;IAKJ;AAEA,QAAI,QAAQ,aAAa,SAAS;AAChC,aAAO,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;IAEJ;AAAA;;;;;;;AChDA,IAAIC,YAAUC,eAAO;AAErB,MAAM,YAAY,SAAUD,UAAS;AACnC,SAAOA,YACL,OAAOA,aAAY,YACnB,OAAOA,SAAQ,mBAAmB,cAClC,OAAOA,SAAQ,SAAS,cACxB,OAAOA,SAAQ,eAAe,cAC9B,OAAOA,SAAQ,cAAc,cAC7B,OAAOA,SAAQ,SAAS,cACxB,OAAOA,SAAQ,QAAQ,YACvB,OAAOA,SAAQ,OAAO;AAC1B;AAIA,IAAI,CAAC,UAAUA,SAAO,GAAG;AACvBE,eAAA,UAAiB,WAAY;AAC3B,WAAO,WAAY;AAAA,IAAA;AAAA,EACvB;AACA,OAAO;AACL,MAAI,SAASnD;AACb,MAAI,UAAUb,eAAA;AACd,MAAI,QAAQ,QAAQ,KAAK8D,UAAQ,QAAQ;AAEzC,MAAI,KAAK7D;AAET,MAAI,OAAO,OAAO,YAAY;AAC5B,SAAK,GAAG;AAAA,EACZ;AAEE,MAAI;AACJ,MAAI6D,UAAQ,yBAAyB;AACnC,cAAUA,UAAQ;AAAA,EACtB,OAAS;AACL,cAAUA,UAAQ,0BAA0B,IAAI,GAAE;AAClD,YAAQ,QAAQ;AAChB,YAAQ,UAAU,CAAA;AAAA,EACtB;AAME,MAAI,CAAC,QAAQ,UAAU;AACrB,YAAQ,gBAAgB,QAAQ;AAChC,YAAQ,WAAW;AAAA,EACvB;AAEEE,yBAAiB,SAAU,IAAI,MAAM;AAEnC,QAAI,CAAC,UAAUD,eAAO,OAAO,GAAG;AAC9B,aAAO,WAAY;AAAA,MAAA;AAAA,IACzB;AACI,WAAO,MAAM,OAAO,IAAI,YAAY,8CAA8C;AAElF,QAAI,WAAW,OAAO;AACpB,WAAI;AAAA,IACV;AAEI,QAAI,KAAK;AACT,QAAI,QAAQ,KAAK,YAAY;AAC3B,WAAK;AAAA,IACX;AAEI,QAAI,SAAS,WAAY;AACvB,cAAQ,eAAe,IAAI,EAAE;AAC7B,UAAI,QAAQ,UAAU,MAAM,EAAE,WAAW,KACrC,QAAQ,UAAU,WAAW,EAAE,WAAW,GAAG;AAC/C,eAAM;AAAA,MACd;AAAA,IACA;AACI,YAAQ,GAAG,IAAI,EAAE;AAEjB,WAAO;AAAA,EACX;AAEE,MAAI,SAAS,SAASE,UAAU;AAC9B,QAAI,CAAC,UAAU,CAAC,UAAUF,eAAO,OAAO,GAAG;AACzC;AAAA,IACN;AACI,aAAS;AAET,YAAQ,QAAQ,SAAU,KAAK;AAC7B,UAAI;AACFD,kBAAQ,eAAe,KAAK,aAAa,GAAG,CAAC;AAAA,MACrD,SAAe,IAAI;AAAA,MAAA;AAAA,IACnB,CAAK;AACDA,cAAQ,OAAO;AACfA,cAAQ,aAAa;AACrB,YAAQ,SAAS;AAAA,EACrB;AACE,aAAAE,aAAA,QAAA,SAAwB;AAExB,MAAI,OAAO,SAASE,MAAM,OAAO,MAAM,QAAQ;AAE7C,QAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1B;AAAA,IACN;AACI,YAAQ,QAAQ,KAAK,IAAI;AACzB,YAAQ,KAAK,OAAO,MAAM,MAAM;AAAA,EACpC;AAGE,MAAI,eAAe,CAAA;AACnB,UAAQ,QAAQ,SAAU,KAAK;AAC7B,iBAAa,GAAG,IAAI,SAAS,WAAY;AAEvC,UAAI,CAAC,UAAUH,eAAO,OAAO,GAAG;AAC9B;AAAA,MACR;AAKM,UAAI,YAAYD,UAAQ,UAAU,GAAG;AACrC,UAAI,UAAU,WAAW,QAAQ,OAAO;AACtC,eAAM;AACN,aAAK,QAAQ,MAAM,GAAG;AAEtB,aAAK,aAAa,MAAM,GAAG;AAE3B,YAAI,SAAS,QAAQ,UAAU;AAG7B,gBAAM;AAAA,QAChB;AAEQA,kBAAQ,KAAKA,UAAQ,KAAK,GAAG;AAAA,MACrC;AAAA,IACA;AAAA,EACA,CAAG;AAED,cAAAE,aAAA,QAAA,UAAyB,WAAY;AACnC,WAAO;AAAA,EACX;AAEE,MAAI,SAAS;AAEb,MAAI,OAAO,SAASG,QAAQ;AAC1B,QAAI,UAAU,CAAC,UAAUJ,eAAO,OAAO,GAAG;AACxC;AAAA,IACN;AACI,aAAS;AAMT,YAAQ,SAAS;AAEjB,cAAU,QAAQ,OAAO,SAAU,KAAK;AACtC,UAAI;AACFD,kBAAQ,GAAG,KAAK,aAAa,GAAG,CAAC;AACjC,eAAO;AAAA,MACf,SAAe,IAAI;AACX,eAAO;AAAA,MACf;AAAA,IACA,CAAK;AAEDA,cAAQ,OAAO;AACfA,cAAQ,aAAa;AAAA,EACzB;AACE,WAAAE,aAAA,QAAA,OAAsB;AAEtB,MAAI,4BAA4BF,UAAQ;AACxC,MAAI,oBAAoB,SAASM,mBAAmB,MAAM;AAExD,QAAI,CAAC,UAAUL,eAAO,OAAO,GAAG;AAC9B;AAAA,IACN;AACID,cAAQ,WAAW;AAAA,IAAmC;AACtD,SAAK,QAAQA,UAAQ,UAAU,IAAI;AAEnC,SAAK,aAAaA,UAAQ,UAAU,IAAI;AAExC,8BAA0B,KAAKA,WAASA,UAAQ,QAAQ;AAAA,EAC5D;AAEE,MAAI,sBAAsBA,UAAQ;AAClC,MAAI,cAAc,SAASO,aAAa,IAAI,KAAK;AAC/C,QAAI,OAAO,UAAU,UAAUN,eAAO,OAAO,GAAG;AAE9C,UAAI,QAAQ,QAAW;AACrBD,kBAAQ,WAAW;AAAA,MAC3B;AACM,UAAI,MAAM,oBAAoB,MAAM,MAAM,SAAS;AAEnD,WAAK,QAAQA,UAAQ,UAAU,IAAI;AAEnC,WAAK,aAAaA,UAAQ,UAAU,IAAI;AAExC,aAAO;AAAA,IACb,OAAW;AACL,aAAO,oBAAoB,MAAM,MAAM,SAAS;AAAA,IACtD;AAAA,EACA;AACA;;;;;;;;;ACnMA;AAEA,IAAI,wBAAwB,OAAO;AACnC,IAAI,iBAAiB,OAAO,UAAU;AACtC,IAAI,mBAAmB,OAAO,UAAU;AAExC,SAAS,SAAS,KAAK;AACtB,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACtC,UAAM,IAAI,UAAU,uDAAuD;AAAA,EAC7E;AAEC,SAAO,OAAO,GAAG;AAClB;AAEA,SAAS,kBAAkB;AAC1B,MAAI;AACH,QAAI,CAAC,OAAO,QAAQ;AACnB,aAAO;AAAA,IACV;AAKE,QAAI,QAAQ,IAAI,OAAO,KAAK;AAC5B,UAAM,CAAC,IAAI;AACX,QAAI,OAAO,oBAAoB,KAAK,EAAE,CAAC,MAAM,KAAK;AACjD,aAAO;AAAA,IACV;AAGE,QAAI,QAAQ,CAAA;AACZ,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC5B,YAAM,MAAM,OAAO,aAAa,CAAC,CAAC,IAAI;AAAA,IACzC;AACE,QAAI,SAAS,OAAO,oBAAoB,KAAK,EAAE,IAAI,SAAU,GAAG;AAC/D,aAAO,MAAM,CAAC;AAAA,IACjB,CAAG;AACD,QAAI,OAAO,KAAK,EAAE,MAAM,cAAc;AACrC,aAAO;AAAA,IACV;AAGE,QAAI,QAAQ,CAAA;AACZ,2BAAuB,MAAM,EAAE,EAAE,QAAQ,SAAU,QAAQ;AAC1D,YAAM,MAAM,IAAI;AAAA,IACnB,CAAG;AACD,QAAI,OAAO,KAAK,OAAO,OAAO,CAAA,GAAI,KAAK,CAAC,EAAE,KAAK,EAAE,MAC/C,wBAAwB;AACzB,aAAO;AAAA,IACV;AAEE,WAAO;AAAA,EACT,SAAU,KAAK;AAEb,WAAO;AAAA,EACT;AACA;AAEA,IAAAQ,iBAAiB,gBAAe,IAAK,OAAO,SAAS,SAAU,QAAQ,QAAQ;AAC9E,MAAI;AACJ,MAAI,KAAK,SAAS,MAAM;AACxB,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,WAAO,OAAO,UAAU,CAAC,CAAC;AAE1B,aAAS,OAAO,MAAM;AACrB,UAAI,eAAe,KAAK,MAAM,GAAG,GAAG;AACnC,WAAG,GAAG,IAAI,KAAK,GAAG;AAAA,MACtB;AAAA,IACA;AAEE,QAAI,uBAAuB;AAC1B,gBAAU,sBAAsB,IAAI;AACpC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,YAAI,iBAAiB,KAAK,MAAM,QAAQ,CAAC,CAAC,GAAG;AAC5C,aAAG,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,QACrC;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAEC,SAAO;AACR;;ACzFA;AAEA,IAAAC,SAAiB,SAAS,KAAM,SAAS,MAAM;AAC7C,SAAO,QAAQ,OAAO,QAAQ,MAAM;AACtC;;ACJA;AACA,IAAI,WAAW1D;AACf,IAAI,iBAAiBb;AACrB,IAAI,eAAeC;AACnB,IAAI,cAAcM;AAElB,IAAAiE,gBAAiB,SAAU,OAAO,OAAO,WAAW;AAClD,WAAS,OAAO,CAAC,OAAO,OAAO,SAAS,CAAC;AACzC,MAAI,YAAY,EAAG,aAAY;AAC/B,MAAI,YAAY,EAAG,aAAY;AAC/B,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,QAAQ,KAAK,MAAM,QAAQ,SAAS;AACxC,MAAI,OAAO,QAAQ;AACnB,MAAI,WAAW;AAAA,IACb,EAAC,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,KAAK,GAAG,QAAQ,MAAK;AAAA,IACtE,EAAC,MAAM,aAAa,OAAO,OAAO,MAAM,WAAW,IAAI,GAAG,QAAQ,KAAI;AAAA,EAC1E;AACE,SAAO,eAAe,OAAO,UAAU,KAAK;AAC9C;AAGA,SAAS,OAAQ,QAAQ,OAAO;AAC9B,MAAI,SAAS;AACb,MAAI,IAAI;AACR,KAAG;AACD,QAAI,IAAI,GAAG;AACT,gBAAU;AAAA,IAChB;AACI,QAAI,KAAK,MAAM,IAAI,CAAC;AAEpB,cAAU;AAAA,EACd,SAAW,KAAK,YAAY,MAAM,IAAI;AAEpC,SAAO,aAAa,QAAQ,KAAK;AACnC;;AClCA;AACA,IAAID,QAAO1D;AACX,IAAI,cAAcb;AAElB,IAAA,YAAiB;AAAA,EACf,mBAAmB,SAAU,QAAQ,OAAO,OAAO;AACjD,QAAI,OAAO,QAAQ,KAAM;AACzB,WAAOuE,MAAK,OAAO,OAAO,IAAI;AAAA,EAClC;AAAA,EACE,aAAa,SAAU,QAAQ,OAAO,OAAO;AAC3C,QAAI,OAAO,aAAa,KAAM;AAC9B,WAAO,YAAY,OAAO,OAAO,OAAO,SAAS;AAAA,EACrD;AACA;;ACbA;AACA,IAAI,eAAe1D;AAEnB,IAAA,WAAiB,WAAY;AAC3B,SAAO,cAAc,YAAW;AAClC;AAEA,IAAI,gBAAgB,CAAA;AAEpB,cAAc,YAAYb;AAE1B,cAAc,WAAW,SAAUyE,SAAQ,OAAO;AAChD,MAAI,CAAC,OAAO;AACV,YAAQA;AACR,IAAAA,UAAS,KAAK;AAAA,EAClB;AACE,SAAO,aAAa,IAAIA,SAAQ,KAAK;AACvC;AAEA,cAAc,gBAAgB,WAAY;AACxC,SAAO,OAAO,KAAK,KAAK,MAAM;AAChC;AAEA,cAAc,WAAW,SAAUlF,OAAMkF,SAAQ,OAAO;AACtD,OAAK,OAAOlF,KAAI,IAAI,KAAK,SAASkF,SAAQ,KAAK;AACjD;AAEA,cAAc,iBAAiB,SAAU,OAAO;AAC9C,MAAIC,UAAS,KAAK;AAClB,SAAO,KAAKA,OAAM,EAAE,QAAQ,SAAUnF,OAAM;AAC1C,iBAAamF,QAAOnF,KAAI,GAAG,KAAK;AAAA,EACpC,CAAG;AACD,eAAa,KAAK,WAAW,KAAK;AACpC;AAEA,cAAc,WAAW,SAAUA,OAAM;AACvC,MAAI,CAAC,KAAK,OAAOA,KAAI,EAAG,OAAM,KAAK,qBAAqBA,KAAI;AAC5D,SAAO,KAAK,OAAOA,KAAI;AACzB;AAEA,cAAc,aAAa,SAAU,MAAMA,OAAM;AAC/C,MAAIA,SAAQ,MAAM;AAChB,IAAAA,QAAO;AACP,WAAO,CAAA;AAAA,EACX;AACE,MAAI,WAAW,KAAK,YAAY,OAAO,aAAa,KAAK;AACzD,MAAImE,cAAa,CAAC,CAAC,KAAK;AACxB,MAAIG,YAAW,CAAC,CAAC,KAAK;AACtB,MAAI,CAAC,KAAK,SAAS,QAAQ,EAAG,MAAK,SAAS,QAAQ,IAAI,EAAC,MAAM,CAAA,GAAI,OAAO,CAAA,EAAE;AAC5E,OAAK,SAAS,QAAQ,EAAEH,WAAU,EAAEG,SAAQ,IAAItE;AAClD;AAEA,cAAc,aAAa,SAAU,MAAM;AACzC,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,MAAI,eAAe,KAAK,YAAY,QAAQ;AAC5C,MAAI,WAAW,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS;AAC5D,MAAImE,cAAa,CAAC,CAAC,KAAK;AACxB,MAAIG,YAAW,CAAC,CAAC,KAAK;AACtB,MAAI,CAAC,SAAU,OAAM,KAAK,4BAA4B,cAAcH,aAAYG,SAAQ;AACxF,MAAI,CAAC,SAASH,WAAU,EAAEG,SAAQ,GAAG;AACnC,QAAIH,eAAcG,aAAY,SAAS,CAACH,WAAU,EAAEG,SAAQ,GAAG;AAC7D,MAAAH,cAAa;AAAA,IACnB,WAAeA,eAAcG,aAAY,SAASH,WAAU,EAAE,CAACG,SAAQ,GAAG;AACpE,MAAAA,YAAW;AAAA,IACjB,WAAeH,eAAcG,aAAY,SAAS,CAACH,WAAU,EAAE,CAACG,SAAQ,GAAG;AACrE,MAAAH,cAAa;AACb,MAAAG,YAAW;AAAA,IACjB,WAAeH,eAAc,CAACG,aAAY,SAAS,CAACH,WAAU,EAAEG,SAAQ,GAAG;AACrE,MAAAH,cAAa;AAAA,IACnB,WAAe,CAACA,eAAcG,aAAY,SAASH,WAAU,EAAE,CAACG,SAAQ,GAAG;AACrE,MAAAA,YAAW;AAAA,IACjB,WAAe,aAAa,KAAK,SAAS,UAAU;AAC9C,YAAM,KAAK,4BAA4B,cAAcH,aAAYG,SAAQ;AAAA,IAC/E;AAAA,EACA;AACE,MAAI,SAASH,WAAU,EAAEG,SAAQ,GAAG;AAClC,WAAO,KAAK,SAAS,SAASH,WAAU,EAAEG,SAAQ,CAAC;AAAA,EACvD,OAAS;AACL,WAAO,KAAK,WAAW,aAAa,CAAA,GAAI,MAAM,EAAC,UAAU,WAAU,CAAC,CAAC;AAAA,EACzE;AACA;AAEA,cAAc,uBAAuB,SAAS,qBAAsBtE,OAAM;AACxE,MAAI,MAAM,IAAI,MAAM,yCAAyCA,QAAO,GAAG;AACvE,QAAM,kBAAkB,KAAK,KAAK,oBAAoB;AACtD,MAAI,QAAQA;AACZ,MAAI,OAAO;AACX,SAAO;AACT;AAEA,cAAc,8BAA8B,SAAS,4BAA6B,cAAcmE,aAAYG,WAAU;AACpH,MAAI,MAAM,IAAI;AAAA,IACZ,6FACoB,eAAe,wBACbH,cAAa,sBACfG;AAAA,EAAQ;AAC9B,QAAM,kBAAkB,KAAK,KAAK,2BAA2B;AAC7D,MAAI,WAAW;AACf,MAAI,aAAaH;AACjB,MAAI,WAAWG;AACf,MAAI,OAAO;AACX,SAAO;AACT;AAEA,cAAc,cAAc,WAAY;AACtC,MAAI,WAAW,SAAU,MAAM;AAC7B,WAAO,SAAS,WAAW,IAAI;AAAA,EACnC;AACE,SAAO,aAAa,UAAU,eAAe;AAAA,IAC3C,QAAQ,aAAa,IAAI,KAAK,MAAM;AAAA,IACpC,WAAW,aAAa,IAAI,KAAK,SAAS;AAAA,IAC1C,UAAU,KAAK,MAAM,KAAK,UAAU,KAAK,YAAY,EAAE,CAAC;AAAA,EAC5D,CAAG;AACH;;;ACjHA;AACA,IAAIvB,SAAQzB,sBAAmC;AAC/C,IAAI,WAAWb;AAEf,IAAI,SAAS2E,SAAA,UAAiB,IAAI,SAAQ;AAE1C,OAAO,SAAS,SAAS;AAAA,EACvB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,EACf;AAAA,EACE,wBAAwB;AAAA,EACxB,eAAe;AACjB,CAAC;AAED,OAAO,SAAS,cAAc,OAAO,SAAS,OAAO,GAAG;AAAA,EACtD,kBAAkB;AAAA,IAChB,aAAarC,OAAM,iBAAiB,aAAa;AAAA,IACjD,UAAU;AAAA,IACV,cAAcA,OAAM,OAAO;AAAA,IAC3B,cAAcA,OAAM,iBAAiB,aAAa;AAAA,IAClD,WAAW;AAAA,IACX,eAAeA,OAAM,OAAO;AAAA,EAChC;AACA,CAAC;AAED,OAAO,SAAS,kBAAkB;AAAA,EAChC,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,EACf;AAAA,EACE,wBAAwB;AAAA,EACxB,eAAe;AACjB,CAAC;AAED,OAAO,SAAS,uBAAuB,OAAO,SAAS,gBAAgB,GAAG;AAAA,EACxE,kBAAkB;AAAA,IAChB,aAAaA,OAAM,iBAAiB,aAAa;AAAA,IACjD,UAAU;AAAA,IACV,cAAcA,OAAM,OAAO;AAAA,IAC3B,cAAcA,OAAM,iBAAiB,aAAa;AAAA,IAClD,WAAW;AAAA,IACX,eAAeA,OAAM,OAAO;AAAA,EAChC;AACA,CAAC;AAED,OAAO,WAAW,CAAA,GAAI,OAAO;AAC7B,OAAO,WAAW,EAAC,UAAU,KAAI,GAAG,YAAY;AAChD,OAAO,WAAW,EAAC,UAAU,UAAU,YAAY,KAAI,GAAG,gBAAgB;AAC1E,OAAO,WAAW,EAAC,UAAU,UAAU,YAAY,MAAM,UAAU,KAAI,GAAG,qBAAqB;AAC/F,OAAO,WAAW,EAAC,UAAU,SAAS,YAAY,KAAI,GAAG,gBAAgB;AACzE,OAAO,WAAW,EAAC,UAAU,SAAS,YAAY,MAAM,UAAU,KAAI,GAAG,qBAAqB;;;ACvD9F;AAEA,IAAA,gBAAiB;;ACFjB;AAEA,IAAAsC,cAAiB;;;;ACFjB;AACA,IAAId,YAAUjD;AACd,IAAI;AACFgE,iBAAA,UAAiB;AACnB,SAAS,IAAI;AACXA,iBAAA,UAAiBf,UAAQ;AAC3B;;;ACNA;AACA,IAAI,WAAWjD;AACf,IAAI,aAAab;AACjB,IAAI,WAAWC;AACf,IAAI,SAASM;AACb,IAAI,gBAAgBJ;AACpB,IAAI2E,gBAAczE;AAClB,IAAIyD,YAAUiB;AACd,IAAIC,iBAAeC;AAEnB,IAAA,QAAiB;AAEjB,SAAS,SAAU,KAAK,QAAQ;AAC9B,SAAO,WAAY;AACjB,WAAO,OAAO,KAAK,GAAG;AAAA,EAC1B;AACA;AAEA,SAAS,MAAO,MAAM,MAAM;AAC1B,MAAI,SAAS;AACb,MAAI,QAAQ,KAAK,OAAO;AACtB,cAAU;AACV,cAAU,QAAQ,CAAA;AAAA,EACtB,WAAa,QAAQ,KAAK,OAAO;AAC7B,cAAU;AACV,cAAU,QAAQ,CAAA;AAAA,EACtB,OAAS;AACL,cAAUnB,UAAQ;AAClB,cAAU,QAAQ,QAAQ,CAAA;AAAA,EAC9B;AAEE,OAAK,UAAU;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,EAChB;AACE,OAAK,UAAU;AACf,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,YAAY;AACjB,OAAK,eAAe;AACpB,OAAK,cAAc,QAAQ,cAAc,OAAO,OAAO,QAAQ;AAC/D,OAAK,kBAAkB,QAAQ,kBAAkB,OAC7C,CAAE,WAAW,KAAKA,UAAQ,OAAO,IACjC,QAAQ;AACZ,OAAK,gBAAgB;AACrB,OAAK,kBAAkB,QAAQ,kBAAkB,OAAO,KAAK,QAAQ;AAErE,OAAK,UAAU,QAAQ,UAAU;AACjC,OAAK,SAAS,QAAQ;AACtB,MAAI,QAAQ,KAAK,cAAc,QAAQ,KAAK;AAC5C,MAAI,WAAW,QAAQ,YAAY;AAAA,IACjC,EAAC,MAAM,eAAe,QAAQ,GAAE;AAAA,IAChC,EAAC,MAAM,qBAAqB,SAAS,GAAG,QAAQ,EAAC;AAAA,IACjD,EAAC,MAAM,WAAW,SAAS,GAAG,SAAS,GAAE;AAAA,IACzC,EAAC,MAAM,cAAc,SAAS,GAAG,SAAS,GAAE;AAAA,EAChD;AACE,OAAK,WAAW,SAAS,QAAQ,GAAG;AACpC,MAAI,gBAAgB,QAAQ,YAAY;AACxC,OAAK,SAAS,IAAI,cAAc,OAAO,UAAU,KAAK,SAAQ,CAAE;AAEhE,OAAK,cAAc,SAAS,MAAM,KAAK,SAAS;AAChD,OAAK,sBAAsB,SAAS,MAAM,KAAK,iBAAiB;AAEhE,OAAK,iBAAiB,QAAQ,iBAAiB,QAAQ,QAAQ;AAC/D,OAAK,gBAAgB;AAErB,MAAI,QAAQ,WAAY,QAAQ,WAAW,QAAQ,KAAK,QAAQ,KAAK,KAAK,OAAQ;AAChF,SAAK,OAAM;AAAA,EACf,OAAS;AACL,SAAK,QAAO;AAAA,EAChB;AACA;AACA,MAAM,YAAY,CAAA;AAElB,MAAM,UAAU,YAAY,WAAY;AACtC,SAAO,CAAC,KAAK;AACf;AAEA,MAAM,UAAU,cAAc,SAAU,UAAU;AAChD,OAAK,OAAO,YAAY,QAAQ;AAChC,MAAI,KAAK,SAAU,MAAK,eAAc;AACxC;AAEA,MAAM,UAAU,gBAAgB,SAAU,OAAO;AAC/C,MAAI,CAAC,MAAO,SAAQ,CAAA;AACpB,MAAI,OAAO,UAAU,UAAU;AAC7B,YAAQ,KAAK,QAAQ,SAAS,KAAK;AAAA,EACvC,WAAa,UAAU,OAAO,KAAK,KAAK,EAAE,WAAW,KAAK,MAAM,cAAc,QAAQ,MAAM,YAAY,OAAO;AAC3G,QAAI,aAAa,MAAM,cAAc,OAAO,WAAU,IAAK,MAAM;AACjE,QAAI,WAAW,MAAM,YAAY,OAAO,WAAW,MAAM;AACzD,YAAQ,KAAK,QAAQ,WAAW,EAAC,YAAY,YAAY,UAAU,UAAU,UAAU,MAAM,SAAQ,CAAC;AAAA,EAC1G;AACE,SAAO;AACT;AAEA,MAAM,UAAU,cAAc,SAAUY,SAAQ;AAC9C,OAAK,UAAUA;AACf,OAAK,SAAS,KAAK,MAAM;AAC3B;AAEA,MAAM,UAAU,WAAW,SAAU,OAAO;AAC1C,OAAK,OAAO,SAAS,KAAK,cAAc,KAAK,CAAC;AAC9C,MAAI,KAAK,SAAU,MAAK,eAAc;AACtC,OAAK,SAAS;AAChB;AAEA,MAAM,UAAU,iBAAiB,WAAY;AAC3C,OAAK,eAAe;AACpB,MAAI,CAAC,KAAK,gBAAiB,MAAK,UAAS;AAC3C;AAEA,MAAM,UAAU,WAAW,WAAY;AACrC,UAAS,KAAK,QAAQ,KAAK,KAAK,WAAY,MAAM;AACpD;AAEA,MAAM,UAAU,aAAa,SAAU,SAAS,KAAK;AACnD,MAAI,UAAU,CAAC,KAAK;AACpB,MAAI,QAAS,MAAK,QAAO;AACzB,OAAK,WAAW;AAChB,OAAK,OAAO,OACT,YAAYZ,UAAQ,UAAUA,UAAQ,OAAO,SAASA,UAAQ,UAC9D,QAAQ,SAAS,WAClB,KAAK;AACP,MAAI,KAAK,OAAQ,MAAK,OAAO,SAAS,KAAK,SAAQ,CAAE;AACrD,MAAI,QAAS,MAAK,OAAM;AAC1B;AAEA,MAAM,UAAU,SAAS,WAAY;AACnC,MAAI,CAAC,KAAK,UAAW;AACrB,OAAK,YAAY;AACjB,MAAI,KAAK,KAAM,MAAK,cAAa;AACjC,MAAI,KAAK,SAAU,MAAK,KAAI;AAC9B;AAEA,MAAM,UAAU,UAAU,WAAY;AACpC,MAAI,KAAK,UAAW;AACpB,MAAI,KAAK,UAAU;AACjB,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,SAAK,UAAS;AACd,SAAK,WAAW;AAAA,EACpB;AACE,OAAK,YAAY;AACjB,MAAI,KAAK,KAAM,MAAK,eAAc;AACpC;AAEA,MAAM,UAAU,gBAAgB,WAAY;AAC1C,MAAI,KAAK,gBAAgB;AACvB,SAAK,gBAAgB,OAAO,SAAS,MAAM,KAAK,OAAO,CAAC;AAAA,EAC5D;AACE,OAAK,KAAK,GAAG,UAAU,KAAK,mBAAmB;AAC/C,MAAI,KAAK,iBAAiB;AACxB,SAAK,gBAAgBgB,cAAY,KAAK,aAAa,KAAK,eAAe;AACvE,QAAI,KAAK,cAAc,MAAO,MAAK,cAAc,MAAK;AAAA,EAC1D;AACA;AAEA,MAAM,UAAU,iBAAiB,WAAY;AAC3C,OAAK,KAAK,eAAe,UAAU,KAAK,mBAAmB;AAC3D,MAAI,KAAK,gBAAiB,eAAc,KAAK,aAAa;AAC1D,MAAI,KAAK,cAAe,MAAK,cAAa;AAC5C;AAEA,MAAM,UAAU,OAAO,SAAU,IAAI;AACnC,MAAI,KAAK,UAAW,QAAO,MAAMhB,UAAQ,SAAS,EAAE;AACpD,MAAI,CAAC,KAAK,SAAU,QAAO,MAAMA,UAAQ,SAAS,EAAE;AACpD,OAAK,WAAW;AAChB,OAAK,UAAS;AACd,QAAMkB,eAAa,EAAE;AACvB;AAEA,MAAM,UAAU,OAAO,SAAU,SAAS,WAAW;AACnD,OAAK,WAAW;AAChB,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,QAAQ,UAAU;AAAA,EAC3B,WAAa,OAAO,YAAY,UAAU;AACtC,QAAI,cAAc,OAAO,KAAK,OAAO;AACrC,aAAS,KAAK,GAAG,KAAK,YAAY,QAAQ,EAAE,IAAI;AAC9C,UAAI,MAAM,YAAY,EAAE;AACxB,WAAK,QAAQ,GAAG,IAAI,QAAQ,GAAG;AAAA,IACrC;AAAA,EACA;AACE,MAAI,aAAa,KAAM,MAAK,QAAQ,YAAY;AAChD,MAAI,KAAK,UAAW;AACpB,OAAK,eAAc;AACrB;AAEA,MAAM,UAAU,QAAQ,SAAU,YAAY;AAC5C,OAAK,QAAQ,aAAa,cAAc;AACxC,OAAK,QAAQ;AACb,MAAI,KAAK,UAAW;AACpB,MAAI,CAAC,KAAK,SAAU;AACpB,OAAK,eAAc;AACrB;AAEA,MAAM,UAAU,oBAAoB,WAAY;AAC9C,OAAK,OAAO,SAAS,KAAK,KAAK,UAAU,CAAC;AAC1C,OAAK,eAAc;AACrB;AAEA,MAAM,UAAU,YAAY,WAAY;AACtC,MAAI,KAAK,aAAa,KAAK,QAAS;AACpC,MAAI,CAAC,KAAK,iBAAiB;AACzB,QAAI,MAAM,KAAK,IAAG;AAClB,QAAI,KAAK,iBAAiB,MAAM,KAAK,gBAAgB,KAAK,gBAAiB;AAC3E,SAAK,gBAAgB;AAAA,EACzB;AACE,MAAI,CAAC,KAAK,YAAY,KAAK,WAAW;AACpC,SAAK,YAAY;AACjB,QAAI,SAAS,KAAK,OAAO,KAAI;AAC7B,QAAI,KAAK,aAAa;AACpB,gBAAU,KAAK,OAAO,WAAU;AAAA,IACtC;AACI,WAAO,KAAK,SAAS,MAAM,MAAM;AAAA,EACrC;AACE,MAAI,CAAC,KAAK,YAAY,CAAC,KAAK,UAAW;AACvC,MAAI,KAAK,YAAY,CAAC,KAAK,WAAW;AACpC,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,QAAI,KAAK,aAAa;AACpB,WAAK,SAAS,MAAM,KAAK,OAAO,WAAU,CAAE;AAAA,IAClD;AAAA,EACA;AACE,MAAI,CAAC,KAAK,aAAc;AACxB,MAAI,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO,CAAC,GAAG;AACxD,SAAK,UAAU;AACf,SAAK,SAAS,GAAG,SAAS,SAAS,MAAM,WAAY;AACnD,WAAK,UAAU;AACf,WAAK,UAAS;AAAA,IACpB,CAAK,CAAC;AAAA,EACN;AACA;;ICxOA,cAAiB,SAAU,UAAU;AACnC,GAAC,QAAQ,QAAQ,QAAQ,MAAM,EAAE,QAAQ,SAAUE,SAAQ;AACzD,QAAIA,QAAO,WAAWA,QAAO,SAAS,OAAOA,QAAO,QAAQ,gBAAgB,YAAY;AACtF,MAAAA,QAAO,QAAQ,YAAY,QAAQ;AAAA,IACzC;AAAA,EACA,CAAG;AACH;;;;ACNA;AACA,MAAI,WAAWrE;AACf,MAAIsE,SAAQnF;AACZ,MAAI,KAAKC,aAAkB;AAC3B,MAAImF,OAAM,UAAU,OAAA,UAAiB,IAAI,GAAE;AAC3C,MAAItE,QAAOP;AAEX,MAAI8E,gBAAclF;AAClB,MAAImF,kBAAiBjF;AAErBgF,gBAAY,IAAI;AAChB,MAAIH,UAAS,QAAQ;AACrB,SAAO,eAAeE,MAAK,UAAU;AAAA,IACnC,KAAK,SAAU,WAAW;AACxB,MAAAF,UAAS;AACT,UAAI,KAAK,OAAO;AACd,aAAK,MAAM,WAAWA,SAAQA,OAAM;AAAA,MAC1C;AAAA,IACA;AAAA,IACE,KAAK,WAAY;AACf,aAAOA;AAAA,IACX;AAAA,EACA,CAAC;AAGD,MAAI;AACJ,EAAAE,KAAI,WAAW,WAAY;AACzB,WAAO,gBAAgB,OAAO,eAAeF,QAAO;AAAA,EACtD;AAEA,EAAAE,KAAI,cAAc,WAAY;AAC5B,mBAAe;AACf,SAAK,MAAM,SAAS,EAAC,UAAU,cAAc,YAAY,eAAc,CAAC;AAAA,EAC1E;AACA,EAAAA,KAAI,eAAe,WAAY;AAC7B,mBAAe;AACf,SAAK,MAAM,SAAS,EAAC,UAAU,cAAc,YAAY,eAAc,CAAC;AAAA,EAC1E;AAGA,EAAAA,KAAI,QAAQ;AAEZ,EAAAA,KAAI,QAAQ,IAAID,OAAMD,SAAQ;AAAA,IAC5B,SAAS;AAAA;AAAA,IACT,OAAO,EAAC,UAAUE,KAAI,SAAQ,EAAE;AAAA,IAChC,UAAU;AAAA,MACR,EAAC,MAAM,eAAe,QAAQ,GAAE;AAAA,MAChC,EAAC,MAAM,qBAAqB,SAAS,GAAG,QAAQ,EAAC;AAAA,MACjD,EAAC,MAAM,WAAW,SAAS,GAAE;AAAA,MAC7B;AAAA,MACA,EAAC,MAAM,WAAW,SAAS,GAAG,SAAS,GAAE;AAAA;EAE7C,CAAC;AAED,EAAAA,KAAI,UAAU,IAAI,SAAS,aAAY;AAIvC,EAAAA,KAAI,kBAAkBA,KAAI,MAAM,UAAS;AAEzC,MAAI;AAEJ,EAAAA,KAAI,gBAAgB,WAAY;AAC9B,qBAAiB;AACjB,SAAK,MAAM,SAAS,EAAC,UAAU,KAAK,SAAQ,GAAI,YAAY,eAAc,CAAC;AAAA,EAC7E;AAEA,EAAAA,KAAI,iBAAiB,WAAY;AAC/B,qBAAiB;AACjB,SAAK,MAAM,SAAS,EAAC,UAAU,KAAK,SAAQ,GAAI,YAAY,eAAc,CAAC;AAAA,EAC7E;AAEA,EAAAA,KAAI,mBAAmB,SAAUV,SAAQ;AACvC,SAAK,MAAM,YAAYA,OAAM;AAAA,EAC/B;AAEA,EAAAU,KAAI,mBAAmB,SAAU,UAAU;AACzC,SAAK,MAAM,YAAY,QAAQ;AAAA,EACjC;AAEA,EAAAA,KAAI,iBAAiB,WAAY;AAC/B,QAAI,KAAK,iBAAiB;AACxB;AAAA,IACJ;AAEE,SAAK,kBAAkB;AACvB,SAAK,QAAQ,GAAG,UAAU,KAAK,YAAY;AAC3C,QAAI,KAAK,SAAS;AAChB;AAAA,IACJ;AAEE,SAAK,MAAM,OAAM;AAAA,EACnB;AAEA,EAAAA,KAAI,kBAAkB,WAAY;AAChC,QAAI,CAAC,KAAK,iBAAiB;AACzB;AAAA,IACJ;AACE,SAAK,kBAAkB;AACvB,SAAK,QAAQ,eAAe,UAAU,KAAK,YAAY;AACvD,SAAK,MAAM,QAAO;AAAA,EACpB;AAEA,MAAI,sBAAsB,CAAC,YAAY,WAAW,WAAW;AAE7D,MAAI,WAAW,SAAU9D,UAAS;AAGhC,WAAO,KAAK8D,IAAG,EAAE,QAAQ,SAAU,GAAG;AACpC,UAAI,EAAE,CAAC,MAAM,KAAK;AAChB;AAAA,MACN;AAEI,UAAI,oBAAoB,OAAO,SAAU,GAAG;AAC1C,eAAO,MAAM;AAAA,MACnB,CAAK,EAAE,QAAQ;AACT;AAAA,MACN;AAEI,UAAI9D,SAAQ,CAAC,GAAG;AACd;AAAA,MACN;AAEI,UAAI,OAAO8D,KAAI,CAAC,MAAM,YAAY;AAChC;AAAA,MACN;AAEI,UAAI,OAAOA,KAAI,CAAC;AAChB,MAAA9D,SAAQ,CAAC,IAAI,WAAY;AACvB,eAAO,KAAK,MAAM8D,MAAK,SAAS;AAAA,MACtC;AAAA,IACA,CAAG;AAGD,QAAI9D,oBAAmB,SAAS,cAAc;AAC5C,0BAAoB,QAAQ,SAAU,GAAG;AACvC,YAAI,OAAOA,SAAQ,CAAC;AACpB,QAAAA,SAAQ,CAAC,IAAI,WAAY;AACvB,iBAAO,SAAS,KAAK,MAAMA,UAAS,SAAS,CAAC;AAAA,QACtD;AAAA,MACA,CAAK;AAAA,IACL;AACE,WAAOA;AAAA,EACT;AAGA,sBAAoB,QAAQ,SAAU,GAAG;AACvC,IAAA8D,KAAI,CAAC,IAAI,WAAY;AACnB,aAAO,SAAS,KAAK,QAAQ,CAAC,EAAE,MAAM,KAAK,SAAS,SAAS,CAAC;AAAA,IAClE;AAAA,EACA,CAAC;AAED,EAAAA,KAAI,gBAAgB,SAAU,IAAI;AAChC,QAAI,CAAC,KAAK,iBAAiB;AACzB,aAAO,MAAM,QAAQ,SAAS,EAAE;AAAA,IACpC;AAEE,SAAK,MAAM,KAAK,EAAE;AAAA,EACpB;AAEA,EAAAA,KAAI,eAAe,SAAU7F,OAAM,WAAW;AAC5C,QAAI,CAAC,KAAK,iBAAiB;AACzB;AAAA,IACJ;AAEE,QAAI,SAAS,CAAA;AACb,QAAIA,OAAM;AACR,aAAO,UAAUA;AAAA,IACrB;AAEE,QAAI,OAAO6F,KAAI,OAAOA,KAAI,OAAO,SAAS,CAAC;AAC3C,QAAI,MAAM;AACR,aAAO,aAAa,KAAK;AACzB,UAAI,OAAOA,KAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AACxC,UAAI,UAAU,KAAK,QAAQ,MAAMA,KAAI,MAAM,KAAK,KAAK,CAAC;AACtD,UAAI,KAAK,QAAQ;AACf,mBAAW,MAAM,KAAK,QAAQ,KAAK,QAAQ,KAAK,WAAW;AAAA,MACjE;AAEI,iBAAW,MAAM,KAAK,QAAQ,MAAM,OAAO,EAAE,CAAC;AAC9C,aAAO,UAAU;AAAA,IACrB;AACE,WAAO,YAAY,aAAa,KAAK,QAAQ,UAAS;AACtD,SAAK,MAAM,KAAK,MAAM;AAAA,EACxB,EAAE,KAAKA,IAAG;AAGV,EAAAA,KAAI,QAAQ,WAAY;AACtB,SAAK,UAAU;AACf,QAAI,KAAK,iBAAiB;AACxB,WAAK,MAAM,QAAO;AAAA,IACtB;AAAA,EACA;AAEA,EAAAA,KAAI,SAAS,WAAY;AACvB,QAAI,CAAC,KAAK,SAAS;AACjB;AAAA,IACJ;AAEE,SAAK,UAAU;AAEf,QAAI,IAAI,KAAK;AACb,SAAK,UAAU,CAAA;AACf,MAAE,QAAQ,SAAU,GAAG;AACrB,WAAK,QAAQ,CAAC;AAAA,IAClB,GAAK,IAAI;AACP,QAAI,KAAK,iBAAiB;AACxB,WAAK,MAAM,OAAM;AAAA,IACrB;AAAA,EACA;AAEA,EAAAA,KAAI,UAAU,CAAA;AAEd,MAAI,KAAK;AACT,EAAAA,KAAI,SAAS,CAAA;AACb,EAAAA,KAAI,gBAAgB;AACpB,EAAAA,KAAI,MAAM,SAAU,KAAKG,SAAQ,SAAS;AACxC,QAAI,IAAI,KAAK,OAAO,GAAG;AACvB,QAAI,MAAM,QAAW;AACnB,aAAO,KAAK,KAAK,SAAS,IAAI,MAAMzE,MAAK;AAAA,QACvC;AAAA,QAA2B;AAAA,MAAG,CAAC,CAAC;AAAA,IACtC;AAEE,QAAIrB,KAAI,IAAI,MAAM,UAAU,SAAS,CAAC;AACtC,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAI,MAAMA,GAAE,IAAI,CAAC,IAAI,UAAU,CAAC;AAGhC,UAAI,OAAO,QAAQ,YAAY,eAAe,SAAS,IAAI,OAAO;AAChE,eAAO,eAAe,KAAK,SAAS;AAAA,UAClC,OAAO,QAAQ,IAAI,QAAQ;AAAA,UAC3B,YAAY;AAAA,UACZ,UAAU;AAAA,QAClB,CAAO;AAAA,MACP;AAAA,IACA;AACE,QAAI,OAAO;AACT,MAAAA,GAAE,QAAQ,QAAQ,IAAI;AAAA,IAC1B;AACE,cAAUqB,MAAK,OAAO,MAAMA,OAAMrB,EAAC;AAEnC,QAAI,IAAI;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,OAAO8F,WAAU,EAAE;AAAA,MAC3B;AAAA,MACA,YAAY9F;AAAA;AAGd,SAAK,KAAK,OAAO,CAAC;AAClB,SAAK,KAAK,SAAS,KAAK,CAAC;AACzB,QAAI,EAAE,QAAQ;AACZ,WAAK,KAAK,EAAE,QAAQ,CAAC;AAAA,IACzB;AAEE,SAAK,OAAO,KAAK,CAAC;AAClB,QAAI,MAAM,KAAK;AACf,QAAI,IAAI,KAAK,OAAO,SAAS;AAC7B,QAAI,IAAI,MAAM,IAAI;AAChB,UAAI,UAAU,KAAK,MAAM,MAAM,GAAG;AAClC,WAAK,SAAS,KAAK,OAAO,MAAM,KAAK,OAAO;AAAA,IAChD;AAEE,SAAK,QAAQ,CAAC;AAAA,EAChB,EAAE,KAAK2F,IAAG;AAEV,EAAAA,KAAI,UAAU,SAAU,GAAG;AACzB,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,KAAK,CAAC;AACnB;AAAA,IACJ;AACE,QAAI,KAAK,iBAAiB;AACxB,WAAK,MAAM,MAAM,EAAE,MAAM;AAAA,IAC7B;AAEE,QAAI,IAAI,KAAK,OAAO,EAAE,KAAK;AAC3B,QAAI,MAAM,QAAW;AACnB;AAAA,IACJ;AAEE,QAAI,IAAI,KAAK,OAAO,KAAK,KAAK,GAAG;AAC/B;AAAA,IACJ;AAEE,QAAI,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG;AACzB;AAAA,IACJ;AAIE,QAAI,OAAOA,KAAI,KAAK,EAAE,KAAK,KAAK,OAAOA,KAAI,KAAK,EAAE,KAAK,IAAI,EAAE;AAC7D,SAAK,cAAa;AAClB,MAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,SAAU,MAAM;AAC/C,UAAI,KAAK,SAAS;AAChB,aAAK,MAAM,KAAK,SAAS,KAAK,YAAY;AAC1C,aAAK,MAAM,GAAG;AAAA,MACpB;AACI,WAAK,MAAM,MAAMA,KAAI,MAAM,EAAE,KAAK,CAAC;AACnC,UAAI,IAAI,EAAE,UAAU;AACpB,UAAI,GAAG;AACL,aAAK,MAAM,GAAG;AAAA,MACpB;AAEI,WAAK,MAAM,GAAG,KAAK,WAAW;AAC9B,WAAK,MAAM,MAAM,OAAO,IAAI;AAAA,IAChC,GAAK,IAAI;AACP,SAAK,aAAY;AAAA,EACnB;AAEA,EAAAA,KAAI,UAAU,SAAU,KAAK,OAAO;AAClC,QAAI,CAACF,SAAQ;AACX;AAAA,IACJ;AAEE,QAAI,SAAS;AACb,QAAI,KAAK,YAAY;AACnB,cAAQ,SAAS,CAAA;AACjB,UAAI,WAAW,CAAA;AACf,UAAI,MAAM,IAAI;AACZ,iBAAS,KAAK,MAAM,EAAE;AAAA,MAC5B;AAEI,UAAI,MAAM,IAAI;AACZ,iBAAS,KAAK,OAAO,MAAM,GAAG,CAAC,EAAE,YAAW,IAAK,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,MACxE;AAEI,UAAI,MAAM,MAAM;AACd,iBAAS,KAAK,MAAM;AAAA,MAC1B;AAEI,UAAI,MAAM,WAAW;AACnB,iBAAS,KAAK,WAAW;AAAA,MAC/B;AAEI,UAAI,MAAM,SAAS;AACjB,iBAAS,KAAK,SAAS;AAAA,MAC7B;AAEI,UAAI,SAAS,QAAQ;AACnB,kBAAUI,gBAAe,MAAM,QAAQ;AAAA,MAC7C;AAEI,UAAI,MAAM,MAAM;AACd,kBAAUA,gBAAe,KAAI;AAAA,MACnC;AAAA,IACA;AACE,cAAU;AACV,QAAI,KAAK,YAAY;AACnB,gBAAUA,gBAAe,MAAM,OAAO;AAAA,IAC1C;AAEE,WAAO;AAAA,EACT;AAEA,EAAAF,KAAI,QAAQ,SAAU,KAAK,OAAO;AAChC,QAAI,CAACF,SAAQ;AACX;AAAA,IACJ;AAEE,IAAAA,QAAO,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,EACvC;AAEA,EAAAE,KAAI,WAAW,SAAU,KAAK,GAAG,OAAO,MAAM;AAE5C,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACX;AAEE,SAAK,OAAO,GAAG,IAAI;AACnB,SAAK,MAAM,GAAG,IAAI;AAClB,QAAI,CAAC,KAAK,GAAG,GAAG;AACd,WAAK,GAAG,IAAI,WAAY;AACtB,YAAI3F,KAAI,IAAI,MAAM,UAAU,SAAS,CAAC;AACtC,QAAAA,GAAE,CAAC,IAAI;AACP,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAAA,GAAE,IAAI,CAAC,IAAI,UAAU,CAAC;AAAA,QAC9B;AAEM,eAAO,KAAK,IAAI,MAAM,MAAMA,EAAC;AAAA,MACnC,EAAM,KAAK,IAAI;AAAA,IACf;AACE,SAAK,KAAK,GAAG,IAAI;AAAA,EACnB;AAEA,EAAA2F,KAAI,cAAc,EAAE,IAAI,UAAS;AACjC,EAAAA,KAAI,eAAe,EAAE,IAAI,SAAS,IAAI,QAAO;AAE7C,EAAAA,KAAI,QAAQ,CAAA;AACZ,EAAAA,KAAI,SAAS,CAAA;AACb,EAAAA,KAAI,OAAO,CAAA;AACX,EAAAA,KAAI,SAAS,SAAS,WAAW,EAAE,SAAS,KAAI,GAAI,MAAM;AAC1D,EAAAA,KAAI,SAAS,WAAW,KAAM,EAAE,IAAI,QAAQ,IAAI,QAAO,GAAI,MAAM;AACjE,EAAAA,KAAI,SAAS,QAAQ,KAAM,EAAE,IAAI,QAAO,CAAE;AAC1C,EAAAA,KAAI,SAAS,UAAU,MAAM,EAAE,IAAI,SAAS,IAAI,QAAO,CAAE;AACzD,EAAAA,KAAI,SAAS,QAAQ,KAAM,EAAE,IAAI,SAAS,IAAI,QAAO,CAAE;AACvD,EAAAA,KAAI,SAAS,UAAU,MAAM,EAAE,IAAI,QAAQ,IAAI,QAAO,CAAE;AACxD,EAAAA,KAAI,SAAS,QAAQ,KAAM,EAAE,IAAI,SAAS,IAAI,SAAQ,GAAI,MAAM;AAChE,EAAAA,KAAI,SAAS,SAAS,KAAM,EAAE,IAAI,OAAO,IAAI,QAAO,GAAI,MAAM;AAC9D,EAAAA,KAAI,SAAS,UAAU,QAAQ;AAG/B,EAAAA,KAAI,GAAG,SAAS,WAAY;AAAA,EAAA,CAAE;;;;;;;;;;AC7X9B,MAAI,aAAavE;AACjB,MAAI,YAAY,QAAQ,aAAa;AACrC,MAAId,OAAKC;AAIT,MAAI,QAAQ,QAAQ,IAAI,cAAc,KAAK,KAAK,QAAQ,IAAI,UAAU;AAEtE,WAAS,UAAU;AAGjB,QAAI;AACJ,QAAI,OAAO;AACT,UAAI,YAAY,IAAI;AACpB,iBAAW;AAAA,IACf;AACI,iBAAW;AAEb,WAAO;AAEP,aAAS,cAAc,KAAK;AAC1B,UAAI,KAAK;AACP,kBAAU,UAAU,IAAI;AACxB,cAAM;AACN,wBAAgB,GAAG;AAAA,MACzB;AAAA,IACA;AAEE,aAAS,gBAAgB,KAAK;AAC5B,UAAI,KAAK;AACP,YAAI,QAAQ;AACV,gBAAM;AAAA,iBACC,CAAC,QAAQ,eAAe;AAC/B,cAAI,MAAM,2BAA2B,IAAI,SAAS,IAAI;AACtD,cAAI,QAAQ;AACV,oBAAQ,MAAM,GAAG;AAAA;AAEjB,oBAAQ,MAAM,GAAG;AAAA,QAC3B;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAEA,WAAS,cAAc,IAAI;AACzB,WAAO,OAAO,OAAO,aAAa,KAAK,QAAO;AAAA,EAChD;AAEA,MAAI,YAAY,WAAW;AAI3B,MAAI,WAAW;AACb,QAAI,aAAa;AAAA,EACnB,OAAO;AACL,QAAI,aAAa;AAAA,EACnB;AAGA,MAAI,WAAW;AACb,QAAI,cAAc;AAAA,EACpB,OAAO;AACL,QAAI,cAAc;AAAA,EACpB;AAEA,MAAA,eAAuB,SAAS,aAAa,GAAG,OAAO;AAErD,QAAI,WAAW,QAAQ,CAAC;AAExB,QAAI,SAAS,OAAO,UAAU,eAAe,KAAK,OAAO,CAAC,GAAG;AAC3D,aAAO,MAAM,CAAC;AAAA,IAClB;AAEE,QAAI,WAAW,GACX,YAAY,CAAA,GACZ,YAAY,CAAA;AAGhB,QAAI;AAEJ,QAAI;AAEJ,QAAI;AAEJ,QAAI;AAEJ,UAAK;AAEL,aAAS,QAAQ;AAEf,UAAI,IAAI,YAAY,KAAK,CAAC;AAC1B,YAAM,EAAE,CAAC,EAAE;AACX,gBAAU,EAAE,CAAC;AACb,aAAO,EAAE,CAAC;AACV,iBAAW;AAGX,UAAI,aAAa,CAAC,UAAU,IAAI,GAAG;AACjCD,aAAG,UAAU,IAAI;AACjB,kBAAU,IAAI,IAAI;AAAA,MACxB;AAAA,IACA;AAKE,WAAO,MAAM,EAAE,QAAQ;AAErB,iBAAW,YAAY;AACvB,UAAI,SAAS,WAAW,KAAK,CAAC;AAC9B,iBAAW;AACX,iBAAW,OAAO,CAAC;AACnB,aAAO,WAAW,OAAO,CAAC;AAC1B,YAAM,WAAW;AAGjB,UAAI,UAAU,IAAI,KAAM,SAAS,MAAM,IAAI,MAAM,MAAO;AACtD;AAAA,MACN;AAEI,UAAI;AACJ,UAAI,SAAS,OAAO,UAAU,eAAe,KAAK,OAAO,IAAI,GAAG;AAE9D,uBAAe,MAAM,IAAI;AAAA,MAC/B,OAAW;AACL,YAAI,OAAOA,KAAG,UAAU,IAAI;AAC5B,YAAI,CAAC,KAAK,kBAAkB;AAC1B,oBAAU,IAAI,IAAI;AAClB,cAAI,MAAO,OAAM,IAAI,IAAI;AACzB;AAAA,QACR;AAIM,YAAI,aAAa;AACjB,YAAI,CAAC,WAAW;AACd,cAAI,KAAK,KAAK,IAAI,SAAS,EAAE,IAAI,MAAM,KAAK,IAAI,SAAS,EAAE;AAC3D,cAAI,UAAU,eAAe,EAAE,GAAG;AAChC,yBAAa,UAAU,EAAE;AAAA,UACnC;AAAA,QACA;AACM,YAAI,eAAe,MAAM;AACvBA,eAAG,SAAS,IAAI;AAChB,uBAAaA,KAAG,aAAa,IAAI;AAAA,QACzC;AACM,uBAAe,WAAW,QAAQ,UAAU,UAAU;AAEtD,YAAI,MAAO,OAAM,IAAI,IAAI;AACzB,YAAI,CAAC,UAAW,WAAU,EAAE,IAAI;AAAA,MACtC;AAGI,UAAI,WAAW,QAAQ,cAAc,EAAE,MAAM,GAAG,CAAC;AACjD,YAAK;AAAA,IACT;AAEE,QAAI,MAAO,OAAM,QAAQ,IAAI;AAE7B,WAAO;AAAA,EACT;AAGA,MAAA,WAAmB,SAAS,SAAS,GAAG,OAAO,IAAI;AACjD,QAAI,OAAO,OAAO,YAAY;AAC5B,WAAK,cAAc,KAAK;AACxB,cAAQ;AAAA,IACZ;AAGE,QAAI,WAAW,QAAQ,CAAC;AAExB,QAAI,SAAS,OAAO,UAAU,eAAe,KAAK,OAAO,CAAC,GAAG;AAC3D,aAAO,QAAQ,SAAS,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,IACzD;AAEE,QAAI,WAAW,GACX,YAAY,CAAA,GACZ,YAAY,CAAA;AAGhB,QAAI;AAEJ,QAAI;AAEJ,QAAI;AAEJ,QAAI;AAEJ,UAAK;AAEL,aAAS,QAAQ;AAEf,UAAI,IAAI,YAAY,KAAK,CAAC;AAC1B,YAAM,EAAE,CAAC,EAAE;AACX,gBAAU,EAAE,CAAC;AACb,aAAO,EAAE,CAAC;AACV,iBAAW;AAGX,UAAI,aAAa,CAAC,UAAU,IAAI,GAAG;AACjCA,aAAG,MAAM,MAAM,SAAS,KAAK;AAC3B,cAAI,IAAK,QAAO,GAAG,GAAG;AACtB,oBAAU,IAAI,IAAI;AAClB,eAAI;AAAA,QACZ,CAAO;AAAA,MACP,OAAW;AACL,gBAAQ,SAAS,IAAI;AAAA,MAC3B;AAAA,IACA;AAIE,aAAS,OAAO;AAEd,UAAI,OAAO,EAAE,QAAQ;AACnB,YAAI,MAAO,OAAM,QAAQ,IAAI;AAC7B,eAAO,GAAG,MAAM,CAAC;AAAA,MACvB;AAGI,iBAAW,YAAY;AACvB,UAAI,SAAS,WAAW,KAAK,CAAC;AAC9B,iBAAW;AACX,iBAAW,OAAO,CAAC;AACnB,aAAO,WAAW,OAAO,CAAC;AAC1B,YAAM,WAAW;AAGjB,UAAI,UAAU,IAAI,KAAM,SAAS,MAAM,IAAI,MAAM,MAAO;AACtD,eAAO,QAAQ,SAAS,IAAI;AAAA,MAClC;AAEI,UAAI,SAAS,OAAO,UAAU,eAAe,KAAK,OAAO,IAAI,GAAG;AAE9D,eAAO,gBAAgB,MAAM,IAAI,CAAC;AAAA,MACxC;AAEI,aAAOA,KAAG,MAAM,MAAM,OAAO;AAAA,IACjC;AAEE,aAAS,QAAQ,KAAK,MAAM;AAC1B,UAAI,IAAK,QAAO,GAAG,GAAG;AAGtB,UAAI,CAAC,KAAK,kBAAkB;AAC1B,kBAAU,IAAI,IAAI;AAClB,YAAI,MAAO,OAAM,IAAI,IAAI;AACzB,eAAO,QAAQ,SAAS,IAAI;AAAA,MAClC;AAKI,UAAI,CAAC,WAAW;AACd,YAAI,KAAK,KAAK,IAAI,SAAS,EAAE,IAAI,MAAM,KAAK,IAAI,SAAS,EAAE;AAC3D,YAAI,UAAU,eAAe,EAAE,GAAG;AAChC,iBAAO,UAAU,MAAM,UAAU,EAAE,GAAG,IAAI;AAAA,QAClD;AAAA,MACA;AACIA,WAAG,KAAK,MAAM,SAASyF,MAAK;AAC1B,YAAIA,KAAK,QAAO,GAAGA,IAAG;AAEtBzF,aAAG,SAAS,MAAM,SAASyF,MAAK,QAAQ;AACtC,cAAI,CAAC,UAAW,WAAU,EAAE,IAAI;AAChC,oBAAUA,MAAK,MAAM;AAAA,QAC7B,CAAO;AAAA,MACP,CAAK;AAAA,IACL;AAEE,aAAS,UAAU,KAAK,QAAQC,OAAM;AACpC,UAAI,IAAK,QAAO,GAAG,GAAG;AAEtB,UAAI,eAAe,WAAW,QAAQ,UAAU,MAAM;AACtD,UAAI,MAAO,OAAMA,KAAI,IAAI;AACzB,sBAAgB,YAAY;AAAA,IAChC;AAEE,aAAS,gBAAgB,cAAc;AAErC,UAAI,WAAW,QAAQ,cAAc,EAAE,MAAM,GAAG,CAAC;AACjD,YAAK;AAAA,IACT;AAAA,EACA;;;;;;;;AC9SA,gBAAiB;AACjB,WAAS,WAAW;AACpB,WAAS,OAAO;AAChB,WAAS,eAAe;AACxB,WAAS,cAAc;AACvB,WAAS,gBAAgB;AAEzB,MAAI1F,OAAKc;AACT,MAAI,eAAed,KAAG;AACtB,MAAI,mBAAmBA,KAAG;AAE1B,MAAI2F,WAAU,QAAQ;AACtB,MAAI,KAAK,YAAY,KAAKA,QAAO;AACjC,MAAIC,OAAM3F,WAAA;AAEV,WAAS,SAAU,IAAI;AACrB,WAAO,MAAM,GAAG,YAAY,eAC1B,GAAG,SAAS,WACZ,GAAG,SAAS,YACZ,GAAG,SAAS;AAAA,EAEhB;AAEA,WAAS,SAAU,GAAG,OAAO,IAAI;AAC/B,QAAI,IAAI;AACN,aAAO,aAAa,GAAG,OAAO,EAAE;AAAA,IACpC;AAEE,QAAI,OAAO,UAAU,YAAY;AAC/B,WAAK;AACL,cAAQ;AAAA,IACZ;AACE,iBAAa,GAAG,OAAO,SAAU,IAAI,QAAQ;AAC3C,UAAI,SAAS,EAAE,GAAG;AAChB,QAAA2F,KAAI,SAAS,GAAG,OAAO,EAAE;AAAA,MAC/B,OAAW;AACL,WAAG,IAAI,MAAM;AAAA,MACnB;AAAA,IACA,CAAG;AAAA,EACH;AAEA,WAAS,aAAc,GAAG,OAAO;AAC/B,QAAI,IAAI;AACN,aAAO,iBAAiB,GAAG,KAAK;AAAA,IACpC;AAEE,QAAI;AACF,aAAO,iBAAiB,GAAG,KAAK;AAAA,IACpC,SAAW,IAAI;AACX,UAAI,SAAS,EAAE,GAAG;AAChB,eAAOA,KAAI,aAAa,GAAG,KAAK;AAAA,MACtC,OAAW;AACL,cAAM;AAAA,MACZ;AAAA,IACA;AAAA,EACA;AAEA,WAAS,cAAe;AACtB5F,SAAG,WAAW;AACdA,SAAG,eAAe;AAAA,EACpB;AAEA,WAAS,gBAAiB;AACxBA,SAAG,WAAW;AACdA,SAAG,eAAe;AAAA,EACpB;;;;;;;;ACjEA,cAAiB,SAAU,IAAI,IAAI;AAC/B,QAAI,MAAM,CAAA;AACV,aAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAChC,UAAI,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;AACnB,UAAI,QAAQ,CAAC,EAAG,KAAI,KAAK,MAAM,KAAK,CAAC;AAAA,UAChC,KAAI,KAAK,CAAC;AAAA,IACvB;AACI,WAAO;AAAA,EACX;AAEA,MAAI,UAAU,MAAM,WAAW,SAAU,IAAI;AACzC,WAAO,OAAO,UAAU,SAAS,KAAK,EAAE,MAAM;AAAA,EAClD;;;;;;;;ACZA;AACA,kBAAiB;AACjB,WAAS,SAASN,IAAG,GAAG,KAAK;AAC3B,QAAIA,cAAa,OAAQ,CAAAA,KAAI,WAAWA,IAAG,GAAG;AAC9C,QAAI,aAAa,OAAQ,KAAI,WAAW,GAAG,GAAG;AAE9C,QAAI,IAAImG,OAAMnG,IAAG,GAAG,GAAG;AAEvB,WAAO,KAAK;AAAA,MACV,OAAO,EAAE,CAAC;AAAA,MACV,KAAK,EAAE,CAAC;AAAA,MACR,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MACtB,MAAM,IAAI,MAAM,EAAE,CAAC,IAAIA,GAAE,QAAQ,EAAE,CAAC,CAAC;AAAA,MACrC,MAAM,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM;AAAA,IACnC;AAAA,EACA;AAEA,WAAS,WAAW,KAAK,KAAK;AAC5B,QAAI,IAAI,IAAI,MAAM,GAAG;AACrB,WAAO,IAAI,EAAE,CAAC,IAAI;AAAA,EACpB;AAEA,WAAS,QAAQmG;AACjB,WAASA,OAAMnG,IAAG,GAAG,KAAK;AACxB,QAAI,MAAM,KAAKoG,OAAMC,QAAO;AAC5B,QAAI,KAAK,IAAI,QAAQrG,EAAC;AACtB,QAAI,KAAK,IAAI,QAAQ,GAAG,KAAK,CAAC;AAC9B,QAAI,IAAI;AAER,QAAI,MAAM,KAAK,KAAK,GAAG;AACrB,UAAGA,OAAI,GAAG;AACR,eAAO,CAAC,IAAI,EAAE;AAAA,MACpB;AACI,aAAO,CAAA;AACP,MAAAoG,QAAO,IAAI;AAEX,aAAO,KAAK,KAAK,CAAC,QAAQ;AACxB,YAAI,KAAK,IAAI;AACX,eAAK,KAAK,CAAC;AACX,eAAK,IAAI,QAAQpG,IAAG,IAAI,CAAC;AAAA,QACjC,WAAiB,KAAK,UAAU,GAAG;AAC3B,mBAAS,CAAE,KAAK,IAAG,GAAI,EAAE;AAAA,QACjC,OAAa;AACL,gBAAM,KAAK,IAAG;AACd,cAAI,MAAMoG,OAAM;AACd,YAAAA,QAAO;AACP,YAAAC,SAAQ;AAAA,UAClB;AAEQ,eAAK,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,QACjC;AAEM,YAAI,KAAK,MAAM,MAAM,IAAI,KAAK;AAAA,MACpC;AAEI,UAAI,KAAK,QAAQ;AACf,iBAAS,CAAED,OAAMC,MAAK;AAAA,MAC5B;AAAA,IACA;AAEE,WAAO;AAAA,EACT;;;;;;;;AC7DA,MAAIC,aAAYlF,iBAAA;AAChB,MAAI,WAAWb,qBAAA;AAEf,mBAAiB;AAEjB,MAAI,WAAW,YAAU,KAAK,OAAM,IAAG;AACvC,MAAI,UAAU,WAAS,KAAK,OAAM,IAAG;AACrC,MAAI,WAAW,YAAU,KAAK,OAAM,IAAG;AACvC,MAAI,WAAW,YAAU,KAAK,OAAM,IAAG;AACvC,MAAI,YAAY,aAAW,KAAK,OAAM,IAAG;AAEzC,WAAS,QAAQ,KAAK;AACpB,WAAO,SAAS,KAAK,EAAE,KAAK,MACxB,SAAS,KAAK,EAAE,IAChB,IAAI,WAAW,CAAC;AAAA,EACtB;AAEA,WAAS,aAAa,KAAK;AACzB,WAAO,IAAI,MAAM,MAAM,EAAE,KAAK,QAAQ,EAC3B,MAAM,KAAK,EAAE,KAAK,OAAO,EACzB,MAAM,KAAK,EAAE,KAAK,QAAQ,EAC1B,MAAM,KAAK,EAAE,KAAK,QAAQ,EAC1B,MAAM,KAAK,EAAE,KAAK,SAAS;AAAA,EACxC;AAEA,WAAS,eAAe,KAAK;AAC3B,WAAO,IAAI,MAAM,QAAQ,EAAE,KAAK,IAAI,EACzB,MAAM,OAAO,EAAE,KAAK,GAAG,EACvB,MAAM,QAAQ,EAAE,KAAK,GAAG,EACxB,MAAM,QAAQ,EAAE,KAAK,GAAG,EACxB,MAAM,SAAS,EAAE,KAAK,GAAG;AAAA,EACtC;AAMA,WAAS,gBAAgB,KAAK;AAC5B,QAAI,CAAC;AACH,aAAO,CAAC,EAAE;AAEZ,QAAI,QAAQ,CAAA;AACZ,QAAI,IAAI,SAAS,KAAK,KAAK,GAAG;AAE9B,QAAI,CAAC;AACH,aAAO,IAAI,MAAM,GAAG;AAEtB,QAAI,MAAM,EAAE;AACZ,QAAI,OAAO,EAAE;AACb,QAAI,OAAO,EAAE;AACb,QAAI,IAAI,IAAI,MAAM,GAAG;AAErB,MAAE,EAAE,SAAO,CAAC,KAAK,MAAM,OAAO;AAC9B,QAAI,YAAY,gBAAgB,IAAI;AACpC,QAAI,KAAK,QAAQ;AACf,QAAE,EAAE,SAAO,CAAC,KAAK,UAAU,MAAK;AAChC,QAAE,KAAK,MAAM,GAAG,SAAS;AAAA,IAC7B;AAEE,UAAM,KAAK,MAAM,OAAO,CAAC;AAEzB,WAAO;AAAA,EACT;AAEA,WAAS,UAAU,KAAK;AACtB,QAAI,CAAC;AACH,aAAO,CAAA;AAQT,QAAI,IAAI,OAAO,GAAG,CAAC,MAAM,MAAM;AAC7B,YAAM,WAAW,IAAI,OAAO,CAAC;AAAA,IACjC;AAEE,WAAO,OAAO,aAAa,GAAG,GAAG,IAAI,EAAE,IAAI,cAAc;AAAA,EAC3D;AAEA,WAAS,SAAS,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,KAAK;AACpB,WAAO,MAAM,MAAM;AAAA,EACrB;AACA,WAAS,SAAS,IAAI;AACpB,WAAO,SAAS,KAAK,EAAE;AAAA,EACzB;AAEA,WAAS,IAAI,GAAG,GAAG;AACjB,WAAO,KAAK;AAAA,EACd;AACA,WAAS,IAAI,GAAG,GAAG;AACjB,WAAO,KAAK;AAAA,EACd;AAEA,WAAS,OAAO,KAAK,OAAO;AAC1B,QAAI,aAAa,CAAA;AAEjB,QAAI,IAAI,SAAS,KAAK,KAAK,GAAG;AAC9B,QAAI,CAAC,KAAK,MAAM,KAAK,EAAE,GAAG,EAAG,QAAO,CAAC,GAAG;AAExC,QAAI,oBAAoB,iCAAiC,KAAK,EAAE,IAAI;AACpE,QAAI,kBAAkB,uCAAuC,KAAK,EAAE,IAAI;AACxE,QAAI,aAAa,qBAAqB;AACtC,QAAI,YAAY,EAAE,KAAK,QAAQ,GAAG,KAAK;AACvC,QAAI,CAAC,cAAc,CAAC,WAAW;AAE7B,UAAI,EAAE,KAAK,MAAM,YAAY,GAAG;AAC9B,cAAM,EAAE,MAAM,MAAM,EAAE,OAAO,WAAW,EAAE;AAC1C,eAAO,OAAO,GAAG;AAAA,MACvB;AACI,aAAO,CAAC,GAAG;AAAA,IACf;AAEE,QAAI;AACJ,QAAI,YAAY;AACd,UAAI,EAAE,KAAK,MAAM,MAAM;AAAA,IAC3B,OAAS;AACL,UAAI,gBAAgB,EAAE,IAAI;AAC1B,UAAI,EAAE,WAAW,GAAG;AAElB,YAAI,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,OAAO;AACnC,YAAI,EAAE,WAAW,GAAG;AAClB,cAAI,OAAO,EAAE,KAAK,SACd,OAAO,EAAE,MAAM,KAAK,IACpB,CAAC,EAAE;AACP,iBAAO,KAAK,IAAI,SAAS,GAAG;AAC1B,mBAAO,EAAE,MAAM,EAAE,CAAC,IAAI;AAAA,UAChC,CAAS;AAAA,QACT;AAAA,MACA;AAAA,IACA;AAME,QAAI,MAAM,EAAE;AACZ,QAAI,OAAO,EAAE,KAAK,SACd,OAAO,EAAE,MAAM,KAAK,IACpB,CAAC,EAAE;AAEP,QAAI;AAEJ,QAAI,YAAY;AACd,UAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;AACpB,UAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;AACpB,UAAI,QAAQ,KAAK,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM;AAC7C,UAAI,OAAO,EAAE,UAAU,IACnB,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IACtB;AACJ,UAAI,OAAO;AACX,UAAI,UAAU,IAAI;AAClB,UAAI,SAAS;AACX,gBAAQ;AACR,eAAO;AAAA,MACb;AACI,UAAI,MAAM,EAAE,KAAK,QAAQ;AAEzB,UAAI,CAAA;AAEJ,eAAS,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,MAAM;AACrC,YAAIb;AACJ,YAAI,iBAAiB;AACnB,UAAAA,KAAI,OAAO,aAAa,CAAC;AACzB,cAAIA,OAAM;AACR,YAAAA,KAAI;AAAA,QACd,OAAa;AACL,UAAAA,KAAI,OAAO,CAAC;AACZ,cAAI,KAAK;AACP,gBAAI,OAAO,QAAQA,GAAE;AACrB,gBAAI,OAAO,GAAG;AACZ,kBAAI6G,KAAI,IAAI,MAAM,OAAO,CAAC,EAAE,KAAK,GAAG;AACpC,kBAAI,IAAI;AACN,gBAAA7G,KAAI,MAAM6G,KAAI7G,GAAE,MAAM,CAAC;AAAA;AAEvB,gBAAAA,KAAI6G,KAAI7G;AAAA,YACtB;AAAA,UACA;AAAA,QACA;AACM,UAAE,KAAKA,EAAC;AAAA,MACd;AAAA,IACA,OAAS;AACL,UAAI4G,WAAU,GAAG,SAAS,IAAI;AAAE,eAAO,OAAO,IAAI,KAAK;AAAA,MAAC,CAAE;AAAA,IAC9D;AAEE,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAI,YAAY,MAAM,EAAE,CAAC,IAAI,KAAK,CAAC;AACnC,YAAI,CAAC,SAAS,cAAc;AAC1B,qBAAW,KAAK,SAAS;AAAA,MACjC;AAAA,IACA;AAEE,WAAO;AAAA,EACT;;;;;;;;ACvMA,gBAAiB;AACjB,YAAU,YAAY;AAEtB,MAAIzG,QAAQ,WAAY;AAAE,QAAI;AAAE,aAAO,QAAQ,MAAM;AAAA,IAAC,SAAU,GAAG;AAAA,IAAA;AAAA,EAAE,EAAC,KAAO;AAAA,IAC3E,KAAK;AAAA;AAEP,YAAU,MAAMA,MAAK;AAErB,MAAI,WAAW,UAAU,WAAW,UAAU,WAAW,CAAA;AACzD,MAAI,SAASU,sBAAA;AAEb,MAAI,UAAU;AAAA,IACZ,KAAK,EAAE,MAAM,aAAa,OAAO,YAAW;AAAA,IAC5C,KAAK,EAAE,MAAM,OAAO,OAAO,KAAI;AAAA,IAC/B,KAAK,EAAE,MAAM,OAAO,OAAO,KAAI;AAAA,IAC/B,KAAK,EAAE,MAAM,OAAO,OAAO,KAAI;AAAA,IAC/B,KAAK,EAAE,MAAM,OAAO,OAAO,IAAG;AAAA;AAKhC,MAAI,QAAQ;AAGZ,MAAI,OAAO,QAAQ;AAKnB,MAAI,aAAa;AAIjB,MAAI,eAAe;AAGnB,MAAI,aAAa,QAAQ,iBAAiB;AAG1C,WAAS,QAAS,GAAG;AACnB,WAAO,EAAE,MAAM,EAAE,EAAE,OAAO,SAAU,KAAKb,IAAG;AAC1C,UAAIA,EAAC,IAAI;AACT,aAAO;AAAA,IACX,GAAK,CAAA,CAAE;AAAA,EACP;AAGA,MAAI,aAAa;AAEjB,YAAU,SAASS;AACnB,WAASA,QAAQ,SAAS,SAAS;AACjC,cAAU,WAAW,CAAA;AACrB,WAAO,SAAU,GAAG,GAAG,MAAM;AAC3B,aAAO,UAAU,GAAG,SAAS,OAAO;AAAA,IACxC;AAAA,EACA;AAEA,WAAS,IAAKH,IAAG,GAAG;AAClB,QAAI,KAAK,CAAA;AACT,QAAI,IAAI,CAAA;AACR,WAAO,KAAKA,EAAC,EAAE,QAAQ,SAAU,GAAG;AAClC,QAAE,CAAC,IAAIA,GAAE,CAAC;AAAA,IACd,CAAG;AACD,WAAO,KAAK,CAAC,EAAE,QAAQ,SAAU,GAAG;AAClC,QAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IACd,CAAG;AACD,WAAO;AAAA,EACT;AAEA,YAAU,WAAW,SAAU,KAAK;AAClC,QAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,KAAK,GAAG,EAAE,QAAQ;AAC/D,aAAO;AAAA,IACX;AAEE,QAAI,OAAO;AAEX,QAAI,IAAI,SAASwG,WAAW,GAAG,SAAS,SAAS;AAC/C,aAAO,KAAK,GAAG,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IAC7C;AAEE,MAAE,YAAY,SAASC,WAAW,SAAS,SAAS;AAClD,aAAO,IAAI,KAAK,UAAU,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IACxD;AACE,MAAE,UAAU,WAAW,SAAS,SAAU,SAAS;AACjD,aAAO,KAAK,SAAS,IAAI,KAAK,OAAO,CAAC,EAAE;AAAA,IAC5C;AAEE,MAAE,SAAS,SAAStG,QAAQ,SAAS,SAAS;AAC5C,aAAO,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IACjD;AAEE,MAAE,WAAW,SAAS,SAAU,SAAS;AACvC,aAAO,KAAK,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IAC1C;AAEE,MAAE,SAAS,SAASuG,QAAQ,SAAS,SAAS;AAC5C,aAAO,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IACjD;AAEE,MAAE,cAAc,SAASC,aAAa,SAAS,SAAS;AACtD,aAAO,KAAK,YAAY,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IACtD;AAEE,MAAE,QAAQ,SAAU,MAAM,SAAS,SAAS;AAC1C,aAAO,KAAK,MAAM,MAAM,SAAS,IAAI,KAAK,OAAO,CAAC;AAAA,IACtD;AAEE,WAAO;AAAA,EACT;AAEA,YAAU,WAAW,SAAU,KAAK;AAClC,WAAO,UAAU,SAAS,GAAG,EAAE;AAAA,EACjC;AAEA,WAAS,UAAW,GAAG,SAAS,SAAS;AACvC,uBAAmB,OAAO;AAE1B,QAAI,CAAC,QAAS,WAAU,CAAA;AAGxB,QAAI,CAAC,QAAQ,aAAa,QAAQ,OAAO,CAAC,MAAM,KAAK;AACnD,aAAO;AAAA,IACX;AAEE,WAAO,IAAI,UAAU,SAAS,OAAO,EAAE,MAAM,CAAC;AAAA,EAChD;AAEA,WAAS,UAAW,SAAS,SAAS;AACpC,QAAI,EAAE,gBAAgB,YAAY;AAChC,aAAO,IAAI,UAAU,SAAS,OAAO;AAAA,IACzC;AAEE,uBAAmB,OAAO;AAE1B,QAAI,CAAC,QAAS,WAAU,CAAA;AAExB,cAAU,QAAQ,KAAI;AAGtB,QAAI,CAAC,QAAQ,sBAAsB9G,MAAK,QAAQ,KAAK;AACnD,gBAAU,QAAQ,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AAAA,IAC9C;AAEE,SAAK,UAAU;AACf,SAAK,MAAM,CAAA;AACX,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,UAAU,CAAC,CAAC,QAAQ;AAGzB,SAAK,KAAI;AAAA,EACX;AAEA,YAAU,UAAU,QAAQ,WAAY;AAAA,EAAA;AAExC,YAAU,UAAU,OAAO;AAC3B,WAAS,OAAQ;AACf,QAAI,UAAU,KAAK;AACnB,QAAI,UAAU,KAAK;AAGnB,QAAI,CAAC,QAAQ,aAAa,QAAQ,OAAO,CAAC,MAAM,KAAK;AACnD,WAAK,UAAU;AACf;AAAA,IACJ;AACE,QAAI,CAAC,SAAS;AACZ,WAAK,QAAQ;AACb;AAAA,IACJ;AAGE,SAAK,YAAW;AAGhB,QAAI,MAAM,KAAK,UAAU,KAAK,YAAW;AAEzC,QAAI,QAAQ,MAAO,MAAK,QAAQ,SAAS,QAAQ;AAAE,cAAQ,MAAM,MAAM,SAAS,SAAS;AAAA,IAAC;AAE1F,SAAK,MAAM,KAAK,SAAS,GAAG;AAO5B,UAAM,KAAK,YAAY,IAAI,IAAI,SAAU,GAAG;AAC1C,aAAO,EAAE,MAAM,UAAU;AAAA,IAC7B,CAAG;AAED,SAAK,MAAM,KAAK,SAAS,GAAG;AAG5B,UAAM,IAAI,IAAI,SAAU,GAAG,IAAI+G,MAAK;AAClC,aAAO,EAAE,IAAI,KAAK,OAAO,IAAI;AAAA,IACjC,GAAK,IAAI;AAEP,SAAK,MAAM,KAAK,SAAS,GAAG;AAG5B,UAAM,IAAI,OAAO,SAAU,GAAG;AAC5B,aAAO,EAAE,QAAQ,KAAK,MAAM;AAAA,IAChC,CAAG;AAED,SAAK,MAAM,KAAK,SAAS,GAAG;AAE5B,SAAK,MAAM;AAAA,EACb;AAEA,YAAU,UAAU,cAAc;AAClC,WAAS,cAAe;AACtB,QAAI,UAAU,KAAK;AACnB,QAAI,SAAS;AACb,QAAI,UAAU,KAAK;AACnB,QAAI,eAAe;AAEnB,QAAI,QAAQ,SAAU;AAEtB,aAAS,IAAI,GAAG,IAAI,QAAQ,QACxB,IAAI,KAAK,QAAQ,OAAO,CAAC,MAAM,KAC/B,KAAK;AACP,eAAS,CAAC;AACV;AAAA,IACJ;AAEE,QAAI,aAAc,MAAK,UAAU,QAAQ,OAAO,YAAY;AAC5D,SAAK,SAAS;AAAA,EAChB;AAYA,YAAU,cAAc,SAAU,SAAS,SAAS;AAClD,WAAO,YAAY,SAAS,OAAO;AAAA,EACrC;AAEA,YAAU,UAAU,cAAc;AAElC,WAAS,YAAa,SAAS,SAAS;AACtC,QAAI,CAAC,SAAS;AACZ,UAAI,gBAAgB,WAAW;AAC7B,kBAAU,KAAK;AAAA,MACrB,OAAW;AACL,kBAAU,CAAA;AAAA,MAChB;AAAA,IACA;AAEE,cAAU,OAAO,YAAY,cACzB,KAAK,UAAU;AAEnB,uBAAmB,OAAO;AAI1B,QAAI,QAAQ,WAAW,CAAC,mBAAmB,KAAK,OAAO,GAAG;AAExD,aAAO,CAAC,OAAO;AAAA,IACnB;AAEE,WAAO,OAAO,OAAO;AAAA,EACvB;AAEA,MAAI,qBAAqB,OAAO;AAChC,MAAI,qBAAqB,SAAU,SAAS;AAC1C,QAAI,OAAO,YAAY,UAAU;AAC/B,YAAM,IAAI,UAAU,iBAAiB;AAAA,IACzC;AAEE,QAAI,QAAQ,SAAS,oBAAoB;AACvC,YAAM,IAAI,UAAU,qBAAqB;AAAA,IAC7C;AAAA,EACA;AAaA,YAAU,UAAU,QAAQ;AAC5B,MAAI,WAAW,CAAA;AACf,WAAS,MAAO,SAAS,OAAO;AAC9B,uBAAmB,OAAO;AAE1B,QAAI,UAAU,KAAK;AAGnB,QAAI,YAAY,MAAM;AACpB,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA;AAEP,kBAAU;AAAA,IAChB;AACE,QAAI,YAAY,GAAI,QAAO;AAE3B,QAAIC,MAAK;AACT,QAAI,WAAW,CAAC,CAAC,QAAQ;AACzB,QAAI,WAAW;AAEf,QAAI,mBAAmB,CAAA;AACvB,QAAI,gBAAgB,CAAA;AACpB,QAAI;AACJ,QAAI,UAAU;AACd,QAAI,eAAe;AACnB,QAAI,aAAa;AAGjB,QAAI,eAAe,QAAQ,OAAO,CAAC,MAAM,MAAM,KAE7C,QAAQ,MAAM,mCACd;AACF,QAAI,OAAO;AAEX,aAAS,iBAAkB;AACzB,UAAI,WAAW;AAGb,gBAAQ,WAAS;AAAA,UACf,KAAK;AACH,YAAAA,OAAM;AACN,uBAAW;AACb;AAAA,UACA,KAAK;AACH,YAAAA,OAAM;AACN,uBAAW;AACb;AAAA,UACA;AACE,YAAAA,OAAM,OAAO;AACf;AAAA;AAEF,aAAK,MAAM,wBAAwB,WAAWA,GAAE;AAChD,oBAAY;AAAA,MAClB;AAAA,IACA;AAEE,aAAS,IAAI,GAAG,MAAM,QAAQ,QAAQnH,IACjC,IAAI,QAASA,KAAI,QAAQ,OAAO,CAAC,IAClC,KAAK;AACP,WAAK,MAAM,eAAgB,SAAS,GAAGmH,KAAInH,EAAC;AAG5C,UAAI,YAAY,WAAWA,EAAC,GAAG;AAC7B,QAAAmH,OAAM,OAAOnH;AACb,mBAAW;AACX;AAAA,MACN;AAEI,cAAQA,IAAC;AAAA,QAEP,KAAK,KAAK;AAGR,iBAAO;AAAA,QACf;AAAA,QAEM,KAAK;AACH,yBAAc;AACd,qBAAW;AACb;AAAA,QAIA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,eAAK,MAAM,6BAA8B,SAAS,GAAGmH,KAAInH,EAAC;AAI1D,cAAI,SAAS;AACX,iBAAK,MAAM,YAAY;AACvB,gBAAIA,OAAM,OAAO,MAAM,aAAa,EAAG,CAAAA,KAAI;AAC3C,YAAAmH,OAAMnH;AACN;AAAA,UACV;AAKQ,eAAK,MAAM,0BAA0B,SAAS;AAC9C,yBAAc;AACd,sBAAYA;AAIZ,cAAI,QAAQ,MAAO,gBAAc;AACnC;AAAA,QAEA,KAAK;AACH,cAAI,SAAS;AACX,YAAAmH,OAAM;AACN;AAAA,UACV;AAEQ,cAAI,CAAC,WAAW;AACd,YAAAA,OAAM;AACN;AAAA,UACV;AAEQ,2BAAiB,KAAK;AAAA,YACpB,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,YACX,SAASA,IAAG;AAAA,YACZ,MAAM,QAAQ,SAAS,EAAE;AAAA,YACzB,OAAO,QAAQ,SAAS,EAAE;AAAA,UACpC,CAAS;AAED,UAAAA,OAAM,cAAc,MAAM,cAAc;AACxC,eAAK,MAAM,gBAAgB,WAAWA,GAAE;AACxC,sBAAY;AACd;AAAA,QAEA,KAAK;AACH,cAAI,WAAW,CAAC,iBAAiB,QAAQ;AACvC,YAAAA,OAAM;AACN;AAAA,UACV;AAEQ,yBAAc;AACd,qBAAW;AACX,cAAI,KAAK,iBAAiB,IAAG;AAG7B,UAAAA,OAAM,GAAG;AACT,cAAI,GAAG,SAAS,KAAK;AACnB,0BAAc,KAAK,EAAE;AAAA,UAC/B;AACQ,aAAG,QAAQA,IAAG;AAChB;AAAA,QAEA,KAAK;AACH,cAAI,WAAW,CAAC,iBAAiB,UAAU,UAAU;AACnD,YAAAA,OAAM;AACN,uBAAW;AACX;AAAA,UACV;AAEQ,yBAAc;AACd,UAAAA,OAAM;AACR;AAAA,QAGA,KAAK;AAEH,yBAAc;AAEd,cAAI,SAAS;AACX,YAAAA,OAAM,OAAOnH;AACb;AAAA,UACV;AAEQ,oBAAU;AACV,uBAAa;AACb,yBAAemH,IAAG;AAClB,UAAAA,OAAMnH;AACR;AAAA,QAEA,KAAK;AAKH,cAAI,MAAM,aAAa,KAAK,CAAC,SAAS;AACpC,YAAAmH,OAAM,OAAOnH;AACb,uBAAW;AACX;AAAA,UACV;AAWQ,cAAI,KAAK,QAAQ,UAAU,aAAa,GAAG,CAAC;AAC5C,cAAI;AACF,mBAAO,MAAM,KAAK,GAAG;AAAA,UAC/B,SAAiB,IAAI;AAEX,gBAAI,KAAK,KAAK,MAAM,IAAI,QAAQ;AAChC,YAAAmH,MAAKA,IAAG,OAAO,GAAG,YAAY,IAAI,QAAQ,GAAG,CAAC,IAAI;AAClD,uBAAW,YAAY,GAAG,CAAC;AAC3B,sBAAU;AACV;AAAA,UACV;AAGQ,qBAAW;AACX,oBAAU;AACV,UAAAA,OAAMnH;AACR;AAAA,QAEA;AAEE,yBAAc;AAEd,cAAI,UAAU;AAEZ,uBAAW;AAAA,UACrB,WAAmB,WAAWA,EAAC,KAClB,EAAEA,OAAM,OAAO,UAAU;AAC5B,YAAAmH,OAAM;AAAA,UAChB;AAEQ,UAAAA,OAAMnH;AAAA;IAGd;AAIE,QAAI,SAAS;AAKX,WAAK,QAAQ,OAAO,aAAa,CAAC;AAClC,WAAK,KAAK,MAAM,IAAI,QAAQ;AAC5B,MAAAmH,MAAKA,IAAG,OAAO,GAAG,YAAY,IAAI,QAAQ,GAAG,CAAC;AAC9C,iBAAW,YAAY,GAAG,CAAC;AAAA,IAC/B;AAQE,SAAK,KAAK,iBAAiB,IAAG,GAAI,IAAI,KAAK,iBAAiB,OAAO;AACjE,UAAI,OAAOA,IAAG,MAAM,GAAG,UAAU,GAAG,KAAK,MAAM;AAC/C,WAAK,MAAM,gBAAgBA,KAAI,EAAE;AAEjC,aAAO,KAAK,QAAQ,6BAA6B,SAAU,GAAG,IAAI,IAAI;AACpE,YAAI,CAAC,IAAI;AAEP,eAAK;AAAA,QACb;AAQM,eAAO,KAAK,KAAK,KAAK;AAAA,MAC5B,CAAK;AAED,WAAK,MAAM,kBAAkB,MAAM,MAAM,IAAIA,GAAE;AAC/C,UAAI,IAAI,GAAG,SAAS,MAAM,OACtB,GAAG,SAAS,MAAM,QAClB,OAAO,GAAG;AAEd,iBAAW;AACX,MAAAA,MAAKA,IAAG,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,QAAQ;AAAA,IAC/C;AAGE,mBAAc;AACd,QAAI,UAAU;AAEZ,MAAAA,OAAM;AAAA,IACV;AAIE,QAAI,kBAAkB;AACtB,YAAQA,IAAG,OAAO,CAAC,GAAC;AAAA,MAClB,KAAK;AAAA,MAAK,KAAK;AAAA,MAAK,KAAK;AAAK,0BAAkB;AAAA;AAQlD,aAAS,IAAI,cAAc,SAAS,GAAG,IAAI,IAAI,KAAK;AAClD,UAAI,KAAK,cAAc,CAAC;AAExB,UAAI,WAAWA,IAAG,MAAM,GAAG,GAAG,OAAO;AACrC,UAAI,UAAUA,IAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC/C,UAAI,SAASA,IAAG,MAAM,GAAG,QAAQ,GAAG,GAAG,KAAK;AAC5C,UAAI,UAAUA,IAAG,MAAM,GAAG,KAAK;AAE/B,gBAAU;AAKV,UAAI,mBAAmB,SAAS,MAAM,GAAG,EAAE,SAAS;AACpD,UAAI,aAAa;AACjB,WAAK,IAAI,GAAG,IAAI,kBAAkB,KAAK;AACrC,qBAAa,WAAW,QAAQ,YAAY,EAAE;AAAA,MACpD;AACI,gBAAU;AAEV,UAAI,SAAS;AACb,UAAI,YAAY,MAAM,UAAU,UAAU;AACxC,iBAAS;AAAA,MACf;AACI,UAAI,QAAQ,WAAW,UAAU,UAAU,SAAS;AACpD,MAAAA,MAAK;AAAA,IACT;AAKE,QAAIA,QAAO,MAAM,UAAU;AACzB,MAAAA,MAAK,UAAUA;AAAA,IACnB;AAEE,QAAI,iBAAiB;AACnB,MAAAA,MAAK,eAAeA;AAAA,IACxB;AAGE,QAAI,UAAU,UAAU;AACtB,aAAO,CAACA,KAAI,QAAQ;AAAA,IACxB;AAKE,QAAI,CAAC,UAAU;AACb,aAAO,aAAa,OAAO;AAAA,IAC/B;AAEE,QAAI,QAAQ,QAAQ,SAAS,MAAM;AACnC,QAAI;AACF,UAAI,SAAS,IAAI,OAAO,MAAMA,MAAK,KAAK,KAAK;AAAA,IACjD,SAAW,IAAsD;AAK7D,aAAO,IAAI,OAAO,IAAI;AAAA,IAC1B;AAEE,WAAO,QAAQ;AACf,WAAO,OAAOA;AAEd,WAAO;AAAA,EACT;AAEA,YAAU,SAAS,SAAU,SAAS,SAAS;AAC7C,WAAO,IAAI,UAAU,SAAS,WAAW,CAAA,CAAE,EAAE,OAAM;AAAA,EACrD;AAEA,YAAU,UAAU,SAAS;AAC7B,WAAS,SAAU;AACjB,QAAI,KAAK,UAAU,KAAK,WAAW,MAAO,QAAO,KAAK;AAQtD,QAAI,MAAM,KAAK;AAEf,QAAI,CAAC,IAAI,QAAQ;AACf,WAAK,SAAS;AACd,aAAO,KAAK;AAAA,IAChB;AACE,QAAI,UAAU,KAAK;AAEnB,QAAI,UAAU,QAAQ,aAAa,OAC/B,QAAQ,MAAM,aACd;AACJ,QAAI,QAAQ,QAAQ,SAAS,MAAM;AAEnC,QAAIA,MAAK,IAAI,IAAI,SAAU,SAAS;AAClC,aAAO,QAAQ,IAAI,SAAU,GAAG;AAC9B,eAAQ,MAAM,WAAY,UACvB,OAAO,MAAM,WAAY,aAAa,CAAC,IACxC,EAAE;AAAA,MACV,CAAK,EAAE,KAAK,KAAM;AAAA,IAClB,CAAG,EAAE,KAAK,GAAG;AAIX,IAAAA,MAAK,SAASA,MAAK;AAGnB,QAAI,KAAK,OAAQ,CAAAA,MAAK,SAASA,MAAK;AAEpC,QAAI;AACF,WAAK,SAAS,IAAI,OAAOA,KAAI,KAAK;AAAA,IACtC,SAAW,IAAsD;AAC7D,WAAK,SAAS;AAAA,IAClB;AACE,WAAO,KAAK;AAAA,EACd;AAEA,YAAU,QAAQ,SAAU,MAAM,SAAS,SAAS;AAClD,cAAU,WAAW,CAAA;AACrB,QAAI,KAAK,IAAI,UAAU,SAAS,OAAO;AACvC,WAAO,KAAK,OAAO,SAAU,GAAG;AAC9B,aAAO,GAAG,MAAM,CAAC;AAAA,IACrB,CAAG;AACD,QAAI,GAAG,QAAQ,UAAU,CAAC,KAAK,QAAQ;AACrC,WAAK,KAAK,OAAO;AAAA,IACrB;AACE,WAAO;AAAA,EACT;AAEA,YAAU,UAAU,QAAQ,SAAS,MAAO,GAAG,SAAS;AACtD,QAAI,OAAO,YAAY,YAAa,WAAU,KAAK;AACnD,SAAK,MAAM,SAAS,GAAG,KAAK,OAAO;AAGnC,QAAI,KAAK,QAAS,QAAO;AACzB,QAAI,KAAK,MAAO,QAAO,MAAM;AAE7B,QAAI,MAAM,OAAO,QAAS,QAAO;AAEjC,QAAI,UAAU,KAAK;AAGnB,QAAIhH,MAAK,QAAQ,KAAK;AACpB,UAAI,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AAAA,IAClC;AAGE,QAAI,EAAE,MAAM,UAAU;AACtB,SAAK,MAAM,KAAK,SAAS,SAAS,CAAC;AAOnC,QAAI,MAAM,KAAK;AACf,SAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AAGnC,QAAI;AACJ,QAAI;AACJ,SAAK,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,KAAK;AAClC,iBAAW,EAAE,CAAC;AACd,UAAI,SAAU;AAAA,IAClB;AAEE,SAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAC/B,UAAI,UAAU,IAAI,CAAC;AACnB,UAAI,OAAO;AACX,UAAI,QAAQ,aAAa,QAAQ,WAAW,GAAG;AAC7C,eAAO,CAAC,QAAQ;AAAA,MACtB;AACI,UAAI,MAAM,KAAK,SAAS,MAAM,SAAS,OAAO;AAC9C,UAAI,KAAK;AACP,YAAI,QAAQ,WAAY,QAAO;AAC/B,eAAO,CAAC,KAAK;AAAA,MACnB;AAAA,IACA;AAIE,QAAI,QAAQ,WAAY,QAAO;AAC/B,WAAO,KAAK;AAAA,EACd;AAOA,YAAU,UAAU,WAAW,SAAU,MAAM,SAAS,SAAS;AAC/D,QAAI,UAAU,KAAK;AAEnB,SAAK;AAAA,MAAM;AAAA,MACT,EAAE,QAAQ,MAAM,MAAY,QAAgB;AAAA,IAAE;AAEhD,SAAK,MAAM,YAAY,KAAK,QAAQ,QAAQ,MAAM;AAElD,aAAS,KAAK,GACV,KAAK,GACL,KAAK,KAAK,QACV,KAAK,QAAQ,QACV,KAAK,MAAQ,KAAK,IACnB,MAAM,MAAM;AAChB,WAAK,MAAM,eAAe;AAC1B,UAAI,IAAI,QAAQ,EAAE;AAClB,UAAI,IAAI,KAAK,EAAE;AAEf,WAAK,MAAM,SAAS,GAAG,CAAC;AAKxB,UAAI,MAAM,MAAO,QAAO;AAExB,UAAI,MAAM,UAAU;AAClB,aAAK,MAAM,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;AAwBtC,YAAI,KAAK;AACT,YAAI,KAAK,KAAK;AACd,YAAI,OAAO,IAAI;AACb,eAAK,MAAM,eAAe;AAO1B,iBAAO,KAAK,IAAI,MAAM;AACpB,gBAAI,KAAK,EAAE,MAAM,OAAO,KAAK,EAAE,MAAM,QAClC,CAAC,QAAQ,OAAO,KAAK,EAAE,EAAE,OAAO,CAAC,MAAM,IAAM,QAAO;AAAA,UACjE;AACQ,iBAAO;AAAA,QACf;AAGM,eAAO,KAAK,IAAI;AACd,cAAI,YAAY,KAAK,EAAE;AAEvB,eAAK,MAAM,oBAAoB,MAAM,IAAI,SAAS,IAAI,SAAS;AAG/D,cAAI,KAAK,SAAS,KAAK,MAAM,EAAE,GAAG,QAAQ,MAAM,EAAE,GAAG,OAAO,GAAG;AAC7D,iBAAK,MAAM,yBAAyB,IAAI,IAAI,SAAS;AAErD,mBAAO;AAAA,UACjB,OAAe;AAGL,gBAAI,cAAc,OAAO,cAAc,QACpC,CAAC,QAAQ,OAAO,UAAU,OAAO,CAAC,MAAM,KAAM;AAC/C,mBAAK,MAAM,iBAAiB,MAAM,IAAI,SAAS,EAAE;AACjD;AAAA,YACZ;AAGU,iBAAK,MAAM,0CAA0C;AACrD;AAAA,UACV;AAAA,QACA;AAMM,YAAI,SAAS;AAEX,eAAK,MAAM,4BAA4B,MAAM,IAAI,SAAS,EAAE;AAC5D,cAAI,OAAO,GAAI,QAAO;AAAA,QAC9B;AACM,eAAO;AAAA,MACb;AAKI,UAAI;AACJ,UAAI,OAAO,MAAM,UAAU;AACzB,cAAM,MAAM;AACZ,aAAK,MAAM,gBAAgB,GAAG,GAAG,GAAG;AAAA,MAC1C,OAAW;AACL,cAAM,EAAE,MAAM,CAAC;AACf,aAAK,MAAM,iBAAiB,GAAG,GAAG,GAAG;AAAA,MAC3C;AAEI,UAAI,CAAC,IAAK,QAAO;AAAA,IACrB;AAcE,QAAI,OAAO,MAAM,OAAO,IAAI;AAG1B,aAAO;AAAA,IACX,WAAa,OAAO,IAAI;AAIpB,aAAO;AAAA,IACX,WAAwC,OAAO,IAAI;AAK/C,aAAQ,OAAO,KAAK,KAAO,KAAK,EAAE,MAAM;AAAA,IAC5C;AAIE,UAAM,IAAI,MAAM,MAAM;AAAA,EACxB;AAGA,WAAS,aAAc,GAAG;AACxB,WAAO,EAAE,QAAQ,UAAU,IAAI;AAAA,EACjC;AAEA,WAAS,aAAc,GAAG;AACxB,WAAO,EAAE,QAAQ,4BAA4B,MAAM;AAAA,EACrD;;;;;;;;;ACl7BA;AAEA,WAAS,MAAMA,OAAM;AACpB,WAAOA,MAAK,OAAO,CAAC,MAAM;AAAA,EAC3B;AAEA,WAAS,MAAMA,OAAM;AAEpB,QAAI,gBAAgB;AACpB,QAAI,SAAS,cAAc,KAAKA,KAAI;AACpC,QAAI,SAAS,OAAO,CAAC,KAAK;AAC1B,QAAI,QAAQ,QAAQ,UAAU,OAAO,OAAO,CAAC,MAAM,GAAG;AAGtD,WAAO,QAAQ,OAAO,CAAC,KAAK,KAAK;AAAA,EAClC;AAEAiH,mBAAA,UAAiB,QAAQ,aAAa,UAAU,QAAQ;AACxDA,mBAAA,QAAA,QAAuB;AACvBA,mBAAA,QAAA,QAAuB;;;;;;;;ACnBvB,SAAA,UAAkB;AAClB,SAAA,UAAkB;AAClB,SAAA,UAAkB;AAClB,SAAA,SAAiB;AACjB,SAAA,OAAe;AACf,SAAA,YAAoB;AACpB,SAAA,kBAA0B;AAE1B,WAAS,QAAS,KAAK,OAAO;AAC5B,WAAO,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK;AAAA,EACxD;AAEA,MAAIxG,OAAKc;AACT,MAAIvB,QAAOU;AACX,MAAI,YAAYC,iBAAA;AAChB,MAAI,aAAaM,sBAAA;AACjB,MAAI,YAAY,UAAU;AAE1B,WAAS,UAAWd,IAAG,GAAG;AACxB,WAAOA,GAAE,cAAc,GAAG,IAAI;AAAA,EAChC;AAEA,WAAS,aAAc,MAAM,SAAS;AACpC,SAAK,SAAS,QAAQ,UAAU,CAAA;AAEhC,QAAI,CAAC,MAAM,QAAQ,KAAK,MAAM;AAC5B,WAAK,SAAS,CAAC,KAAK,MAAM;AAE5B,QAAI,KAAK,OAAO,QAAQ;AACtB,WAAK,SAAS,KAAK,OAAO,IAAI,SAAS;AAAA,IAC3C;AAAA,EACA;AAGA,WAAS,UAAW,SAAS;AAC3B,QAAI,WAAW;AACf,QAAI,QAAQ,MAAM,EAAE,MAAM,OAAO;AAC/B,UAAI,WAAW,QAAQ,QAAQ,cAAc,EAAE;AAC/C,iBAAW,IAAI,UAAU,UAAU,EAAE,KAAK,KAAI,CAAE;AAAA,IACpD;AAEE,WAAO;AAAA,MACL,SAAS,IAAI,UAAU,SAAS,EAAE,KAAK,KAAI,CAAE;AAAA,MAC7C;AAAA;EAEJ;AAEA,WAAS,QAAS,MAAM,SAAS,SAAS;AACxC,QAAI,CAAC;AACH,gBAAU,CAAA;AAGZ,QAAI,QAAQ,aAAa,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACpD,UAAI,QAAQ,YAAY;AACtB,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACvD;AACI,gBAAU,QAAQ;AAAA,IACtB;AAEE,SAAK,SAAS,CAAC,CAAC,QAAQ;AACxB,SAAK,UAAU;AACf,SAAK,SAAS,QAAQ,WAAW;AACjC,SAAK,WAAW,CAAC,CAAC,QAAQ;AAC1B,SAAK,gBAAgB,QAAQ,iBAAiB,uBAAO,OAAO,IAAI;AAChE,SAAK,SAAS,CAAC,CAAC,QAAQ;AACxB,SAAK,MAAM,CAAC,CAAC,QAAQ;AACrB,SAAK,OAAO,CAAC,CAAC,QAAQ;AACtB,SAAK,QAAQ,CAAC,CAAC,QAAQ;AACvB,QAAI,KAAK;AACP,WAAK,OAAO;AACd,SAAK,OAAO,CAAC,CAAC,QAAQ;AACtB,SAAK,WAAW,CAAC,CAAC,QAAQ;AAC1B,SAAK,SAAS,CAAC,CAAC,QAAQ;AACxB,SAAK,SAAS,CAAC,CAAC,QAAQ;AACxB,SAAK,SAAS,CAAC,CAAC,QAAQ;AACxB,SAAK,OAAO,CAAC,CAAC,QAAQ;AACtB,SAAK,YAAY,CAAC,CAAC,QAAQ;AAC3B,SAAK,WAAW,CAAC,CAAC,QAAQ;AAC1B,SAAK,KAAK,QAAQ,MAAMM;AAExB,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,QAAQ,QAAQ,SAAS,uBAAO,OAAO,IAAI;AAChD,SAAK,YAAY,QAAQ,aAAa,uBAAO,OAAO,IAAI;AACxD,SAAK,WAAW,QAAQ,YAAY,uBAAO,OAAO,IAAI;AAEtD,iBAAa,MAAM,OAAO;AAE1B,SAAK,aAAa;AAClB,QAAI,MAAM,QAAQ,IAAG;AACrB,QAAI,CAAC,QAAQ,SAAS,KAAK;AACzB,WAAK,MAAM;AAAA,SACR;AACH,WAAK,MAAMT,MAAK,QAAQ,QAAQ,GAAG;AACnC,WAAK,aAAa,KAAK,QAAQ;AAAA,IACnC;AAEE,SAAK,OAAO,QAAQ,QAAQA,MAAK,QAAQ,KAAK,KAAK,GAAG;AACtD,SAAK,OAAOA,MAAK,QAAQ,KAAK,IAAI;AAClC,QAAI,QAAQ,aAAa;AACvB,WAAK,OAAO,KAAK,KAAK,QAAQ,OAAO,GAAG;AAI1C,SAAK,SAAS,WAAW,KAAK,GAAG,IAAI,KAAK,MAAM,QAAQ,MAAM,KAAK,GAAG;AACtE,QAAI,QAAQ,aAAa;AACvB,WAAK,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC9C,SAAK,UAAU,CAAC,CAAC,QAAQ;AAIzB,YAAQ,WAAW;AACnB,YAAQ,YAAY;AAEpB,YAAQ,qBAAqB;AAE7B,SAAK,YAAY,IAAI,UAAU,SAAS,OAAO;AAC/C,SAAK,UAAU,KAAK,UAAU;AAAA,EAChC;AAEA,WAAS,OAAQ,MAAM;AACrB,QAAI,MAAM,KAAK;AACf,QAAI,MAAM,MAAM,CAAA,IAAK,uBAAO,OAAO,IAAI;AAEvC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,IAAI,GAAG,KAAM;AACpD,UAAI,UAAU,KAAK,QAAQ,CAAC;AAC5B,UAAI,CAAC,WAAW,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACjD,YAAI,KAAK,QAAQ;AAEf,cAAI,UAAU,KAAK,UAAU,QAAQ,CAAC;AACtC,cAAI;AACF,gBAAI,KAAK,OAAO;AAAA;AAEhB,gBAAI,OAAO,IAAI;AAAA,QACzB;AAAA,MACA,OAAW;AAEL,YAAI,IAAI,OAAO,KAAK,OAAO;AAC3B,YAAI;AACF,cAAI,KAAK,MAAM,KAAK,CAAC;AAAA;AAErB,YAAE,QAAQ,SAAUkH,IAAG;AACrB,gBAAIA,EAAC,IAAI;AAAA,UACnB,CAAS;AAAA,MACT;AAAA,IACA;AAEE,QAAI,CAAC;AACH,YAAM,OAAO,KAAK,GAAG;AAEvB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,KAAK,SAAS;AAG1B,QAAI,KAAK,MAAM;AACb,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,MAChC;AACI,UAAI,KAAK,OAAO;AACd,cAAM,IAAI,OAAO,SAAU,GAAG;AAC5B,cAAI,SAAS,CAAE,MAAM,KAAK,CAAC;AAC3B,cAAIrH,KAAI,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,QAAQ,MAAM,CAAC,CAAC;AACpD,cAAI,UAAUA;AACZ,qBAASA,OAAM,SAAS,CAAC,MAAM,QAAQA,EAAC;AAC1C,iBAAO;AAAA,QACf,CAAO;AAAA,MACP;AAAA,IACA;AAEE,QAAI,KAAK,OAAO;AACd,YAAM,IAAI,OAAO,SAASqH,IAAG;AAC3B,eAAO,CAAC,UAAU,MAAMA,EAAC;AAAA,MAC/B,CAAK;AAEH,SAAK,QAAQ;AAAA,EACf;AAEA,WAAS,KAAM,MAAM,GAAG;AACtB,QAAI,MAAM,QAAQ,MAAM,CAAC;AACzB,QAAIrH,KAAI,KAAK,MAAM,GAAG;AACtB,QAAI,IAAI;AACR,QAAIA,IAAG;AACL,UAAI,QAAQA,OAAM,SAAS,MAAM,QAAQA,EAAC;AAC1C,UAAI,QAAQ,EAAE,MAAM,EAAE,MAAM;AAE5B,UAAI,SAAS,CAAC;AACZ,aAAK;AAAA,eACE,CAAC,SAAS;AACjB,YAAI,EAAE,MAAM,GAAG,EAAE;AAEnB,UAAI,MAAM,GAAG;AACX,YAAI,OAAO,QAAQ,MAAM,CAAC;AAC1B,aAAK,UAAU,IAAI,IAAI,KAAK,UAAU,GAAG;AACzC,aAAK,MAAM,IAAI,IAAI,KAAK,MAAM,GAAG;AAAA,MACvC;AAAA,IACA;AAEE,WAAO;AAAA,EACT;AAGA,WAAS,QAAS,MAAM,GAAG;AACzB,QAAI,MAAM;AACV,QAAI,EAAE,OAAO,CAAC,MAAM,KAAK;AACvB,YAAMG,MAAK,KAAK,KAAK,MAAM,CAAC;AAAA,IAChC,WAAa,WAAW,CAAC,KAAK,MAAM,IAAI;AACpC,YAAM;AAAA,IACV,WAAa,KAAK,YAAY;AAC1B,YAAMA,MAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,IAClC,OAAS;AACL,YAAMA,MAAK,QAAQ,CAAC;AAAA,IACxB;AAEE,QAAI,QAAQ,aAAa;AACvB,YAAM,IAAI,QAAQ,OAAO,GAAG;AAE9B,WAAO;AAAA,EACT;AAKA,WAAS,UAAW,MAAMA,OAAM;AAC9B,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAET,WAAO,KAAK,OAAO,KAAK,SAAS,MAAM;AACrC,aAAO,KAAK,QAAQ,MAAMA,KAAI,KAAK,CAAC,EAAE,KAAK,YAAY,KAAK,SAAS,MAAMA,KAAI;AAAA,IACnF,CAAG;AAAA,EACH;AAEA,WAAS,gBAAiB,MAAMA,OAAM;AACpC,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAET,WAAO,KAAK,OAAO,KAAK,SAAS,MAAM;AACrC,aAAO,CAAC,EAAE,KAAK,YAAY,KAAK,SAAS,MAAMA,KAAI;AAAA,IACvD,CAAG;AAAA,EACH;;;;;;;;AC7OA,SAAiB;AACjB,WAAS,WAAW;AAEpB,MAAI,KAAKuB,mBAAA;AACT,MAAI,YAAYb,iBAAA;AAChB,MAAI,YAAY,UAAU;AAC1B,MAAI,OAAOC,cAAqB;AAChC,MAAIa,QAAOP;AACX,MAAIjB,QAAOa;AACX,MAAI,SAASE;AACb,MAAI,aAAa0E,sBAAA;AACjB,MAAI0B,UAASxB,cAAA;AACb,MAAI,UAAUwB,QAAO;AACrB,MAAI,UAAUA,QAAO;AACrB,MAAI,kBAAkBA,QAAO;AAC7B,MAAI,YAAYA,QAAO;AAEvB,WAAS,SAAU,SAAS,SAAS;AACnC,QAAI,OAAO,YAAY,cAAc,UAAU,WAAW;AACxD,YAAM,IAAI,UAAU,qFACqD;AAE3E,WAAO,IAAI,SAAS,SAAS,OAAO,EAAE;AAAA,EACxC;AAEA,WAAS,SAAU,SAAS,SAAS;AACnC,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,sBAAsB;AAExC,QAAI,OAAO,YAAY,cAAc,UAAU,WAAW;AACxD,YAAM,IAAI,UAAU,qFACqD;AAE3E,QAAI,EAAE,gBAAgB;AACpB,aAAO,IAAI,SAAS,SAAS,OAAO;AAEtC,YAAQ,MAAM,SAAS,OAAO;AAE9B,QAAI,KAAK;AACP,aAAO;AAET,QAAI,IAAI,KAAK,UAAU,IAAI;AAC3B,SAAK,UAAU,IAAI,MAAM,CAAC;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAM;AAC3B,WAAK,SAAS,KAAK,UAAU,IAAI,CAAC,GAAG,GAAG,KAAK;AAAA,IACjD;AACE,SAAK,QAAO;AAAA,EACd;AAEA,WAAS,UAAU,UAAU,WAAY;AACvC,WAAO,GAAG,gBAAgB,QAAQ;AAClC,QAAI,KAAK,UAAU;AACjB,UAAI,OAAO;AACX,WAAK,QAAQ,QAAQ,SAAU,UAAUlD,QAAO;AAC9C,YAAI,MAAM,KAAK,QAAQA,MAAK,IAAI,uBAAO,OAAO,IAAI;AAClD,iBAAS,KAAK,UAAU;AACtB,cAAI;AACF,gBAAI,KAAK,SAAS,CAAC;AACnB,gBAAI,OAAO,GAAG,aAAa,GAAG,KAAK,aAAa;AAChD,gBAAI,IAAI,IAAI;AAAA,UACtB,SAAiB,IAAI;AACX,gBAAI,GAAG,YAAY;AACjB,kBAAI,KAAK,SAAS,CAAC,CAAC,IAAI;AAAA;AAExB,oBAAM;AAAA,UAClB;AAAA,QACA;AAAA,MACA,CAAK;AAAA,IACL;AACE,IAAAkD,QAAO,OAAO,IAAI;AAAA,EACpB;AAGA,WAAS,UAAU,WAAW,SAAU,SAASlD,QAAO,YAAY;AAClE,WAAO,GAAG,gBAAgB,QAAQ;AAGlC,QAAI,IAAI;AACR,WAAO,OAAO,QAAQ,CAAC,MAAM,UAAU;AACrC;AAAA,IACJ;AAIE,QAAIgC;AACJ,YAAQ,GAAC;AAAA,MAEP,KAAK,QAAQ;AACX,aAAK,eAAe,QAAQ,KAAK,GAAG,GAAGhC,MAAK;AAC5C;AAAA,MAEF,KAAK;AAGH,QAAAgC,UAAS;AACT;AAAA,MAEF;AAIE,QAAAA,UAAS,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACrC;AAAA;AAGJ,QAAI,SAAS,QAAQ,MAAM,CAAC;AAG5B,QAAI;AACJ,QAAIA,YAAW;AACb,aAAO;AAAA,aACA,WAAWA,OAAM,KACtB,WAAW,QAAQ,IAAI,SAAU,GAAG;AAClC,aAAO,OAAO,MAAM,WAAW,IAAI;AAAA,IAC3C,CAAO,EAAE,KAAK,GAAG,CAAC,GAAG;AACjB,UAAI,CAACA,WAAU,CAAC,WAAWA,OAAM;AAC/B,QAAAA,UAAS,MAAMA;AACjB,aAAOA;AAAA,IACX;AACI,aAAOA;AAET,QAAI,MAAM,KAAK,SAAS,IAAI;AAG5B,QAAI,gBAAgB,MAAM,IAAI;AAC5B;AAEF,QAAI,aAAa,OAAO,CAAC,MAAM,UAAU;AACzC,QAAI;AACF,WAAK,iBAAiBA,SAAQ,MAAM,KAAK,QAAQhC,QAAO,UAAU;AAAA;AAElE,WAAK,gBAAgBgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,UAAU;AAAA,EACrE;AAGA,WAAS,UAAU,kBAAkB,SAAUgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY;AAC3F,QAAI,UAAU,KAAK,SAAS,KAAK,UAAU;AAG3C,QAAI,CAAC;AACH;AAIF,QAAI,KAAK,OAAO,CAAC;AACjB,QAAI,SAAS,CAAC,CAAC,KAAK,UAAU;AAC9B,QAAI,UAAU,GAAG;AACjB,QAAI,QAAQ,KAAK,OAAO,QAAQ,OAAO,CAAC,MAAM;AAE9C,QAAI,iBAAiB,CAAA;AACrB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,IAAI,QAAQ,CAAC;AACjB,UAAI,EAAE,OAAO,CAAC,MAAM,OAAO,OAAO;AAChC,YAAI;AACJ,YAAI,UAAU,CAACgC,SAAQ;AACrB,cAAI,CAAC,EAAE,MAAM,EAAE;AAAA,QACvB,OAAa;AACL,cAAI,EAAE,MAAM,EAAE;AAAA,QACtB;AACM,YAAI;AACF,yBAAe,KAAK,CAAC;AAAA,MAC7B;AAAA,IACA;AAEE,QAAI,MAAM,eAAe;AAEzB,QAAI,QAAQ;AACV;AAOF,QAAI,OAAO,WAAW,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AACnD,UAAI,CAAC,KAAK,QAAQhC,MAAK;AACrB,aAAK,QAAQA,MAAK,IAAI,uBAAO,OAAO,IAAI;AAE1C,eAAS,IAAI,GAAG,IAAI,KAAK,KAAM;AAC7B,YAAI,IAAI,eAAe,CAAC;AACxB,YAAIgC,SAAQ;AACV,cAAIA,QAAO,MAAM,EAAE,MAAM;AACvB,gBAAIA,UAAS,MAAM;AAAA;AAEnB,gBAAIA,UAAS;AAAA,QACvB;AAEM,YAAI,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,SAAS;AACxC,cAAIjG,MAAK,KAAK,KAAK,MAAM,CAAC;AAAA,QAClC;AACM,aAAK,WAAWiE,QAAO,CAAC;AAAA,MAC9B;AAEI;AAAA,IACJ;AAIE,WAAO,MAAK;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,KAAM;AAC7B,UAAI,IAAI,eAAe,CAAC;AACxB,UAAI;AACJ,UAAIgC;AACF,qBAAa,CAACA,SAAQ,CAAC;AAAA;AAEvB,qBAAa,CAAC,CAAC;AACjB,WAAK,SAAS,WAAW,OAAO,MAAM,GAAGhC,QAAO,UAAU;AAAA,IAC9D;AAAA,EACA;AAGA,WAAS,UAAU,aAAa,SAAUA,QAAO,GAAG;AAClD,QAAI,UAAU,MAAM,CAAC;AACnB;AAEF,QAAI,MAAM,KAAK,SAAS,CAAC;AAEzB,QAAI,KAAK;AACP,UAAI,KAAK,MAAM,CAAC;AAElB,QAAI,KAAK,UAAU;AACjB,UAAI;AAAA,IACR;AAEE,QAAI,KAAK,QAAQA,MAAK,EAAE,CAAC;AACvB;AAEF,QAAI,KAAK,OAAO;AACd,UAAIpE,KAAI,KAAK,MAAM,GAAG;AACtB,UAAIA,OAAM,SAAS,MAAM,QAAQA,EAAC;AAChC;AAAA,IACN;AAEE,SAAK,QAAQoE,MAAK,EAAE,CAAC,IAAI;AAEzB,QAAI,KAAK;AACP,WAAK,MAAM,CAAC;AAAA,EAChB;AAGA,WAAS,UAAU,qBAAqB,SAAU,KAAK;AAGrD,QAAI,KAAK;AACP,aAAO,KAAK,SAAS,KAAK,KAAK;AAEjC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,GAAG,UAAU,GAAG;AAAA,IACjC,SAAW,IAAI;AACX,UAAI,GAAG,SAAS,UAAU;AAExB,eAAO;AAAA,MACb;AAAA,IACA;AAEE,QAAI,QAAQ,SAAS,MAAM,eAAc;AACzC,SAAK,SAAS,GAAG,IAAI;AAIrB,QAAI,CAAC,SAAS,SAAS,CAAC,MAAM,YAAW;AACvC,WAAK,MAAM,GAAG,IAAI;AAAA;AAElB,gBAAU,KAAK,SAAS,KAAK,KAAK;AAEpC,WAAO;AAAA,EACT;AAEA,WAAS,UAAU,WAAW,SAAU,KAAK,YAAY;AACvD,QAAI;AAEJ,QAAI,cAAc,CAAC,QAAQ,KAAK,UAAU,GAAG;AAC3C,aAAO,KAAK,mBAAmB,GAAG;AAEpC,QAAI,QAAQ,KAAK,OAAO,GAAG,GAAG;AAC5B,UAAIpE,KAAI,KAAK,MAAM,GAAG;AACtB,UAAI,CAACA,MAAKA,OAAM;AACd,eAAO;AAET,UAAI,MAAM,QAAQA,EAAC;AACjB,eAAOA;AAAA,IACb;AAEE,QAAI;AACF,aAAO,KAAK,gBAAgB,KAAK,KAAK,GAAG,YAAY,GAAG,CAAC;AAAA,IAC7D,SAAW,IAAI;AACX,WAAK,cAAc,KAAK,EAAE;AAC1B,aAAO;AAAA,IACX;AAAA,EACA;AAEA,WAAS,UAAU,kBAAkB,SAAU,KAAK,SAAS;AAI3D,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAC5B,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAM;AACxC,YAAI,IAAI,QAAQ,CAAC;AACjB,YAAI,QAAQ;AACV,cAAI,MAAM;AAAA;AAEV,cAAI,MAAM,MAAM;AAClB,aAAK,MAAM,CAAC,IAAI;AAAA,MACtB;AAAA,IACA;AAEE,SAAK,MAAM,GAAG,IAAI;AAGlB,WAAO;AAAA,EACT;AAEA,WAAS,UAAU,gBAAgB,SAAU,GAAG,IAAI;AAElD,YAAQ,GAAG,MAAI;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACH,YAAI,MAAM,KAAK,SAAS,CAAC;AACzB,aAAK,MAAM,GAAG,IAAI;AAClB,YAAI,QAAQ,KAAK,QAAQ;AACvB,cAAID,SAAQ,IAAI,MAAM,GAAG,OAAO,kBAAkB,KAAK,GAAG;AAC1D,UAAAA,OAAM,OAAO,KAAK;AAClB,UAAAA,OAAM,OAAO,GAAG;AAChB,gBAAMA;AAAA,QACd;AACM;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,aAAK,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI;AAC/B;AAAA,MAEF;AACE,aAAK,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI;AAC/B,YAAI,KAAK;AACP,gBAAM;AACR,YAAI,CAAC,KAAK;AACR,kBAAQ,MAAM,cAAc,EAAE;AAChC;AAAA;EAEN;AAEA,WAAS,UAAU,mBAAmB,SAAUqG,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY;AAE5F,QAAI,UAAU,KAAK,SAAS,KAAK,UAAU;AAI3C,QAAI,CAAC;AACH;AAIF,QAAI,wBAAwB,OAAO,MAAM,CAAC;AAC1C,QAAI,SAASgC,UAAS,CAAEA,WAAW,CAAA;AACnC,QAAI,aAAa,OAAO,OAAO,qBAAqB;AAGpD,SAAK,SAAS,YAAYhC,QAAO,KAAK;AAEtC,QAAI,MAAM,QAAQ;AAClB,QAAI,QAAQ,KAAK,SAAS,GAAG;AAG7B,QAAI,SAAS;AACX;AAEF,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAI,IAAI,QAAQ,CAAC;AACjB,UAAI,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK;AAC/B;AAGF,UAAI,UAAU,OAAO,OAAO,QAAQ,CAAC,GAAG,qBAAqB;AAC7D,WAAK,SAAS,SAASA,QAAO,IAAI;AAElC,UAAI,QAAQ,OAAO,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC5C,WAAK,SAAS,OAAOA,QAAO,IAAI;AAAA,IACpC;AAAA,EACA;AAEA,WAAS,UAAU,iBAAiB,SAAUgC,SAAQhC,QAAO;AAG3D,QAAI,SAAS,KAAK,MAAMgC,OAAM;AAE9B,QAAI,CAAC,KAAK,QAAQhC,MAAK;AACrB,WAAK,QAAQA,MAAK,IAAI,uBAAO,OAAO,IAAI;AAG1C,QAAI,CAAC;AACH;AAEF,QAAIgC,WAAU,WAAWA,OAAM,KAAK,CAAC,KAAK,SAAS;AACjD,UAAI,QAAQ,UAAU,KAAKA,OAAM;AACjC,UAAIA,QAAO,OAAO,CAAC,MAAM,KAAK;AAC5B,QAAAA,UAASjG,MAAK,KAAK,KAAK,MAAMiG,OAAM;AAAA,MAC1C,OAAW;AACL,QAAAA,UAASjG,MAAK,QAAQ,KAAK,MAAMiG,OAAM;AACvC,YAAI;AACF,UAAAA,WAAU;AAAA,MAClB;AAAA,IACA;AAEE,QAAI,QAAQ,aAAa;AACvB,MAAAA,UAASA,QAAO,QAAQ,OAAO,GAAG;AAGpC,SAAK,WAAWhC,QAAOgC,OAAM;AAAA,EAC/B;AAGA,WAAS,UAAU,QAAQ,SAAU,GAAG;AACtC,QAAI,MAAM,KAAK,SAAS,CAAC;AACzB,QAAI,UAAU,EAAE,MAAM,EAAE,MAAM;AAE9B,QAAI,EAAE,SAAS,KAAK;AAClB,aAAO;AAET,QAAI,CAAC,KAAK,QAAQ,QAAQ,KAAK,OAAO,GAAG,GAAG;AAC1C,UAAIpG,KAAI,KAAK,MAAM,GAAG;AAEtB,UAAI,MAAM,QAAQA,EAAC;AACjB,QAAAA,KAAI;AAGN,UAAI,CAAC,WAAWA,OAAM;AACpB,eAAOA;AAET,UAAI,WAAWA,OAAM;AACnB,eAAO;AAAA,IAIb;AAEE,QAAI;AACJ,QAAI,OAAO,KAAK,UAAU,GAAG;AAC7B,QAAI,CAAC,MAAM;AACT,UAAI;AACJ,UAAI;AACF,gBAAQ,KAAK,GAAG,UAAU,GAAG;AAAA,MACnC,SAAa,IAAI;AACX,YAAI,OAAO,GAAG,SAAS,YAAY,GAAG,SAAS,YAAY;AACzD,eAAK,UAAU,GAAG,IAAI;AACtB,iBAAO;AAAA,QACf;AAAA,MACA;AAEI,UAAI,SAAS,MAAM,kBAAkB;AACnC,YAAI;AACF,iBAAO,KAAK,GAAG,SAAS,GAAG;AAAA,QACnC,SAAe,IAAI;AACX,iBAAO;AAAA,QACf;AAAA,MACA,OAAW;AACL,eAAO;AAAA,MACb;AAAA,IACA;AAEE,SAAK,UAAU,GAAG,IAAI;AAEtB,QAAIA,KAAI;AACR,QAAI;AACF,MAAAA,KAAI,KAAK,YAAW,IAAK,QAAQ;AAEnC,SAAK,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG,KAAKA;AAErC,QAAI,WAAWA,OAAM;AACnB,aAAO;AAET,WAAOA;AAAA,EACT;AAEA,WAAS,UAAU,QAAQ,SAAU,GAAG;AACtC,WAAOsH,QAAO,KAAK,MAAM,CAAC;AAAA,EAC5B;AAEA,WAAS,UAAU,WAAW,SAAU,GAAG;AACzC,WAAOA,QAAO,QAAQ,MAAM,CAAC;AAAA,EAC/B;;;;;;;;ACheA,aAAiB;AACjB,WAAS,OAAQ,IAAI,IAAI;AACvB,QAAI,MAAM,GAAI,QAAO,OAAO,EAAE,EAAE,EAAE;AAElC,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI,UAAU,uBAAuB;AAE7C,WAAO,KAAK,EAAE,EAAE,QAAQ,SAAU,GAAG;AACnC,cAAQ,CAAC,IAAI,GAAG,CAAC;AAAA,IACrB,CAAG;AAED,WAAO;AAEP,aAAS,UAAU;AACjB,UAAI,OAAO,IAAI,MAAM,UAAU,MAAM;AACrC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,aAAK,CAAC,IAAI,UAAU,CAAC;AAAA,MAC3B;AACI,UAAI,MAAM,GAAG,MAAM,MAAM,IAAI;AAC7B,UAAIC,MAAK,KAAK,KAAK,SAAO,CAAC;AAC3B,UAAI,OAAO,QAAQ,cAAc,QAAQA,KAAI;AAC3C,eAAO,KAAKA,GAAE,EAAE,QAAQ,SAAU,GAAG;AACnC,cAAI,CAAC,IAAIA,IAAG,CAAC;AAAA,QACrB,CAAO;AAAA,MACP;AACI,aAAO;AAAA,IACX;AAAA,EACA;;;;;;;;;AChCA,MAAI,SAAS7F,cAAA;AACb8F,SAAA,UAAiB,OAAOC,KAAI;AAC5BD,SAAA,QAAA,SAAwB,OAAO,UAAU;AAEzC,EAAAC,MAAK,QAAQA,MAAK,WAAY;AAC5B,WAAO,eAAe,SAAS,WAAW,QAAQ;AAAA,MAChD,OAAO,WAAY;AACjB,eAAOA,MAAK,IAAI;AAAA,MACtB;AAAA,MACI,cAAc;AAAA,IAClB,CAAG;AAED,WAAO,eAAe,SAAS,WAAW,cAAc;AAAA,MACtD,OAAO,WAAY;AACjB,eAAO,WAAW,IAAI;AAAA,MAC5B;AAAA,MACI,cAAc;AAAA,IAClB,CAAG;AAAA,EACH,CAAC;AAED,WAASA,MAAM,IAAI;AACjB,QAAI,IAAI,WAAY;AAClB,UAAI,EAAE,OAAQ,QAAO,EAAE;AACvB,QAAE,SAAS;AACX,aAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,SAAS;AAAA,IAC7C;AACE,MAAE,SAAS;AACX,WAAO;AAAA,EACT;AAEA,WAAS,WAAY,IAAI;AACvB,QAAI,IAAI,WAAY;AAClB,UAAI,EAAE;AACJ,cAAM,IAAI,MAAM,EAAE,SAAS;AAC7B,QAAE,SAAS;AACX,aAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,SAAS;AAAA,IAC7C;AACE,QAAIrH,QAAO,GAAG,QAAQ;AACtB,MAAE,YAAYA,QAAO;AACrB,MAAE,SAAS;AACX,WAAO;AAAA,EACT;;;;;;;;ACzCA,MAAI,SAASsB,cAAA;AACb,MAAI,OAAO,uBAAO,OAAO,IAAI;AAC7B,MAAI+F,QAAO5G,YAAA;AAEX,eAAiB,OAAO,QAAQ;AAEhC,WAAS,SAAU,KAAK,IAAI;AAC1B,QAAI,KAAK,GAAG,GAAG;AACb,WAAK,GAAG,EAAE,KAAK,EAAE;AACjB,aAAO;AAAA,IACX,OAAS;AACL,WAAK,GAAG,IAAI,CAAC,EAAE;AACf,aAAO,QAAQ,GAAG;AAAA,IACtB;AAAA,EACA;AAEA,WAAS,QAAS,KAAK;AACrB,WAAO4G,MAAK,SAAS,MAAO;AAC1B,UAAI,MAAM,KAAK,GAAG;AAClB,UAAI,MAAM,IAAI;AACd,UAAI,OAAO,MAAM,SAAS;AAQ1B,UAAI;AACF,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAI,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,QAC/B;AAAA,MACA,UAAK;AACC,YAAI,IAAI,SAAS,KAAK;AAGpB,cAAI,OAAO,GAAG,GAAG;AACjB,kBAAQ,SAAS,WAAY;AAC3B,gBAAI,MAAM,MAAM,IAAI;AAAA,UAC9B,CAAS;AAAA,QACT,OAAa;AACL,iBAAO,KAAK,GAAG;AAAA,QACvB;AAAA,MACA;AAAA,IACA,CAAG;AAAA,EACH;AAEA,WAAS,MAAO,MAAM;AACpB,QAAI,SAAS,KAAK;AAClB,QAAI,QAAQ,CAAA;AAEZ,aAAS,IAAI,GAAG,IAAI,QAAQ,IAAK,OAAM,CAAC,IAAI,KAAK,CAAC;AAClD,WAAO;AAAA,EACT;;;;;;;;ACbA,WAAiB;AAEjB,MAAI,KAAK/F,mBAAA;AACT,MAAI,YAAYb,iBAAA;AAChB,MAAI,YAAY,UAAU;AAC1B,MAAI,WAAWC;AACf,MAAI,KAAKM,aAAkB;AAC3B,MAAIjB,QAAOa;AACX,MAAI,SAASE;AACb,MAAI,aAAa0E,sBAAA;AACjB,MAAI,WAAWE,YAAA;AACf,MAAIwB,UAASI,cAAA;AACb,MAAI,UAAUJ,QAAO;AACrB,MAAI,UAAUA,QAAO;AACrB,MAAI,WAAWK,gBAAA;AACf,MAAIhG,QAAOiG;AACX,MAAI,kBAAkBN,QAAO;AAC7B,MAAI,YAAYA,QAAO;AAEvB,MAAIG,QAAOI,YAAA;AAEX,WAAS,KAAM,SAAS,SAAS,IAAI;AACnC,QAAI,OAAO,YAAY,WAAY,MAAK,SAAS,UAAU,CAAA;AAC3D,QAAI,CAAC,QAAS,WAAU,CAAA;AAExB,QAAI,QAAQ,MAAM;AAChB,UAAI;AACF,cAAM,IAAI,UAAU,gCAAgC;AACtD,aAAO,SAAS,SAAS,OAAO;AAAA,IACpC;AAEE,WAAO,IAAI,KAAK,SAAS,SAAS,EAAE;AAAA,EACtC;AAEA,OAAK,OAAO;AACZ,MAAI,WAAW,KAAK,WAAW,SAAS;AAGxC,OAAK,OAAO;AAEZ,WAAS,OAAQ,QAAQ,KAAK;AAC5B,QAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC3C,aAAO;AAAA,IACX;AAEE,QAAI,OAAO,OAAO,KAAK,GAAG;AAC1B,QAAI,IAAI,KAAK;AACb,WAAO,KAAK;AACV,aAAO,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA,IACjC;AACE,WAAO;AAAA,EACT;AAEA,OAAK,WAAW,SAAU,SAAS,UAAU;AAC3C,QAAI,UAAU,OAAO,CAAA,GAAI,QAAQ;AACjC,YAAQ,YAAY;AAEpB,QAAIC,KAAI,IAAI,KAAK,SAAS,OAAO;AACjC,QAAI,MAAMA,GAAE,UAAU;AAEtB,QAAI,CAAC;AACH,aAAO;AAET,QAAI,IAAI,SAAS;AACf,aAAO;AAET,aAAS,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,QAAQ,KAAK;AACtC,UAAI,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM;AACvB,eAAO;AAAA,IACb;AAEE,WAAO;AAAA,EACT;AAEA,OAAK,OAAO;AACZ,WAAS,MAAM,EAAE;AACjB,WAAS,KAAM,SAAS,SAAS,IAAI;AACnC,QAAI,OAAO,YAAY,YAAY;AACjC,WAAK;AACL,gBAAU;AAAA,IACd;AAEE,QAAI,WAAW,QAAQ,MAAM;AAC3B,UAAI;AACF,cAAM,IAAI,UAAU,gCAAgC;AACtD,aAAO,IAAI,SAAS,SAAS,OAAO;AAAA,IACxC;AAEE,QAAI,EAAE,gBAAgB;AACpB,aAAO,IAAI,KAAK,SAAS,SAAS,EAAE;AAEtC,YAAQ,MAAM,SAAS,OAAO;AAC9B,SAAK,eAAe;AAGpB,QAAI,IAAI,KAAK,UAAU,IAAI;AAM3B,SAAK,UAAU,IAAI,MAAM,CAAC;AAE1B,QAAI,OAAO,OAAO,YAAY;AAC5B,WAAKL,MAAK,EAAE;AACZ,WAAK,GAAG,SAAS,EAAE;AACnB,WAAK,GAAG,OAAO,SAAU,SAAS;AAChC,WAAG,MAAM,OAAO;AAAA,MACtB,CAAK;AAAA,IACL;AAEE,QAAI,OAAO;AACX,SAAK,cAAc;AAEnB,SAAK,aAAa,CAAA;AAClB,SAAK,gBAAgB,CAAA;AACrB,SAAK,SAAS;AAEd,QAAI,KAAK;AACP,aAAO;AAET,QAAI,MAAM;AACR,aAAO,KAAI;AAEb,QAAIM,QAAO;AACX,aAAS,IAAI,GAAG,IAAI,GAAG,KAAM;AAC3B,WAAK,SAAS,KAAK,UAAU,IAAI,CAAC,GAAG,GAAG,OAAO,IAAI;AAAA,IACvD;AACE,IAAAA,QAAO;AAEP,aAAS,OAAQ;AACf,QAAE,KAAK;AACP,UAAI,KAAK,eAAe,GAAG;AACzB,YAAIA,OAAM;AACR,kBAAQ,SAAS,WAAY;AAC3B,iBAAK,QAAO;AAAA,UACtB,CAAS;AAAA,QACT,OAAa;AACL,eAAK,QAAO;AAAA,QACpB;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAEA,OAAK,UAAU,UAAU,WAAY;AACnC,WAAO,gBAAgB,IAAI;AAC3B,QAAI,KAAK;AACP;AAEF,QAAI,KAAK,YAAY,CAAC,KAAK;AACzB,aAAO,KAAK,UAAS;AAEvB,IAAAT,QAAO,OAAO,IAAI;AAClB,SAAK,KAAK,OAAO,KAAK,KAAK;AAAA,EAC7B;AAEA,OAAK,UAAU,YAAY,WAAY;AACrC,QAAI,KAAK;AACP;AAEF,SAAK,eAAe;AAEpB,QAAI,IAAI,KAAK,QAAQ;AACrB,QAAI,MAAM;AACR,aAAO,KAAK,QAAO;AAErB,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ;AACvC,WAAK,aAAa,GAAG,IAAI;AAE3B,aAAS,OAAQ;AACf,UAAI,EAAE,MAAM;AACV,aAAK,QAAO;AAAA,IAClB;AAAA,EACA;AAEA,OAAK,UAAU,eAAe,SAAUlD,QAAO,IAAI;AACjD,QAAI,WAAW,KAAK,QAAQA,MAAK;AACjC,QAAI,CAAC;AACH,aAAO,GAAE;AAEX,QAAI,QAAQ,OAAO,KAAK,QAAQ;AAChC,QAAI,OAAO;AACX,QAAI,IAAI,MAAM;AAEd,QAAI,MAAM;AACR,aAAO,GAAE;AAEX,QAAI,MAAM,KAAK,QAAQA,MAAK,IAAI,uBAAO,OAAO,IAAI;AAClD,UAAM,QAAQ,SAAU,GAAG,GAAG;AAI5B,UAAI,KAAK,SAAS,CAAC;AACnB,SAAG,SAAS,GAAG,KAAK,eAAe,SAAU,IAAI,MAAM;AACrD,YAAI,CAAC;AACH,cAAI,IAAI,IAAI;AAAA,iBACL,GAAG,YAAY;AACtB,cAAI,CAAC,IAAI;AAAA;AAET,eAAK,KAAK,SAAS,EAAE;AAEvB,YAAI,EAAE,MAAM,GAAG;AACb,eAAK,QAAQA,MAAK,IAAI;AACtB,aAAE;AAAA,QACV;AAAA,MACA,CAAK;AAAA,IACL,CAAG;AAAA,EACH;AAEA,OAAK,UAAU,QAAQ,SAAU,GAAG;AAClC,WAAOkD,QAAO,KAAK,MAAM,CAAC;AAAA,EAC5B;AAEA,OAAK,UAAU,WAAW,SAAU,GAAG;AACrC,WAAOA,QAAO,QAAQ,MAAM,CAAC;AAAA,EAC/B;AAEA,OAAK,UAAU,QAAQ,WAAY;AACjC,SAAK,UAAU;AACf,SAAK,KAAK,OAAO;AAAA,EACnB;AAEA,OAAK,UAAU,QAAQ,WAAY;AACjC,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS;AACd,WAAK,KAAK,OAAO;AAAA,IACrB;AAAA,EACA;AAEA,OAAK,UAAU,SAAS,WAAY;AAClC,QAAI,KAAK,QAAQ;AACf,WAAK,KAAK,QAAQ;AAClB,WAAK,SAAS;AACd,UAAI,KAAK,WAAW,QAAQ;AAC1B,YAAI,KAAK,KAAK,WAAW,MAAM,CAAC;AAChC,aAAK,WAAW,SAAS;AACzB,iBAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAM;AACnC,cAAI,IAAI,GAAG,CAAC;AACZ,eAAK,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,QAClC;AAAA,MACA;AACI,UAAI,KAAK,cAAc,QAAQ;AAC7B,YAAI,KAAK,KAAK,cAAc,MAAM,CAAC;AACnC,aAAK,cAAc,SAAS;AAC5B,iBAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAM;AACnC,cAAI,IAAI,GAAG,CAAC;AACZ,eAAK;AACL,eAAK,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,QAC5C;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAEA,OAAK,UAAU,WAAW,SAAU,SAASlD,QAAO,YAAY,IAAI;AAClE,WAAO,gBAAgB,IAAI;AAC3B,WAAO,OAAO,OAAO,UAAU;AAE/B,QAAI,KAAK;AACP;AAEF,SAAK;AACL,QAAI,KAAK,QAAQ;AACf,WAAK,cAAc,KAAK,CAAC,SAASA,QAAO,YAAY,EAAE,CAAC;AACxD;AAAA,IACJ;AAKE,QAAI,IAAI;AACR,WAAO,OAAO,QAAQ,CAAC,MAAM,UAAU;AACrC;AAAA,IACJ;AAIE,QAAIgC;AACJ,YAAQ,GAAC;AAAA,MAEP,KAAK,QAAQ;AACX,aAAK,eAAe,QAAQ,KAAK,GAAG,GAAGhC,QAAO,EAAE;AAChD;AAAA,MAEF,KAAK;AAGH,QAAAgC,UAAS;AACT;AAAA,MAEF;AAIE,QAAAA,UAAS,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACrC;AAAA;AAGJ,QAAI,SAAS,QAAQ,MAAM,CAAC;AAG5B,QAAI;AACJ,QAAIA,YAAW;AACb,aAAO;AAAA,aACA,WAAWA,OAAM,KACtB,WAAW,QAAQ,IAAI,SAAU,GAAG;AAClC,aAAO,OAAO,MAAM,WAAW,IAAI;AAAA,IAC3C,CAAO,EAAE,KAAK,GAAG,CAAC,GAAG;AACjB,UAAI,CAACA,WAAU,CAAC,WAAWA,OAAM;AAC/B,QAAAA,UAAS,MAAMA;AACjB,aAAOA;AAAA,IACX;AACI,aAAOA;AAET,QAAI,MAAM,KAAK,SAAS,IAAI;AAG5B,QAAI,gBAAgB,MAAM,IAAI;AAC5B,aAAO,GAAE;AAEX,QAAI,aAAa,OAAO,CAAC,MAAM,UAAU;AACzC,QAAI;AACF,WAAK,iBAAiBA,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,EAAE;AAAA;AAEtE,WAAK,gBAAgBgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,EAAE;AAAA,EACzE;AAEA,OAAK,UAAU,kBAAkB,SAAUgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,IAAI;AAC3F,QAAI,OAAO;AACX,SAAK,SAAS,KAAK,YAAY,SAAU,IAAI,SAAS;AACpD,aAAO,KAAK,iBAAiBgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,SAAS,EAAE;AAAA,IAC1F,CAAG;AAAA,EACH;AAEA,OAAK,UAAU,mBAAmB,SAAUgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,SAAS,IAAI;AAGrG,QAAI,CAAC;AACH,aAAO,GAAE;AAIX,QAAI,KAAK,OAAO,CAAC;AACjB,QAAI,SAAS,CAAC,CAAC,KAAK,UAAU;AAC9B,QAAI,UAAU,GAAG;AACjB,QAAI,QAAQ,KAAK,OAAO,QAAQ,OAAO,CAAC,MAAM;AAE9C,QAAI,iBAAiB,CAAA;AACrB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,IAAI,QAAQ,CAAC;AACjB,UAAI,EAAE,OAAO,CAAC,MAAM,OAAO,OAAO;AAChC,YAAI;AACJ,YAAI,UAAU,CAACgC,SAAQ;AACrB,cAAI,CAAC,EAAE,MAAM,EAAE;AAAA,QACvB,OAAa;AACL,cAAI,EAAE,MAAM,EAAE;AAAA,QACtB;AACM,YAAI;AACF,yBAAe,KAAK,CAAC;AAAA,MAC7B;AAAA,IACA;AAIE,QAAI,MAAM,eAAe;AAEzB,QAAI,QAAQ;AACV,aAAO,GAAE;AAOX,QAAI,OAAO,WAAW,KAAK,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AACnD,UAAI,CAAC,KAAK,QAAQhC,MAAK;AACrB,aAAK,QAAQA,MAAK,IAAI,uBAAO,OAAO,IAAI;AAE1C,eAAS,IAAI,GAAG,IAAI,KAAK,KAAM;AAC7B,YAAI,IAAI,eAAe,CAAC;AACxB,YAAIgC,SAAQ;AACV,cAAIA,YAAW;AACb,gBAAIA,UAAS,MAAM;AAAA;AAEnB,gBAAIA,UAAS;AAAA,QACvB;AAEM,YAAI,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,SAAS;AACxC,cAAIjG,MAAK,KAAK,KAAK,MAAM,CAAC;AAAA,QAClC;AACM,aAAK,WAAWiE,QAAO,CAAC;AAAA,MAC9B;AAEI,aAAO,GAAE;AAAA,IACb;AAIE,WAAO,MAAK;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,KAAM;AAC7B,UAAI,IAAI,eAAe,CAAC;AACxB,UAAI;AACJ,UAAIgC,SAAQ;AACV,YAAIA,YAAW;AACb,cAAIA,UAAS,MAAM;AAAA;AAEnB,cAAIA,UAAS;AAAA,MACrB;AACI,WAAK,SAAS,CAAC,CAAC,EAAE,OAAO,MAAM,GAAGhC,QAAO,YAAY,EAAE;AAAA,IAC3D;AACE,OAAE;AAAA,EACJ;AAEA,OAAK,UAAU,aAAa,SAAUA,QAAO,GAAG;AAC9C,QAAI,KAAK;AACP;AAEF,QAAI,UAAU,MAAM,CAAC;AACnB;AAEF,QAAI,KAAK,QAAQ;AACf,WAAK,WAAW,KAAK,CAACA,QAAO,CAAC,CAAC;AAC/B;AAAA,IACJ;AAEE,QAAI,MAAM,WAAW,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC;AAE7C,QAAI,KAAK;AACP,UAAI,KAAK,MAAM,CAAC;AAElB,QAAI,KAAK;AACP,UAAI;AAEN,QAAI,KAAK,QAAQA,MAAK,EAAE,CAAC;AACvB;AAEF,QAAI,KAAK,OAAO;AACd,UAAIpE,KAAI,KAAK,MAAM,GAAG;AACtB,UAAIA,OAAM,SAAS,MAAM,QAAQA,EAAC;AAChC;AAAA,IACN;AAEE,SAAK,QAAQoE,MAAK,EAAE,CAAC,IAAI;AAEzB,QAAI,KAAK,KAAK,UAAU,GAAG;AAC3B,QAAI;AACF,WAAK,KAAK,QAAQ,GAAG,EAAE;AAEzB,SAAK,KAAK,SAAS,CAAC;AAAA,EACtB;AAEA,OAAK,UAAU,qBAAqB,SAAU,KAAK,IAAI;AACrD,QAAI,KAAK;AACP;AAIF,QAAI,KAAK;AACP,aAAO,KAAK,SAAS,KAAK,OAAO,EAAE;AAErC,QAAI,WAAW,YAAY;AAC3B,QAAI,OAAO;AACX,QAAI,UAAU,SAAS,UAAU,QAAQ;AAEzC,QAAI;AACF,WAAK,GAAG,MAAM,KAAK,OAAO;AAE5B,aAAS,SAAU,IAAI,OAAO;AAC5B,UAAI,MAAM,GAAG,SAAS;AACpB,eAAO,GAAE;AAEX,UAAI,QAAQ,SAAS,MAAM,eAAc;AACzC,WAAK,SAAS,GAAG,IAAI;AAIrB,UAAI,CAAC,SAAS,SAAS,CAAC,MAAM,YAAW,GAAI;AAC3C,aAAK,MAAM,GAAG,IAAI;AAClB,WAAE;AAAA,MACR;AACM,aAAK,SAAS,KAAK,OAAO,EAAE;AAAA,IAClC;AAAA,EACA;AAEA,OAAK,UAAU,WAAW,SAAU,KAAK,YAAY,IAAI;AACvD,QAAI,KAAK;AACP;AAEF,SAAK,SAAS,cAAY,MAAI,OAAK,YAAY,EAAE;AACjD,QAAI,CAAC;AACH;AAGF,QAAI,cAAc,CAAC,QAAQ,KAAK,UAAU,GAAG;AAC3C,aAAO,KAAK,mBAAmB,KAAK,EAAE;AAExC,QAAI,QAAQ,KAAK,OAAO,GAAG,GAAG;AAC5B,UAAIpE,KAAI,KAAK,MAAM,GAAG;AACtB,UAAI,CAACA,MAAKA,OAAM;AACd,eAAO,GAAE;AAEX,UAAI,MAAM,QAAQA,EAAC;AACjB,eAAO,GAAG,MAAMA,EAAC;AAAA,IACvB;AAEE,QAAI,OAAO;AACX,SAAK,GAAG,QAAQ,KAAK,UAAU,MAAM,KAAK,EAAE,CAAC;AAAA,EAC/C;AAEA,WAAS,UAAW,MAAM,KAAK,IAAI;AACjC,WAAO,SAAU,IAAI,SAAS;AAC5B,UAAI;AACF,aAAK,cAAc,KAAK,IAAI,EAAE;AAAA;AAE9B,aAAK,gBAAgB,KAAK,SAAS,EAAE;AAAA,IAC3C;AAAA,EACA;AAEA,OAAK,UAAU,kBAAkB,SAAU,KAAK,SAAS,IAAI;AAC3D,QAAI,KAAK;AACP;AAKF,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAC5B,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAM;AACxC,YAAI,IAAI,QAAQ,CAAC;AACjB,YAAI,QAAQ;AACV,cAAI,MAAM;AAAA;AAEV,cAAI,MAAM,MAAM;AAClB,aAAK,MAAM,CAAC,IAAI;AAAA,MACtB;AAAA,IACA;AAEE,SAAK,MAAM,GAAG,IAAI;AAClB,WAAO,GAAG,MAAM,OAAO;AAAA,EACzB;AAEA,OAAK,UAAU,gBAAgB,SAAU,GAAG,IAAI,IAAI;AAClD,QAAI,KAAK;AACP;AAGF,YAAQ,GAAG,MAAI;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACH,YAAI,MAAM,KAAK,SAAS,CAAC;AACzB,aAAK,MAAM,GAAG,IAAI;AAClB,YAAI,QAAQ,KAAK,QAAQ;AACvB,cAAID,SAAQ,IAAI,MAAM,GAAG,OAAO,kBAAkB,KAAK,GAAG;AAC1D,UAAAA,OAAM,OAAO,KAAK;AAClB,UAAAA,OAAM,OAAO,GAAG;AAChB,eAAK,KAAK,SAASA,MAAK;AACxB,eAAK,MAAK;AAAA,QAClB;AACM;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,aAAK,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI;AAC/B;AAAA,MAEF;AACE,aAAK,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI;AAC/B,YAAI,KAAK,QAAQ;AACf,eAAK,KAAK,SAAS,EAAE;AAGrB,eAAK,MAAK;AAAA,QAClB;AACM,YAAI,CAAC,KAAK;AACR,kBAAQ,MAAM,cAAc,EAAE;AAChC;AAAA;AAGJ,WAAO,GAAE;AAAA,EACX;AAEA,OAAK,UAAU,mBAAmB,SAAUqG,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,IAAI;AAC5F,QAAI,OAAO;AACX,SAAK,SAAS,KAAK,YAAY,SAAU,IAAI,SAAS;AACpD,WAAK,kBAAkBgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,SAAS,EAAE;AAAA,IACpF,CAAG;AAAA,EACH;AAGA,OAAK,UAAU,oBAAoB,SAAUgC,SAAQ,MAAM,KAAK,QAAQhC,QAAO,YAAY,SAAS,IAAI;AAKtG,QAAI,CAAC;AACH,aAAO,GAAE;AAIX,QAAI,wBAAwB,OAAO,MAAM,CAAC;AAC1C,QAAI,SAASgC,UAAS,CAAEA,WAAW,CAAA;AACnC,QAAI,aAAa,OAAO,OAAO,qBAAqB;AAGpD,SAAK,SAAS,YAAYhC,QAAO,OAAO,EAAE;AAE1C,QAAI,QAAQ,KAAK,SAAS,GAAG;AAC7B,QAAI,MAAM,QAAQ;AAGlB,QAAI,SAAS;AACX,aAAO,GAAE;AAEX,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAI,IAAI,QAAQ,CAAC;AACjB,UAAI,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK;AAC/B;AAGF,UAAI,UAAU,OAAO,OAAO,QAAQ,CAAC,GAAG,qBAAqB;AAC7D,WAAK,SAAS,SAASA,QAAO,MAAM,EAAE;AAEtC,UAAI,QAAQ,OAAO,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC5C,WAAK,SAAS,OAAOA,QAAO,MAAM,EAAE;AAAA,IACxC;AAEE,OAAE;AAAA,EACJ;AAEA,OAAK,UAAU,iBAAiB,SAAUgC,SAAQhC,QAAO,IAAI;AAG3D,QAAI,OAAO;AACX,SAAK,MAAMgC,SAAQ,SAAU,IAAI,QAAQ;AACvC,WAAK,gBAAgBA,SAAQhC,QAAO,IAAI,QAAQ,EAAE;AAAA,IACtD,CAAG;AAAA,EACH;AACA,OAAK,UAAU,kBAAkB,SAAUgC,SAAQhC,QAAO,IAAI,QAAQ,IAAI;AAIxE,QAAI,CAAC,KAAK,QAAQA,MAAK;AACrB,WAAK,QAAQA,MAAK,IAAI,uBAAO,OAAO,IAAI;AAG1C,QAAI,CAAC;AACH,aAAO,GAAE;AAEX,QAAIgC,WAAU,WAAWA,OAAM,KAAK,CAAC,KAAK,SAAS;AACjD,UAAI,QAAQ,UAAU,KAAKA,OAAM;AACjC,UAAIA,QAAO,OAAO,CAAC,MAAM,KAAK;AAC5B,QAAAA,UAASjG,MAAK,KAAK,KAAK,MAAMiG,OAAM;AAAA,MAC1C,OAAW;AACL,QAAAA,UAASjG,MAAK,QAAQ,KAAK,MAAMiG,OAAM;AACvC,YAAI;AACF,UAAAA,WAAU;AAAA,MAClB;AAAA,IACA;AAEE,QAAI,QAAQ,aAAa;AACvB,MAAAA,UAASA,QAAO,QAAQ,OAAO,GAAG;AAGpC,SAAK,WAAWhC,QAAOgC,OAAM;AAC7B,OAAE;AAAA,EACJ;AAGA,OAAK,UAAU,QAAQ,SAAU,GAAG,IAAI;AACtC,QAAI,MAAM,KAAK,SAAS,CAAC;AACzB,QAAI,UAAU,EAAE,MAAM,EAAE,MAAM;AAE9B,QAAI,EAAE,SAAS,KAAK;AAClB,aAAO,GAAE;AAEX,QAAI,CAAC,KAAK,QAAQ,QAAQ,KAAK,OAAO,GAAG,GAAG;AAC1C,UAAIpG,KAAI,KAAK,MAAM,GAAG;AAEtB,UAAI,MAAM,QAAQA,EAAC;AACjB,QAAAA,KAAI;AAGN,UAAI,CAAC,WAAWA,OAAM;AACpB,eAAO,GAAG,MAAMA,EAAC;AAEnB,UAAI,WAAWA,OAAM;AACnB,eAAO,GAAE;AAAA,IAIf;AAEE,QAAI;AACJ,QAAI,OAAO,KAAK,UAAU,GAAG;AAC7B,QAAI,SAAS,QAAW;AACtB,UAAI,SAAS;AACX,eAAO,GAAG,MAAM,IAAI;AAAA,WACjB;AACH,YAAI,OAAO,KAAK,YAAW,IAAK,QAAQ;AACxC,YAAI,WAAW,SAAS;AACtB,iBAAO,GAAE;AAAA;AAET,iBAAO,GAAG,MAAM,MAAM,IAAI;AAAA,MAClC;AAAA,IACA;AAEE,QAAI,OAAO;AACX,QAAI,SAAS,SAAS,WAAW,KAAK,QAAQ;AAC9C,QAAI;AACF,WAAK,GAAG,MAAM,KAAK,MAAM;AAE3B,aAAS,SAAU,IAAI,OAAO;AAC5B,UAAI,SAAS,MAAM,kBAAkB;AAGnC,eAAO,KAAK,GAAG,KAAK,KAAK,SAAUgI,KAAIC,OAAM;AAC3C,cAAID;AACF,iBAAK,OAAO,GAAG,KAAK,MAAM,OAAO,EAAE;AAAA;AAEnC,iBAAK,OAAO,GAAG,KAAKA,KAAIC,OAAM,EAAE;AAAA,QAC1C,CAAO;AAAA,MACP,OAAW;AACL,aAAK,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE;AAAA,MACvC;AAAA,IACA;AAAA,EACA;AAEA,OAAK,UAAU,SAAS,SAAU,GAAG,KAAK,IAAI,MAAM,IAAI;AACtD,QAAI,OAAO,GAAG,SAAS,YAAY,GAAG,SAAS,YAAY;AACzD,WAAK,UAAU,GAAG,IAAI;AACtB,aAAO,GAAE;AAAA,IACb;AAEE,QAAI,UAAU,EAAE,MAAM,EAAE,MAAM;AAC9B,SAAK,UAAU,GAAG,IAAI;AAEtB,QAAI,IAAI,MAAM,EAAE,MAAM,OAAO,QAAQ,CAAC,KAAK,YAAW;AACpD,aAAO,GAAG,MAAM,OAAO,IAAI;AAE7B,QAAIjI,KAAI;AACR,QAAI;AACF,MAAAA,KAAI,KAAK,YAAW,IAAK,QAAQ;AACnC,SAAK,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG,KAAKA;AAErC,QAAI,WAAWA,OAAM;AACnB,aAAO,GAAE;AAEX,WAAO,GAAG,MAAMA,IAAG,IAAI;AAAA,EACzB;;;;;;;;ACrxBA,QAAM,SAAS0B;AACf,QAAMvB,QAAOU;AACb,QAAMD,OAAKE;AACX,MAAI,OAAO;AACX,MAAI;AACF,WAAOM,YAAA;AAAA,EACT,SAAS,MAAM;AAAA,EAEf;AAEA,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,IACR,QAAQ;AAAA;AAIV,MAAItB,WAAU;AAEd,QAAM,YAAa,QAAQ,aAAa;AAExC,QAAM,WAAW,aAAW;AAC1B,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAEF,YAAQ,QAAQ,OAAK;AACnB,cAAQ,CAAC,IAAI,QAAQ,CAAC,KAAKc,KAAG,CAAC;AAC/B,UAAI,IAAI;AACR,cAAQ,CAAC,IAAI,QAAQ,CAAC,KAAKA,KAAG,CAAC;AAAA,IACnC,CAAG;AAED,YAAQ,eAAe,QAAQ,gBAAgB;AAC/C,YAAQ,aAAa,QAAQ,cAAc;AAC3C,QAAI,QAAQ,SAAS,OAAO;AAC1B,cAAQ,cAAc;AAAA,IAC1B;AACE,QAAI,QAAQ,gBAAgB,QAAQ,SAAS,QAAW;AACtD,YAAM,MAAM,4EAA4E;AAAA,IAC5F;AACE,YAAQ,cAAc,QAAQ,eAAe;AAC7C,YAAQ,OAAO,QAAQ,QAAQ;AAAA,EACjC;AAEA,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO;AACjC,QAAI,OAAO,YAAY,YAAY;AACjC,WAAK;AACL,gBAAU,CAAA;AAAA,IACd;AAEE,WAAO,GAAG,sBAAsB;AAChC,WAAO,MAAM,OAAO,GAAG,UAAU,iCAAiC;AAClE,WAAO,MAAM,OAAO,IAAI,YAAY,oCAAoC;AACxE,WAAO,SAAS,2CAA2C;AAC3D,WAAO,MAAM,OAAO,SAAS,UAAU,kCAAkC;AAEzE,aAAS,OAAO;AAEhB,QAAI,YAAY;AAChB,QAAI,WAAW;AACf,QAAI,IAAI;AAER,UAAM,OAAO,CAAC,OAAO;AACnB,iBAAW,YAAY;AACvB,UAAI,EAAE,MAAM;AACV,WAAG,QAAQ;AAAA,IACjB;AAEE,UAAM,YAAY,CAAC,IAAI,YAAY;AACjC,UAAI;AACF,eAAO,GAAG,EAAE;AAEd,UAAI,QAAQ;AACZ,UAAI,MAAM;AACR,eAAO,GAAE;AAEX,cAAQ,QAAQ,CAAAsH,OAAK;AACnB,cAAM,KAAK,CAACF,QAAO;AACjB,cAAIA,KAAI;AACN,iBAAKA,IAAG,SAAS,WAAWA,IAAG,SAAS,eAAeA,IAAG,SAAS,YAC/D,YAAY,QAAQ,cAAc;AACpC;AAEA,qBAAO,WAAW,MAAM,QAAQE,IAAG,SAAS,EAAE,GAAG,YAAY,GAAG;AAAA,YAC5E;AAGU,gBAAIF,IAAG,SAAS,YAAYlI,WAAU,QAAQ,YAAY;AACxD,qBAAO,WAAW,MAAM,QAAQoI,IAAG,SAAS,EAAE,GAAGpI,UAAU;AAAA,YACvE;AAGU,gBAAIkI,IAAG,SAAS,SAAU,CAAAA,MAAK;AAAA,UACzC;AAEQ,UAAAlI,WAAU;AACV,eAAKkI,GAAE;AAAA,QACf;AACM,gBAAQE,IAAG,SAAS,EAAE;AAAA,MAC5B,CAAK;AAAA,IACL;AAEE,QAAI,QAAQ,eAAe,CAAC,KAAK,SAAS,CAAC;AACzC,aAAO,UAAU,MAAM,CAAC,CAAC,CAAC;AAE5B,YAAQ,MAAM,GAAG,CAAC,IAAI,SAAS;AAC7B,UAAI,CAAC;AACH,eAAO,UAAU,MAAM,CAAC,CAAC,CAAC;AAE5B,WAAK,GAAG,QAAQ,MAAM,SAAS;AAAA,IACnC,CAAG;AAAA,EAEH;AAaA,QAAM,UAAU,CAAC,GAAG,SAAS,OAAO;AAClC,WAAO,CAAC;AACR,WAAO,OAAO;AACd,WAAO,OAAO,OAAO,UAAU;AAI/B,YAAQ,MAAM,GAAG,CAAC,IAAI,OAAO;AAC3B,UAAI,MAAM,GAAG,SAAS;AACpB,eAAO,GAAG,IAAI;AAGhB,UAAI,MAAM,GAAG,SAAS,WAAW;AAC/B,oBAAY,GAAG,SAAS,IAAI,EAAE;AAEhC,UAAI,MAAM,GAAG,YAAW;AACtB,eAAO,MAAM,GAAG,SAAS,IAAI,EAAE;AAEjC,cAAQ,OAAO,GAAG,CAAAF,QAAM;AACtB,YAAIA,KAAI;AACN,cAAIA,IAAG,SAAS;AACd,mBAAO,GAAG,IAAI;AAChB,cAAIA,IAAG,SAAS;AACd,mBAAQ,YACJ,YAAY,GAAG,SAASA,KAAI,EAAE,IAC9B,MAAM,GAAG,SAASA,KAAI,EAAE;AAC9B,cAAIA,IAAG,SAAS;AACd,mBAAO,MAAM,GAAG,SAASA,KAAI,EAAE;AAAA,QACzC;AACM,eAAO,GAAGA,GAAE;AAAA,MAClB,CAAK;AAAA,IACL,CAAG;AAAA,EACH;AAEA,QAAM,cAAc,CAAC,GAAG,SAAS,IAAI,OAAO;AAC1C,WAAO,CAAC;AACR,WAAO,OAAO;AACd,WAAO,OAAO,OAAO,UAAU;AAE/B,YAAQ,MAAM,GAAG,KAAO,SAAO;AAC7B,UAAI;AACF,WAAG,IAAI,SAAS,WAAW,OAAO,EAAE;AAAA;AAEpC,gBAAQ,KAAK,GAAG,CAAC,KAAK,UAAU;AAC9B,cAAI;AACF,eAAG,IAAI,SAAS,WAAW,OAAO,EAAE;AAAA,mBAC7B,MAAM,YAAW;AACxB,kBAAM,GAAG,SAAS,IAAI,EAAE;AAAA;AAExB,oBAAQ,OAAO,GAAG,EAAE;AAAA,QAC9B,CAAO;AAAA,IACP,CAAG;AAAA,EACH;AAEA,QAAM,kBAAkB,CAAC,GAAG,SAAS,OAAO;AAC1C,WAAO,CAAC;AACR,WAAO,OAAO;AAEd,QAAI;AACF,cAAQ,UAAU,GAAG,GAAK;AAAA,IAC9B,SAAW,KAAK;AACZ,UAAI,IAAI,SAAS;AACf;AAAA;AAEA,cAAM;AAAA,IACZ;AAEE,QAAI;AACJ,QAAI;AACF,cAAQ,QAAQ,SAAS,CAAC;AAAA,IAC9B,SAAW,KAAK;AACZ,UAAI,IAAI,SAAS;AACf;AAAA;AAEA,cAAM;AAAA,IACZ;AAEE,QAAI,MAAM,YAAW;AACnB,gBAAU,GAAG,SAAS,EAAE;AAAA;AAExB,cAAQ,WAAW,CAAC;AAAA,EACxB;AAEA,QAAM,QAAQ,CAAC,GAAG,SAAS,YAAY,OAAO;AAC5C,WAAO,CAAC;AACR,WAAO,OAAO;AACd,WAAO,OAAO,OAAO,UAAU;AAK/B,YAAQ,MAAM,GAAG,QAAM;AACrB,UAAI,OAAO,GAAG,SAAS,eAAe,GAAG,SAAS,YAAY,GAAG,SAAS;AACxE,eAAO,GAAG,SAAS,EAAE;AAAA,eACd,MAAM,GAAG,SAAS;AACzB,WAAG,UAAU;AAAA;AAEb,WAAG,EAAE;AAAA,IACX,CAAG;AAAA,EACH;AAEA,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO;AACjC,WAAO,CAAC;AACR,WAAO,OAAO;AACd,WAAO,OAAO,OAAO,UAAU;AAE/B,YAAQ,QAAQ,GAAG,CAAC,IAAI,UAAU;AAChC,UAAI;AACF,eAAO,GAAG,EAAE;AACd,UAAI,IAAI,MAAM;AACd,UAAI,MAAM;AACR,eAAO,QAAQ,MAAM,GAAG,EAAE;AAC5B,UAAI;AACJ,YAAM,QAAQ,OAAK;AACjB,eAAO7H,MAAK,KAAK,GAAG,CAAC,GAAG,SAAS,CAAA6H,QAAM;AACrC,cAAI;AACF;AACF,cAAIA;AACF,mBAAO,GAAG,WAAWA,GAAE;AACzB,cAAI,EAAE,MAAM;AACV,oBAAQ,MAAM,GAAG,EAAE;AAAA,QAC7B,CAAO;AAAA,MACP,CAAK;AAAA,IACL,CAAG;AAAA,EACH;AAKA,QAAM,aAAa,CAAC,GAAG,YAAY;AACjC,cAAU,WAAW,CAAA;AACrB,aAAS,OAAO;AAEhB,WAAO,GAAG,sBAAsB;AAChC,WAAO,MAAM,OAAO,GAAG,UAAU,iCAAiC;AAClE,WAAO,SAAS,yBAAyB;AACzC,WAAO,MAAM,OAAO,SAAS,UAAU,kCAAkC;AAEzE,QAAI;AAEJ,QAAI,QAAQ,eAAe,CAAC,KAAK,SAAS,CAAC,GAAG;AAC5C,gBAAU,CAAC,CAAC;AAAA,IAChB,OAAS;AACL,UAAI;AACF,gBAAQ,UAAU,CAAC;AACnB,kBAAU,CAAC,CAAC;AAAA,MAClB,SAAa,IAAI;AACX,kBAAU,KAAK,KAAK,GAAG,QAAQ,IAAI;AAAA,MACzC;AAAA,IACA;AAEE,QAAI,CAAC,QAAQ;AACX;AAEF,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAME,KAAI,QAAQ,CAAC;AAEnB,UAAI;AACJ,UAAI;AACF,aAAK,QAAQ,UAAUA,EAAC;AAAA,MAC9B,SAAa,IAAI;AACX,YAAI,GAAG,SAAS;AACd;AAGF,YAAI,GAAG,SAAS,WAAW;AACzB,0BAAgBA,IAAG,SAAS,EAAE;AAAA,MACtC;AAEI,UAAI;AAEF,YAAI,MAAM,GAAG,YAAW;AACtB,oBAAUA,IAAG,SAAS,IAAI;AAAA;AAE1B,kBAAQ,WAAWA,EAAC;AAAA,MAC5B,SAAa,IAAI;AACX,YAAI,GAAG,SAAS;AACd;AACF,YAAI,GAAG,SAAS;AACd,iBAAO,YAAY,gBAAgBA,IAAG,SAAS,EAAE,IAAI,UAAUA,IAAG,SAAS,EAAE;AAC/E,YAAI,GAAG,SAAS;AACd,gBAAM;AAER,kBAAUA,IAAG,SAAS,EAAE;AAAA,MAC9B;AAAA,IACA;AAAA,EACA;AAEA,QAAM,YAAY,CAAC,GAAG,SAAS,eAAe;AAC5C,WAAO,CAAC;AACR,WAAO,OAAO;AAEd,QAAI;AACF,cAAQ,UAAU,CAAC;AAAA,IACvB,SAAW,IAAI;AACX,UAAI,GAAG,SAAS;AACd;AACF,UAAI,GAAG,SAAS;AACd,cAAM;AACR,UAAI,GAAG,SAAS,eAAe,GAAG,SAAS,YAAY,GAAG,SAAS;AACjE,mBAAW,GAAG,OAAO;AAAA,IAC3B;AAAA,EACA;AAEA,QAAM,aAAa,CAAC,GAAG,YAAY;AACjC,WAAO,CAAC;AACR,WAAO,OAAO;AACd,YAAQ,YAAY,CAAC,EAAE,QAAQ,OAAK,WAAW/H,MAAK,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC;AAQxE,UAAM,UAAU,YAAY,MAAM;AAClC,QAAI,IAAI;AACR,OAAG;AACD,UAAI,QAAQ;AACZ,UAAI;AACF,cAAM,MAAM,QAAQ,UAAU,GAAG,OAAO;AACxC,gBAAQ;AACR,eAAO;AAAA,MACb,UAAK;AACC,YAAI,EAAE,IAAI,WAAW;AACnB;AAAA,MACR;AAAA,IACA,SAAW;AAAA,EACX;AAEA,aAAiB;AACjB,SAAO,OAAO;;;;;;;;;ACvWd;AAEA,UAAMS,OAAKc;AAEX,WAAA,UAAiB;AAEjB,UAAM,eAAe,QAAQ,QAC1B,OAAO,CAAC,EACR,QAAQ,QAAQ,EAAE,EAClB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,aAAO,CAAC;AAAA,IACZ,CAAG;AAEH,UAAM,yBAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,yBAAyB;AAE/B,WAAA,QAAA,mBAAkC,WAAW;AAG3C,UAAI6E,WAAU,QAAQ,SAAS;AAC/B,UAAI,CAACA,UAAS;AACZ,YAAI,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,KAAK,EAAG,CAAAA,WAAU;AAAA,iBACpD,aAAa,CAAC,MAAM,EAAG,CAAAA,WAAU;AAAA,MAC9C;AACE,aAAOA;AAAA,IACT;AAEA,WAAA,QAAA,6BAA4C,SAAS,QAAQ;AAE3D,YAAMA,WAAU,OAAO,QAAQ,iBAAiB,MAAM;AACtD,aAAOA,WAAU,KAAKA,WAAU;AAAA,IAClC;AAEA,WAAA,QAAA,wBAAuC,SAAS,cAAc,MAAM;AAElE,YAAM4B,UAAS,aAAa;AAC5B,YAAM,iBAAiB,OAAOA,QAAO,WAAW;AAChD,YAAM,iBAAiB,OAAOA,QAAO,WAAW;AAChD,YAAM,kBAAkB,OAAOA,QAAO,YAAY;AAClD,YAAM,sBAAsB,OAAO,QAAQ,wBAAwB,cAAc,MAAM,IAAI;AAC3F,YAAM,0BAA0B,OAAO,QAAQ,4BAA4B,YAAY;AAEvF,UAAI,qBAAqB;AACvB,4BAAoB,QAAQ,CAAC,uBAAsB;AACjD,cAAI,EAAE,SAAS,oBAAoB,EAAE,MAAM,sBAAsB,qBAAqB,IAAI;AACxF,kBAAM,IAAI,MAAM,kEAAkE;AAAA,UAC1F;AAAA,QACA,CAAK;AAAA,MACL;AAEE,UAAI,wBAAwB,CAAC,kBAAmB,CAAC,kBAAkB,CAAC,kBAAmB;AACrF,cAAM,IAAI,MAAM,kJAC0D;AAAA,MAC9E;AAEE,WAAK,kBAAkB,kBAAkB,oBAAoB,CAAC,yBAAyB;AACrF,cAAM,IAAI,MAAM,sJACiE;AAAA,MACrF;AAEE,UAAI,uBAAuB,CAAC,OAAO,QAAQ,4BAA4B,cAAc,IAAI,KAC1F,OAAO,QAAQ,gBAAgB,YAAY,GAAG;AAC3C,cAAM,IAAI;AAAA,UACR,mDAAmD,OAAO,QAAQ,iBAAiB,OAAO,KAAK,SAAS,MAAS,IAAI,gDAC1E,OAAO,QAAQ,4BAA4B,YAAY,IAAI;AAAA,QAC7D;AAAA,MAC/C;AAEE,UAAI,2BAA2B,CAAC,uBAAuB,OAAO,QAAQ,gBAAgB,YAAY,GAAG;AACnG,cAAM,IAAI;AAAA,UACR,mDAAmD,OAAO,QAAQ,iBAAiB,OAAO,KAAK,SAAS,MAAS,IAAI,gDAC1E,OAAO,QAAQ,4BAA4B,YAAY,IAAI;AAAA,QAC7D;AAAA,MAC/C;AAAA,IAEA;AAEA,aAAS,OAAOhI,OAAM;AACpB,aAAOA,UAASA,MAAK,QAAQ,sBAAsB,MAAM,MAAMA,MAAK,QAAQ,mBAAmB,MAAM;AAAA,IACvG;AAEA,WAAA,QAAA,kBAAiC,SAAS,cAAc,MAAM,UAAU;AACtE,YAAM,oBAAoB,CAAA;AAC1B,YAAM,sBAAsB,OAAO,QAAQ,wBAAwB,cAAc,IAAI;AACrF,eAAS,QAAQ,CAAC,YAAW;AAC3B,YAAI,uBAAuB,QAAQ,SAAS,WAAW;AACrD,gBAAM,qBAAqB,OAAO,QAAQ,4BAA4B,cAAc,IAAI;AACxF,gBAAM,OAAO,qBAAqB,CAAC,yBAAyB,kBAAkB,IAAI,CAAA;AAClF,4BAAkB,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAY;AAAA,QAC/D,WAAe,uBAAuB,uBAAuB,QAAQ,QAAQ,IAAI,MAAM,IAAI;AACrF,8BAAoB,QAAQ,CAAC,uBAAsB;AACjD,kBAAM,OAAO,QAAQ,KAAK,MAAK;AAC/B,iBAAK,KAAK,yBAAyB,kBAAkB;AACrD,8BAAkB,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAY;AAAA,UACjE,CAAO;AAAA,QACP,OAAW;AACL,4BAAkB,KAAK,OAAO;AAAA,QACpC;AAAA,MACA,CAAG;AACD,aAAO;AAAA,IACT;AAEA,WAAA,QAAA,0BAAyC,SAAS,cAAc,MAAM,UAAU;AAC9E,YAAM8F,OAAMpF;AACZ,UAAI,sBAAsB,CAAA;AAC1B,YAAM,yBAAyB,OAAO,QAAQ,iBAAiB,OAAO,KAAK,SAAS,MAAS;AAE7F,UAAI,aAAa,UAAU,aAAa,OAAO,eAAe;AAC5D,qBAAa,OAAO,cAAc,QAAQ,CAAC,iBAAiB;AAC1D,gBAAM,aAAa,oBAAoB,QAAQ,YAAY,MAAM;AACjE,cAAI,CAAC,cAAc,0BAA0B,gBAAgB,wBAAwB;AACnF,gCAAoB,KAAK,YAAY;AAAA,UAC7C,WAAiB,YAAY,CAAC,cAAc,wBAAwB;AAC5D,YAAAoF,KAAI,KAAK,mEAAmE,YAAY;AAAA,UAChG;AAAA,QACA,CAAK;AAAA,MACL;AACE,UAAI,QAAQ,KAAK,gCAAgC,GAAG;AAClD,YAAI,iBAAiB;AACrB,4BAAoB,QAAQ,CAAC,iBAAiB;AAC5C,cAAI,eAAe,eAAgB,kBAAiB;AAAA,QAC1D,CAAK;AACD,8BAAsB,iBAAiB,CAAC,cAAc,IAAI,CAAA;AAAA,MAC9D;AACE,aAAO,oBAAoB,SAAS,sBAAsB;AAAA,IAC5D;AAEA,WAAA,QAAA,8BAA6C,SAAS,cAAc;AAClE,YAAM,sBAAsB,CAAA;AAE5B,UAAI,aAAa,UAAU,aAAa,OAAO,eAAe;AAC5D,qBAAa,OAAO,cAAc,QAAQ,CAAC,iBAAiB;AAC1D,cAAI,oBAAoB,QAAQ,YAAY,MAAM,IAAI;AACpD,gCAAoB,KAAK,YAAY;AAAA,UAC7C;AAAA,QACA,CAAK;AAAA,MACL;AACE,aAAO,oBAAoB,SAAS,sBAAsB;AAAA,IAC5D;AAEA,WAAA,QAAA,kBAAiC,SAAS,oBAAoB;AAC5D,aAAO,yBAAyB;AAAA,IAClC;AAEA,WAAA,QAAA,2CAA0D,SAAS,cAAc;AAC/E,eAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cAAM,MAAM,aAAa,CAAC;AAC1B,YAAI,IAAI,QAAQ,sBAAsB,MAAM,GAAG;AAC7C,iBAAO,SAAS,IAAI,OAAO,uBAAuB,MAAM,GAAG,EAAE;AAAA,QACnE;AAAA,MACA;AACE,aAAO;AAAA,IACT;AAEA,WAAA,QAAA,qBAAoC,SAAS,oBAAoB;AAC/D,UAAI,oBAAoB;AACtB,cAAM,KAAKnF,cAAA;AACX,WAAG,KAAK,OAAO,QAAQ,cAAc,kBAAkB,CAAC;AACxDF,aAAG,WAAW,SAAS,OAAO,QAAQ,cAAc,kBAAkB,CAAC;AAAA,MAC3E;AAAA,IACA;AAEA,WAAA,QAAA,oBAAmC,SAAS,oBAAoB;AAC9D,UAAI,oBAAoB;AACtB,cAAM,KAAKE,cAAA;AACX,WAAG,KAAK,OAAO;AACfF,aAAG,WAAW,OAAO,QAAQ,cAAc,kBAAkB,GAAG,OAAO;AAAA,MAC3E;AAAA,IACA;AAEA,WAAA,QAAA,gBAA+B,SAAS,oBAAoB;AAC1D,aAAO,qBAAqB;AAAA,IAC9B;AAEA,WAAA,QAAA,8BAA6C,SAAS,cAAc,MAAM;AACxE,UAAI,0BAA0B;AAC9B,YAAM,sBAAsB,OAAO,QAAQ,wBAAwB,cAAc,IAAI;AACrF,UAAI,qBAAqB;AACvB,cAAM,mBAAmB,OAAO,QAAQ,iBAAiB,OAAO,KAAK,SAAS,MAAS;AACvF,4BAAoB,QAAQ,CAAC,uBAAsB;AACjD,cAAI,qBAAqB,2BAC3B,sBAAsB,kBAAkB;AACpC,sCAA0B;AAAA,UAClC;AAAA,QACA,CAAK;AAAA,MACL;AACE,aAAO,4BAA4B,IAAI,SAAY;AAAA,IACrD;AAEA,WAAA,QAAA,kBAAiC,SAAS,cAAc;AACtD,aAAO,aAAa,UAAU,aAAa,OAAO,gBACnD,aAAa,OAAO,aAAa,QAAQ,mBAAmB,MAAM;AAAA,IACnE;AAAA;;;;;;;;;;;AC5MA;AAIA,QAAM,sBAAsB;AAE5B,QAAM,aAAa;AACnB,QAAM,mBAAmB,OAAO;AAAA,EACL;AAG3B,QAAM,4BAA4B;AAIlC,QAAM,wBAAwB,aAAa;AAE3C,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGF,cAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB,YAAY;AAAA,EACd;;;;;;;;ACpCA;AAEA,QAAM,QACJ,OAAO,YAAY,YACnB,QAAQ,OACR,QAAQ,IAAI,cACZ,cAAc,KAAK,QAAQ,IAAI,UAAU,IACvC,IAAI,SAAS,QAAQ,MAAM,UAAU,GAAG,IAAI,IAC5C,MAAM;AAAA,EAAA;AAEV,YAAiB;;;;;;;;;ACVjB;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAIc,iBAAA;AACJ,UAAM,QAAQb,aAAA;AACd,cAAU,iBAAiB,CAAA;AAG3B,UAAMsG,MAAK,QAAA,KAAa,CAAA;AACxB,UAAM,SAAS,QAAA,SAAiB,CAAA;AAChC,UAAM,MAAM,QAAA,MAAc,CAAA;AAC1B,UAAM,UAAU,QAAA,UAAkB,CAAA;AAClC,UAAM,IAAI,QAAA,IAAY,CAAA;AACtB,QAAI,IAAI;AAER,UAAM,mBAAmB;AAQzB,UAAM,wBAAwB;AAAA,MAC5B,CAAC,OAAO,CAAC;AAAA,MACT,CAAC,OAAO,UAAU;AAAA,MAClB,CAAC,kBAAkB,qBAAqB;AAAA;AAG1C,UAAM,gBAAgB,CAAC,UAAU;AAC/B,iBAAW,CAAC,OAAO,GAAG,KAAK,uBAAuB;AAChD,gBAAQ,MACL,MAAM,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,EAC5C,MAAM,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG;AAAA,MACnD;AACE,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAC/G,OAAM,OAAO,aAAa;AAC7C,YAAM,OAAO,cAAc,KAAK;AAChC,YAAMgE,SAAQ;AACd,YAAMhE,OAAMgE,QAAO,KAAK;AACxB,QAAEhE,KAAI,IAAIgE;AACV,UAAIA,MAAK,IAAI;AACb,cAAQA,MAAK,IAAI;AACjB,MAAA+C,IAAG/C,MAAK,IAAI,IAAI,OAAO,OAAO,WAAW,MAAM,MAAS;AACxD,aAAOA,MAAK,IAAI,IAAI,OAAO,MAAM,WAAW,MAAM,MAAS;AAAA,IAC7D;AAQA,gBAAY,qBAAqB,aAAa;AAC9C,gBAAY,0BAA0B,MAAM;AAM5C,gBAAY,wBAAwB,gBAAgB,gBAAgB,GAAG;AAKvE,gBAAY,eAAe,IAAI,IAAI,EAAE,iBAAiB,CAAC,QAChC,IAAI,EAAE,iBAAiB,CAAC,QACxB,IAAI,EAAE,iBAAiB,CAAC,GAAG;AAElD,gBAAY,oBAAoB,IAAI,IAAI,EAAE,sBAAsB,CAAC,QACrC,IAAI,EAAE,sBAAsB,CAAC,QAC7B,IAAI,EAAE,sBAAsB,CAAC,GAAG;AAO5D,gBAAY,wBAAwB,MAAM,IAAI,EAAE,oBAAoB,KAChE,IAAI,EAAE,iBAAiB,CAAC,GAAG;AAE/B,gBAAY,6BAA6B,MAAM,IAAI,EAAE,oBAAoB,KACrE,IAAI,EAAE,sBAAsB,CAAC,GAAG;AAMpC,gBAAY,cAAc,QAAQ,IAAI,EAAE,oBAAoB,UACnD,IAAI,EAAE,oBAAoB,CAAC,MAAM;AAE1C,gBAAY,mBAAmB,SAAS,IAAI,EAAE,yBAAyB,UAC9D,IAAI,EAAE,yBAAyB,CAAC,MAAM;AAK/C,gBAAY,mBAAmB,GAAG,gBAAgB,GAAG;AAMrD,gBAAY,SAAS,UAAU,IAAI,EAAE,eAAe,UAC3C,IAAI,EAAE,eAAe,CAAC,MAAM;AAWrC,gBAAY,aAAa,KAAK,IAAI,EAAE,WAAW,IAC5C,IAAI,EAAE,UAAU,CAAC,IAClB,IAAI,EAAE,KAAK,CAAC,GAAG;AAEjB,gBAAY,QAAQ,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG;AAK3C,gBAAY,cAAc,WAAW,IAAI,EAAE,gBAAgB,IACxD,IAAI,EAAE,eAAe,CAAC,IACvB,IAAI,EAAE,KAAK,CAAC,GAAG;AAEjB,gBAAY,SAAS,IAAI,IAAI,EAAE,UAAU,CAAC,GAAG;AAE7C,gBAAY,QAAQ,cAAc;AAKlC,gBAAY,yBAAyB,GAAG,IAAI,EAAE,sBAAsB,CAAC,UAAU;AAC/E,gBAAY,oBAAoB,GAAG,IAAI,EAAE,iBAAiB,CAAC,UAAU;AAErE,gBAAY,eAAe,YAAY,IAAI,EAAE,gBAAgB,CAAC,WACjC,IAAI,EAAE,gBAAgB,CAAC,WACvB,IAAI,EAAE,gBAAgB,CAAC,OAC3B,IAAI,EAAE,UAAU,CAAC,KACrB,IAAI,EAAE,KAAK,CAAC,OACR;AAEzB,gBAAY,oBAAoB,YAAY,IAAI,EAAE,qBAAqB,CAAC,WACtC,IAAI,EAAE,qBAAqB,CAAC,WAC5B,IAAI,EAAE,qBAAqB,CAAC,OAChC,IAAI,EAAE,eAAe,CAAC,KAC1B,IAAI,EAAE,KAAK,CAAC,OACR;AAE9B,gBAAY,UAAU,IAAI,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,WAAW,CAAC,GAAG;AACjE,gBAAY,eAAe,IAAI,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,gBAAgB,CAAC,GAAG;AAI3E,gBAAY,eAAe,GAAG,mBACP,GAAG,yBAAyB,kBACrB,yBAAyB,oBACzB,yBAAyB,MAAM;AAC7D,gBAAY,UAAU,GAAG,IAAI,EAAE,WAAW,CAAC,cAAc;AACzD,gBAAY,cAAc,IAAI,EAAE,WAAW,IAC7B,MAAM,IAAI,EAAE,UAAU,CAAC,QACjB,IAAI,EAAE,KAAK,CAAC,gBACJ;AAC5B,gBAAY,aAAa,IAAI,EAAE,MAAM,GAAG,IAAI;AAC5C,gBAAY,iBAAiB,IAAI,EAAE,UAAU,GAAG,IAAI;AAIpD,gBAAY,aAAa,SAAS;AAElC,gBAAY,aAAa,SAAS,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI;AAC9D,YAAA,mBAA2B;AAE3B,gBAAY,SAAS,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,GAAG;AACjE,gBAAY,cAAc,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,gBAAgB,CAAC,GAAG;AAI3E,gBAAY,aAAa,SAAS;AAElC,gBAAY,aAAa,SAAS,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI;AAC9D,YAAA,mBAA2B;AAE3B,gBAAY,SAAS,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,GAAG;AACjE,gBAAY,cAAc,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,gBAAgB,CAAC,GAAG;AAG3E,gBAAY,mBAAmB,IAAI,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,UAAU,CAAC,OAAO;AAC9E,gBAAY,cAAc,IAAI,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,SAAS,CAAC,OAAO;AAIxE,gBAAY,kBAAkB,SAAS,IAAI,EAAE,IAAI,SACzC,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,KAAK,IAAI;AACxD,YAAA,wBAAgC;AAMhC,gBAAY,eAAe,SAAS,IAAI,EAAE,WAAW,CAAC,cAE/B,IAAI,EAAE,WAAW,CAAC,QACf;AAE1B,gBAAY,oBAAoB,SAAS,IAAI,EAAE,gBAAgB,CAAC,cAEpC,IAAI,EAAE,gBAAgB,CAAC,QACpB;AAG/B,gBAAY,QAAQ,iBAAiB;AAErC,gBAAY,QAAQ,2BAA2B;AAC/C,gBAAY,WAAW,6BAA6B;AAAA;;;;;;;;AC9NpD;AAGA,QAAM,cAAc,OAAO,OAAO,EAAE,OAAO,KAAI,CAAE;AACjD,QAAM,YAAY,OAAO,OAAO,CAAA,CAAG;AACnC,QAAM,eAAe,aAAW;AAC9B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACX;AAEE,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO;AAAA,IACX;AAEE,WAAO;AAAA,EACT;AACA,mBAAiB;;;;;;;;AChBjB;AAEA,QAAM,UAAU;AAChB,QAAM,qBAAqB,CAAC9D,IAAG,MAAM;AACnC,UAAM,OAAO,QAAQ,KAAKA,EAAC;AAC3B,UAAM,OAAO,QAAQ,KAAK,CAAC;AAE3B,QAAI,QAAQ,MAAM;AAChB,MAAAA,KAAI,CAACA;AACL,UAAI,CAAC;AAAA,IACT;AAEE,WAAOA,OAAM,IAAI,IACZ,QAAQ,CAAC,OAAQ,KACjB,QAAQ,CAAC,OAAQ,IAClBA,KAAI,IAAI,KACR;AAAA,EACN;AAEA,QAAM,sBAAsB,CAACA,IAAG,MAAM,mBAAmB,GAAGA,EAAC;AAE7D,gBAAiB;AAAA,IACf;AAAA,IACA;AAAA,EACF;;;;;;;;ACxBA;AAEA,QAAM,QAAQoB,aAAA;AACd,QAAM,EAAE,YAAY,iBAAgB,IAAKb,iBAAA;AACzC,QAAM,EAAE,QAAQsG,KAAI,EAAC,IAAKrG,UAAA;AAE1B,QAAM,eAAeM,oBAAA;AACrB,QAAM,EAAE,mBAAkB,IAAKJ,mBAAA;AAAA,EAC/B,MAAM,OAAO;AAAA,IACX,YAAauF,UAAS,SAAS;AAC7B,gBAAU,aAAa,OAAO;AAE9B,UAAIA,oBAAmB,QAAQ;AAC7B,YAAIA,SAAQ,UAAU,CAAC,CAAC,QAAQ,SAC9BA,SAAQ,sBAAsB,CAAC,CAAC,QAAQ,mBAAmB;AAC3D,iBAAOA;AAAA,QACf,OAAa;AACL,UAAAA,WAAUA,SAAQ;AAAA,QAC1B;AAAA,MACA,WAAe,OAAOA,aAAY,UAAU;AACtC,cAAM,IAAI,UAAU,gDAAgD,OAAOA,QAAO,IAAI;AAAA,MAC5F;AAEI,UAAIA,SAAQ,SAAS,YAAY;AAC/B,cAAM,IAAI;AAAA,UACR,0BAA0B,UAAU;AAAA;MAE5C;AAEI,YAAM,UAAUA,UAAS,OAAO;AAChC,WAAK,UAAU;AACf,WAAK,QAAQ,CAAC,CAAC,QAAQ;AAGvB,WAAK,oBAAoB,CAAC,CAAC,QAAQ;AAEnC,YAAM,IAAIA,SAAQ,KAAI,EAAG,MAAM,QAAQ,QAAQY,IAAG,EAAE,KAAK,IAAIA,IAAG,EAAE,IAAI,CAAC;AAEvE,UAAI,CAAC,GAAG;AACN,cAAM,IAAI,UAAU,oBAAoBZ,QAAO,EAAE;AAAA,MACvD;AAEI,WAAK,MAAMA;AAGX,WAAK,QAAQ,CAAC,EAAE,CAAC;AACjB,WAAK,QAAQ,CAAC,EAAE,CAAC;AACjB,WAAK,QAAQ,CAAC,EAAE,CAAC;AAEjB,UAAI,KAAK,QAAQ,oBAAoB,KAAK,QAAQ,GAAG;AACnD,cAAM,IAAI,UAAU,uBAAuB;AAAA,MACjD;AAEI,UAAI,KAAK,QAAQ,oBAAoB,KAAK,QAAQ,GAAG;AACnD,cAAM,IAAI,UAAU,uBAAuB;AAAA,MACjD;AAEI,UAAI,KAAK,QAAQ,oBAAoB,KAAK,QAAQ,GAAG;AACnD,cAAM,IAAI,UAAU,uBAAuB;AAAA,MACjD;AAGI,UAAI,CAAC,EAAE,CAAC,GAAG;AACT,aAAK,aAAa,CAAA;AAAA,MACxB,OAAW;AACL,aAAK,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO;AAC5C,cAAI,WAAW,KAAK,EAAE,GAAG;AACvB,kBAAM,MAAM,CAAC;AACb,gBAAI,OAAO,KAAK,MAAM,kBAAkB;AACtC,qBAAO;AAAA,YACnB;AAAA,UACA;AACQ,iBAAO;AAAA,QACf,CAAO;AAAA,MACP;AAEI,WAAK,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;AACtC,WAAK,OAAM;AAAA,IACf;AAAA,IAEE,SAAU;AACR,WAAK,UAAU,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AACxD,UAAI,KAAK,WAAW,QAAQ;AAC1B,aAAK,WAAW,IAAI,KAAK,WAAW,KAAK,GAAG,CAAC;AAAA,MACnD;AACI,aAAO,KAAK;AAAA,IAChB;AAAA,IAEE,WAAY;AACV,aAAO,KAAK;AAAA,IAChB;AAAA,IAEE,QAAS,OAAO;AACd,YAAM,kBAAkB,KAAK,SAAS,KAAK,SAAS,KAAK;AACzD,UAAI,EAAE,iBAAiB,SAAS;AAC9B,YAAI,OAAO,UAAU,YAAY,UAAU,KAAK,SAAS;AACvD,iBAAO;AAAA,QACf;AACM,gBAAQ,IAAI,OAAO,OAAO,KAAK,OAAO;AAAA,MAC5C;AAEI,UAAI,MAAM,YAAY,KAAK,SAAS;AAClC,eAAO;AAAA,MACb;AAEI,aAAO,KAAK,YAAY,KAAK,KAAK,KAAK,WAAW,KAAK;AAAA,IAC3D;AAAA,IAEE,YAAa,OAAO;AAClB,UAAI,EAAE,iBAAiB,SAAS;AAC9B,gBAAQ,IAAI,OAAO,OAAO,KAAK,OAAO;AAAA,MAC5C;AAEI,aACE,mBAAmB,KAAK,OAAO,MAAM,KAAK,KAC1C,mBAAmB,KAAK,OAAO,MAAM,KAAK,KAC1C,mBAAmB,KAAK,OAAO,MAAM,KAAK;AAAA,IAEhD;AAAA,IAEE,WAAY,OAAO;AACjB,UAAI,EAAE,iBAAiB,SAAS;AAC9B,gBAAQ,IAAI,OAAO,OAAO,KAAK,OAAO;AAAA,MAC5C;AAGI,UAAI,KAAK,WAAW,UAAU,CAAC,MAAM,WAAW,QAAQ;AACtD,eAAO;AAAA,MACb,WAAe,CAAC,KAAK,WAAW,UAAU,MAAM,WAAW,QAAQ;AAC7D,eAAO;AAAA,MACb,WAAe,CAAC,KAAK,WAAW,UAAU,CAAC,MAAM,WAAW,QAAQ;AAC9D,eAAO;AAAA,MACb;AAEI,UAAI,IAAI;AACR,SAAG;AACD,cAAMjG,KAAI,KAAK,WAAW,CAAC;AAC3B,cAAM,IAAI,MAAM,WAAW,CAAC;AAC5B,cAAM,sBAAsB,GAAGA,IAAG,CAAC;AACnC,YAAIA,OAAM,UAAa,MAAM,QAAW;AACtC,iBAAO;AAAA,QACf,WAAiB,MAAM,QAAW;AAC1B,iBAAO;AAAA,QACf,WAAiBA,OAAM,QAAW;AAC1B,iBAAO;AAAA,QACf,WAAiBA,OAAM,GAAG;AAClB;AAAA,QACR,OAAa;AACL,iBAAO,mBAAmBA,IAAG,CAAC;AAAA,QACtC;AAAA,MACA,SAAa,EAAE;AAAA,IACf;AAAA,IAEE,aAAc,OAAO;AACnB,UAAI,EAAE,iBAAiB,SAAS;AAC9B,gBAAQ,IAAI,OAAO,OAAO,KAAK,OAAO;AAAA,MAC5C;AAEI,UAAI,IAAI;AACR,SAAG;AACD,cAAMA,KAAI,KAAK,MAAM,CAAC;AACtB,cAAM,IAAI,MAAM,MAAM,CAAC;AACvB,cAAM,iBAAiB,GAAGA,IAAG,CAAC;AAC9B,YAAIA,OAAM,UAAa,MAAM,QAAW;AACtC,iBAAO;AAAA,QACf,WAAiB,MAAM,QAAW;AAC1B,iBAAO;AAAA,QACf,WAAiBA,OAAM,QAAW;AAC1B,iBAAO;AAAA,QACf,WAAiBA,OAAM,GAAG;AAClB;AAAA,QACR,OAAa;AACL,iBAAO,mBAAmBA,IAAG,CAAC;AAAA,QACtC;AAAA,MACA,SAAa,EAAE;AAAA,IACf;AAAA;AAAA;AAAA,IAIE,IAAK,SAAS,YAAY,gBAAgB;AACxC,UAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAI,CAAC,cAAc,mBAAmB,OAAO;AAC3C,gBAAM,IAAI,MAAM,iDAAiD;AAAA,QACzE;AAEM,YAAI,YAAY;AACd,gBAAM,QAAQ,IAAI,UAAU,GAAG,MAAM,KAAK,QAAQ,QAAQ6G,IAAG,EAAE,eAAe,IAAIA,IAAG,EAAE,UAAU,CAAC;AAClG,cAAI,CAAC,SAAS,MAAM,CAAC,MAAM,YAAY;AACrC,kBAAM,IAAI,MAAM,uBAAuB,UAAU,EAAE;AAAA,UAC7D;AAAA,QACA;AAAA,MACA;AAEI,cAAQ,SAAO;AAAA,QACb,KAAK;AACH,eAAK,WAAW,SAAS;AACzB,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,eAAK;AACL,eAAK,IAAI,OAAO,YAAY,cAAc;AAC1C;AAAA,QACF,KAAK;AACH,eAAK,WAAW,SAAS;AACzB,eAAK,QAAQ;AACb,eAAK;AACL,eAAK,IAAI,OAAO,YAAY,cAAc;AAC1C;AAAA,QACF,KAAK;AAIH,eAAK,WAAW,SAAS;AACzB,eAAK,IAAI,SAAS,YAAY,cAAc;AAC5C,eAAK,IAAI,OAAO,YAAY,cAAc;AAC1C;AAAA,QAGF,KAAK;AACH,cAAI,KAAK,WAAW,WAAW,GAAG;AAChC,iBAAK,IAAI,SAAS,YAAY,cAAc;AAAA,UACtD;AACQ,eAAK,IAAI,OAAO,YAAY,cAAc;AAC1C;AAAA,QACF,KAAK;AACH,cAAI,KAAK,WAAW,WAAW,GAAG;AAChC,kBAAM,IAAI,MAAM,WAAW,KAAK,GAAG,sBAAsB;AAAA,UACnE;AACQ,eAAK,WAAW,SAAS;AACzB;AAAA,QAEF,KAAK;AAKH,cACE,KAAK,UAAU,KACf,KAAK,UAAU,KACf,KAAK,WAAW,WAAW,GAC3B;AACA,iBAAK;AAAA,UACf;AACQ,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,eAAK,aAAa,CAAA;AAClB;AAAA,QACF,KAAK;AAKH,cAAI,KAAK,UAAU,KAAK,KAAK,WAAW,WAAW,GAAG;AACpD,iBAAK;AAAA,UACf;AACQ,eAAK,QAAQ;AACb,eAAK,aAAa,CAAA;AAClB;AAAA,QACF,KAAK;AAKH,cAAI,KAAK,WAAW,WAAW,GAAG;AAChC,iBAAK;AAAA,UACf;AACQ,eAAK,aAAa,CAAA;AAClB;AAAA,QAGF,KAAK,OAAO;AACV,gBAAM,OAAO,OAAO,cAAc,IAAI,IAAI;AAE1C,cAAI,KAAK,WAAW,WAAW,GAAG;AAChC,iBAAK,aAAa,CAAC,IAAI;AAAA,UACjC,OAAe;AACL,gBAAI,IAAI,KAAK,WAAW;AACxB,mBAAO,EAAE,KAAK,GAAG;AACf,kBAAI,OAAO,KAAK,WAAW,CAAC,MAAM,UAAU;AAC1C,qBAAK,WAAW,CAAC;AACjB,oBAAI;AAAA,cAClB;AAAA,YACA;AACU,gBAAI,MAAM,IAAI;AAEZ,kBAAI,eAAe,KAAK,WAAW,KAAK,GAAG,KAAK,mBAAmB,OAAO;AACxE,sBAAM,IAAI,MAAM,uDAAuD;AAAA,cACrF;AACY,mBAAK,WAAW,KAAK,IAAI;AAAA,YACrC;AAAA,UACA;AACQ,cAAI,YAAY;AAGd,gBAAI,aAAa,CAAC,YAAY,IAAI;AAClC,gBAAI,mBAAmB,OAAO;AAC5B,2BAAa,CAAC,UAAU;AAAA,YACpC;AACU,gBAAI,mBAAmB,KAAK,WAAW,CAAC,GAAG,UAAU,MAAM,GAAG;AAC5D,kBAAI,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG;AAC7B,qBAAK,aAAa;AAAA,cAChC;AAAA,YACA,OAAiB;AACL,mBAAK,aAAa;AAAA,YAC9B;AAAA,UACA;AACQ;AAAA,QACR;AAAA,QACM;AACE,gBAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA;AAE5D,WAAK,MAAM,KAAK,OAAM;AACtB,UAAI,KAAK,MAAM,QAAQ;AACrB,aAAK,OAAO,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,MAC1C;AACI,aAAO;AAAA,IACX;AAAA;AAGAiB,aAAiB;;;;;;;;AC9TjB;AAEA,QAAM,SAAS1G,gBAAA;AACf,QAAM,QAAQ,CAAC6E,UAAS,SAAS,cAAc,UAAU;AACvD,QAAIA,oBAAmB,QAAQ;AAC7B,aAAOA;AAAA,IACX;AACE,QAAI;AACF,aAAO,IAAI,OAAOA,UAAS,OAAO;AAAA,IACtC,SAAW,IAAI;AACX,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,MACb;AACI,YAAM;AAAA,IACV;AAAA,EACA;AAEA,YAAiB;;;;;;;;ACjBjB;AAEA,QAAM,QAAQ7E,aAAA;AACd,QAAM2G,SAAQ,CAAC9B,UAAS,YAAY;AAClC,UAAM,IAAI,MAAMA,UAAS,OAAO;AAChC,WAAO,IAAI,EAAE,UAAU;AAAA,EACzB;AACA,YAAiB8B;;;;;;;;ACPjB;AAEA,QAAM,QAAQ3G,aAAA;AACd,QAAM,QAAQ,CAAC6E,UAAS,YAAY;AAClC,UAAM,IAAI,MAAMA,SAAQ,KAAI,EAAG,QAAQ,UAAU,EAAE,GAAG,OAAO;AAC7D,WAAO,IAAI,EAAE,UAAU;AAAA,EACzB;AACA,YAAiB;;;;;;;;ACPjB;AAEA,QAAM,SAAS7E,gBAAA;AAEf,QAAM,MAAM,CAAC6E,UAAS,SAAS,SAAS,YAAY,mBAAmB;AACrE,QAAI,OAAQ,YAAa,UAAU;AACjC,uBAAiB;AACjB,mBAAa;AACb,gBAAU;AAAA,IACd;AAEE,QAAI;AACF,aAAO,IAAI;AAAA,QACTA,oBAAmB,SAASA,SAAQ,UAAUA;AAAA,QAC9C;AAAA,QACA,IAAI,SAAS,YAAY,cAAc,EAAE;AAAA,IAC/C,SAAW,IAAI;AACX,aAAO;AAAA,IACX;AAAA,EACA;AACA,UAAiB;;;;;;;;ACpBjB;AAEA,QAAM,QAAQ7E,aAAA;AAEd,QAAM,OAAO,CAAC,UAAU,aAAa;AACnC,UAAM,KAAK,MAAM,UAAU,MAAM,IAAI;AACrC,UAAM,KAAK,MAAM,UAAU,MAAM,IAAI;AACrC,UAAM,aAAa,GAAG,QAAQ,EAAE;AAEhC,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,IACX;AAEE,UAAM,WAAW,aAAa;AAC9B,UAAM,cAAc,WAAW,KAAK;AACpC,UAAM,aAAa,WAAW,KAAK;AACnC,UAAM,aAAa,CAAC,CAAC,YAAY,WAAW;AAC5C,UAAM,YAAY,CAAC,CAAC,WAAW,WAAW;AAE1C,QAAI,aAAa,CAAC,YAAY;AAQ5B,UAAI,CAAC,WAAW,SAAS,CAAC,WAAW,OAAO;AAC1C,eAAO;AAAA,MACb;AAGI,UAAI,WAAW,YAAY,WAAW,MAAM,GAAG;AAC7C,YAAI,WAAW,SAAS,CAAC,WAAW,OAAO;AACzC,iBAAO;AAAA,QACf;AACM,eAAO;AAAA,MACb;AAAA,IACA;AAGE,UAAM0E,UAAS,aAAa,QAAQ;AAEpC,QAAI,GAAG,UAAU,GAAG,OAAO;AACzB,aAAOA,UAAS;AAAA,IACpB;AAEE,QAAI,GAAG,UAAU,GAAG,OAAO;AACzB,aAAOA,UAAS;AAAA,IACpB;AAEE,QAAI,GAAG,UAAU,GAAG,OAAO;AACzB,aAAOA,UAAS;AAAA,IACpB;AAGE,WAAO;AAAA,EACT;AAEA,WAAiB;;;;;;;;AC3DjB;AAEA,QAAM,SAAS1E,gBAAA;AACf,QAAM,QAAQ,CAACpB,IAAG,UAAU,IAAI,OAAOA,IAAG,KAAK,EAAE;AACjD,YAAiB;;;;;;;;ACJjB;AAEA,QAAM,SAASoB,gBAAA;AACf,QAAM,QAAQ,CAACpB,IAAG,UAAU,IAAI,OAAOA,IAAG,KAAK,EAAE;AACjD,YAAiB;;;;;;;;ACJjB;AAEA,QAAM,SAASoB,gBAAA;AACf,QAAM,QAAQ,CAACpB,IAAG,UAAU,IAAI,OAAOA,IAAG,KAAK,EAAE;AACjD,YAAiB;;;;;;;;ACJjB;AAEA,QAAM,QAAQoB,aAAA;AACd,QAAM,aAAa,CAAC6E,UAAS,YAAY;AACvC,UAAM,SAAS,MAAMA,UAAS,OAAO;AACrC,WAAQ,UAAU,OAAO,WAAW,SAAU,OAAO,aAAa;AAAA,EACpE;AACA,iBAAiB;;;;;;;;ACPjB;AAEA,QAAM,SAAS7E,gBAAA;AACf,QAAM,UAAU,CAACpB,IAAG,GAAG,UACrB,IAAI,OAAOA,IAAG,KAAK,EAAE,QAAQ,IAAI,OAAO,GAAG,KAAK,CAAC;AAEnD,cAAiB;;;;;;;;ACNjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,WAAW,CAACpB,IAAG,GAAG,UAAU,QAAQ,GAAGA,IAAG,KAAK;AACrD,eAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,eAAe,CAACpB,IAAG,MAAM,QAAQA,IAAG,GAAG,IAAI;AACjD,mBAAiB;;;;;;;;ACJjB;AAEA,QAAM,SAASoB,gBAAA;AACf,QAAM,eAAe,CAACpB,IAAG,GAAG,UAAU;AACpC,UAAM,WAAW,IAAI,OAAOA,IAAG,KAAK;AACpC,UAAM,WAAW,IAAI,OAAO,GAAG,KAAK;AACpC,WAAO,SAAS,QAAQ,QAAQ,KAAK,SAAS,aAAa,QAAQ;AAAA,EACrE;AACA,mBAAiB;;;;;;;;ACRjB;AAEA,QAAM,eAAeoB,oBAAA;AACrB,QAAM,OAAO,CAAC,MAAM,UAAU,KAAK,KAAK,CAACpB,IAAG,MAAM,aAAaA,IAAG,GAAG,KAAK,CAAC;AAC3E,WAAiB;;;;;;;;ACJjB;AAEA,QAAM,eAAeoB,oBAAA;AACrB,QAAM,QAAQ,CAAC,MAAM,UAAU,KAAK,KAAK,CAACpB,IAAG,MAAM,aAAa,GAAGA,IAAG,KAAK,CAAC;AAC5E,YAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,KAAK,CAACpB,IAAG,GAAG,UAAU,QAAQA,IAAG,GAAG,KAAK,IAAI;AACnD,SAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,KAAK,CAACpB,IAAG,GAAG,UAAU,QAAQA,IAAG,GAAG,KAAK,IAAI;AACnD,SAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,KAAK,CAACpB,IAAG,GAAG,UAAU,QAAQA,IAAG,GAAG,KAAK,MAAM;AACrD,SAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,MAAM,CAACpB,IAAG,GAAG,UAAU,QAAQA,IAAG,GAAG,KAAK,MAAM;AACtD,UAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,MAAM,CAACpB,IAAG,GAAG,UAAU,QAAQA,IAAG,GAAG,KAAK,KAAK;AACrD,UAAiB;;;;;;;;ACJjB;AAEA,QAAM,UAAUoB,eAAA;AAChB,QAAM,MAAM,CAACpB,IAAG,GAAG,UAAU,QAAQA,IAAG,GAAG,KAAK,KAAK;AACrD,UAAiB;;;;;;;;ACJjB;AAEA,QAAM,KAAKoB,UAAA;AACX,QAAM,MAAMb,WAAA;AACZ,QAAM,KAAKC,UAAA;AACX,QAAM,MAAMM,WAAA;AACZ,QAAM,KAAKJ,UAAA;AACX,QAAM,MAAME,WAAA;AAEZ,QAAM,MAAM,CAACZ,IAAG,IAAI,GAAG,UAAU;AAC/B,YAAQ,IAAE;AAAA,MACR,KAAK;AACH,YAAI,OAAOA,OAAM,UAAU;AACzB,UAAAA,KAAIA,GAAE;AAAA,QACd;AACM,YAAI,OAAO,MAAM,UAAU;AACzB,cAAI,EAAE;AAAA,QACd;AACM,eAAOA,OAAM;AAAA,MAEf,KAAK;AACH,YAAI,OAAOA,OAAM,UAAU;AACzB,UAAAA,KAAIA,GAAE;AAAA,QACd;AACM,YAAI,OAAO,MAAM,UAAU;AACzB,cAAI,EAAE;AAAA,QACd;AACM,eAAOA,OAAM;AAAA,MAEf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,GAAGA,IAAG,GAAG,KAAK;AAAA,MAEvB,KAAK;AACH,eAAO,IAAIA,IAAG,GAAG,KAAK;AAAA,MAExB,KAAK;AACH,eAAO,GAAGA,IAAG,GAAG,KAAK;AAAA,MAEvB,KAAK;AACH,eAAO,IAAIA,IAAG,GAAG,KAAK;AAAA,MAExB,KAAK;AACH,eAAO,GAAGA,IAAG,GAAG,KAAK;AAAA,MAEvB,KAAK;AACH,eAAO,IAAIA,IAAG,GAAG,KAAK;AAAA,MAExB;AACE,cAAM,IAAI,UAAU,qBAAqB,EAAE,EAAE;AAAA;EAEnD;AACA,UAAiB;;;;;;;;ACrDjB;AAEA,QAAM,SAASoB,gBAAA;AACf,QAAM,QAAQb,aAAA;AACd,QAAM,EAAE,QAAQsG,KAAI,EAAC,IAAKrG,UAAA;AAE1B,QAAM,SAAS,CAACyF,UAAS,YAAY;AACnC,QAAIA,oBAAmB,QAAQ;AAC7B,aAAOA;AAAA,IACX;AAEE,QAAI,OAAOA,aAAY,UAAU;AAC/B,MAAAA,WAAU,OAAOA,QAAO;AAAA,IAC5B;AAEE,QAAI,OAAOA,aAAY,UAAU;AAC/B,aAAO;AAAA,IACX;AAEE,cAAU,WAAW,CAAA;AAErB,QAAI,QAAQ;AACZ,QAAI,CAAC,QAAQ,KAAK;AAChB,cAAQA,SAAQ,MAAM,QAAQ,oBAAoBY,IAAG,EAAE,UAAU,IAAIA,IAAG,EAAE,MAAM,CAAC;AAAA,IACrF,OAAS;AAUL,YAAM,iBAAiB,QAAQ,oBAAoBA,IAAG,EAAE,aAAa,IAAIA,IAAG,EAAE,SAAS;AACvF,UAAI;AACJ,cAAQ,OAAO,eAAe,KAAKZ,QAAO,OACrC,CAAC,SAAS,MAAM,QAAQ,MAAM,CAAC,EAAE,WAAWA,SAAQ,SACvD;AACA,YAAI,CAAC,SACC,KAAK,QAAQ,KAAK,CAAC,EAAE,WAAW,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ;AACnE,kBAAQ;AAAA,QAChB;AACM,uBAAe,YAAY,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE;AAAA,MACvE;AAEI,qBAAe,YAAY;AAAA,IAC/B;AAEE,QAAI,UAAU,MAAM;AAClB,aAAO;AAAA,IACX;AAEE,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,UAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,UAAM,aAAa,QAAQ,qBAAqB,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK;AAC5E,UAAM,QAAQ,QAAQ,qBAAqB,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK;AAEvE,WAAO,MAAM,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,UAAU,GAAG,KAAK,IAAI,OAAO;AAAA,EACzE;AACA,aAAiB;;;;;;;;AC7DjB;AAAA,EAEA,MAAM,SAAS;AAAA,IACb,cAAe;AACb,WAAK,MAAM;AACX,WAAK,MAAM,oBAAI,IAAG;AAAA,IACtB;AAAA,IAEE,IAAK,KAAK;AACR,YAAM,QAAQ,KAAK,IAAI,IAAI,GAAG;AAC9B,UAAI,UAAU,QAAW;AACvB,eAAO;AAAA,MACb,OAAW;AAEL,aAAK,IAAI,OAAO,GAAG;AACnB,aAAK,IAAI,IAAI,KAAK,KAAK;AACvB,eAAO;AAAA,MACb;AAAA,IACA;AAAA,IAEE,OAAQ,KAAK;AACX,aAAO,KAAK,IAAI,OAAO,GAAG;AAAA,IAC9B;AAAA,IAEE,IAAK,KAAK,OAAO;AACf,YAAM,UAAU,KAAK,OAAO,GAAG;AAE/B,UAAI,CAAC,WAAW,UAAU,QAAW;AAEnC,YAAI,KAAK,IAAI,QAAQ,KAAK,KAAK;AAC7B,gBAAM,WAAW,KAAK,IAAI,KAAI,EAAG,KAAI,EAAG;AACxC,eAAK,OAAO,QAAQ;AAAA,QAC5B;AAEM,aAAK,IAAI,IAAI,KAAK,KAAK;AAAA,MAC7B;AAEI,aAAO;AAAA,IACX;AAAA;AAGA,aAAiB;;;;;;;;ACzCjB;AAEA,QAAM,mBAAmB;AAAA,EAGzB,MAAM,MAAM;AAAA,IACV,YAAaE,QAAO,SAAS;AAC3B,gBAAU,aAAa,OAAO;AAE9B,UAAIA,kBAAiB,OAAO;AAC1B,YACEA,OAAM,UAAU,CAAC,CAAC,QAAQ,SAC1BA,OAAM,sBAAsB,CAAC,CAAC,QAAQ,mBACtC;AACA,iBAAOA;AAAA,QACf,OAAa;AACL,iBAAO,IAAI,MAAMA,OAAM,KAAK,OAAO;AAAA,QAC3C;AAAA,MACA;AAEI,UAAIA,kBAAiB,YAAY;AAE/B,aAAK,MAAMA,OAAM;AACjB,aAAK,MAAM,CAAC,CAACA,MAAK,CAAC;AACnB,aAAK,YAAY;AACjB,eAAO;AAAA,MACb;AAEI,WAAK,UAAU;AACf,WAAK,QAAQ,CAAC,CAAC,QAAQ;AACvB,WAAK,oBAAoB,CAAC,CAAC,QAAQ;AAKnC,WAAK,MAAMA,OAAM,KAAI,EAAG,QAAQ,kBAAkB,GAAG;AAGrD,WAAK,MAAM,KAAK,IACb,MAAM,IAAI,EAEV,IAAI,OAAK,KAAK,WAAW,EAAE,KAAI,CAAE,CAAC,EAIlC,OAAO,CAAAzG,OAAKA,GAAE,MAAM;AAEvB,UAAI,CAAC,KAAK,IAAI,QAAQ;AACpB,cAAM,IAAI,UAAU,yBAAyB,KAAK,GAAG,EAAE;AAAA,MAC7D;AAGI,UAAI,KAAK,IAAI,SAAS,GAAG;AAEvB,cAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,aAAK,MAAM,KAAK,IAAI,OAAO,CAAAA,OAAK,CAAC,UAAUA,GAAE,CAAC,CAAC,CAAC;AAChD,YAAI,KAAK,IAAI,WAAW,GAAG;AACzB,eAAK,MAAM,CAAC,KAAK;AAAA,QACzB,WAAiB,KAAK,IAAI,SAAS,GAAG;AAE9B,qBAAWA,MAAK,KAAK,KAAK;AACxB,gBAAIA,GAAE,WAAW,KAAK,MAAMA,GAAE,CAAC,CAAC,GAAG;AACjC,mBAAK,MAAM,CAACA,EAAC;AACb;AAAA,YACZ;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAEI,WAAK,YAAY;AAAA,IACrB;AAAA,IAEE,IAAI,QAAS;AACX,UAAI,KAAK,cAAc,QAAW;AAChC,aAAK,YAAY;AACjB,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,QAAQ,KAAK;AACxC,cAAI,IAAI,GAAG;AACT,iBAAK,aAAa;AAAA,UAC5B;AACQ,gBAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAI,IAAI,GAAG;AACT,mBAAK,aAAa;AAAA,YAC9B;AACU,iBAAK,aAAa,MAAM,CAAC,EAAE,SAAQ,EAAG,KAAI;AAAA,UACpD;AAAA,QACA;AAAA,MACA;AACI,aAAO,KAAK;AAAA,IAChB;AAAA,IAEE,SAAU;AACR,aAAO,KAAK;AAAA,IAChB;AAAA,IAEE,WAAY;AACV,aAAO,KAAK;AAAA,IAChB;AAAA,IAEE,WAAYyG,QAAO;AAGjB,YAAM,YACH,KAAK,QAAQ,qBAAqB,4BAClC,KAAK,QAAQ,SAAS;AACzB,YAAM,UAAU,WAAW,MAAMA;AACjC,YAAM,SAAS,MAAM,IAAI,OAAO;AAChC,UAAI,QAAQ;AACV,eAAO;AAAA,MACb;AAEI,YAAM,QAAQ,KAAK,QAAQ;AAE3B,YAAM,KAAK,QAAQU,IAAG,EAAE,gBAAgB,IAAIA,IAAG,EAAE,WAAW;AAC5D,MAAAV,SAAQA,OAAM,QAAQ,IAAI,cAAc,KAAK,QAAQ,iBAAiB,CAAC;AACvE,YAAM,kBAAkBA,MAAK;AAG7B,MAAAA,SAAQA,OAAM,QAAQU,IAAG,EAAE,cAAc,GAAG,qBAAqB;AACjE,YAAM,mBAAmBV,MAAK;AAG9B,MAAAA,SAAQA,OAAM,QAAQU,IAAG,EAAE,SAAS,GAAG,gBAAgB;AACvD,YAAM,cAAcV,MAAK;AAGzB,MAAAA,SAAQA,OAAM,QAAQU,IAAG,EAAE,SAAS,GAAG,gBAAgB;AACvD,YAAM,cAAcV,MAAK;AAKzB,UAAI,YAAYA,OACb,MAAM,GAAG,EACT,IAAI,UAAQ,gBAAgB,MAAM,KAAK,OAAO,CAAC,EAC/C,KAAK,GAAG,EACR,MAAM,KAAK,EAEX,IAAI,UAAQ,YAAY,MAAM,KAAK,OAAO,CAAC;AAE9C,UAAI,OAAO;AAET,oBAAY,UAAU,OAAO,UAAQ;AACnC,gBAAM,wBAAwB,MAAM,KAAK,OAAO;AAChD,iBAAO,CAAC,CAAC,KAAK,MAAMU,IAAG,EAAE,eAAe,CAAC;AAAA,QACjD,CAAO;AAAA,MACP;AACI,YAAM,cAAc,SAAS;AAK7B,YAAM,WAAW,oBAAI,IAAG;AACxB,YAAM,cAAc,UAAU,IAAI,UAAQ,IAAI,WAAW,MAAM,KAAK,OAAO,CAAC;AAC5E,iBAAW,QAAQ,aAAa;AAC9B,YAAI,UAAU,IAAI,GAAG;AACnB,iBAAO,CAAC,IAAI;AAAA,QACpB;AACM,iBAAS,IAAI,KAAK,OAAO,IAAI;AAAA,MACnC;AACI,UAAI,SAAS,OAAO,KAAK,SAAS,IAAI,EAAE,GAAG;AACzC,iBAAS,OAAO,EAAE;AAAA,MACxB;AAEI,YAAM,SAAS,CAAC,GAAG,SAAS,OAAM,CAAE;AACpC,YAAM,IAAI,SAAS,MAAM;AACzB,aAAO;AAAA,IACX;AAAA,IAEE,WAAYV,QAAO,SAAS;AAC1B,UAAI,EAAEA,kBAAiB,QAAQ;AAC7B,cAAM,IAAI,UAAU,qBAAqB;AAAA,MAC/C;AAEI,aAAO,KAAK,IAAI,KAAK,CAAC,oBAAoB;AACxC,eACE,cAAc,iBAAiB,OAAO,KACtCA,OAAM,IAAI,KAAK,CAAC,qBAAqB;AACnC,iBACE,cAAc,kBAAkB,OAAO,KACvC,gBAAgB,MAAM,CAAC,mBAAmB;AACxC,mBAAO,iBAAiB,MAAM,CAAC,oBAAoB;AACjD,qBAAO,eAAe,WAAW,iBAAiB,OAAO;AAAA,YACzE,CAAe;AAAA,UACf,CAAa;AAAA,QAEb,CAAS;AAAA,MAET,CAAK;AAAA,IACL;AAAA;AAAA,IAGE,KAAMF,UAAS;AACb,UAAI,CAACA,UAAS;AACZ,eAAO;AAAA,MACb;AAEI,UAAI,OAAOA,aAAY,UAAU;AAC/B,YAAI;AACF,UAAAA,WAAU,IAAI,OAAOA,UAAS,KAAK,OAAO;AAAA,QAClD,SAAe,IAAI;AACX,iBAAO;AAAA,QACf;AAAA,MACA;AAEI,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,QAAQ,KAAK;AACxC,YAAI,QAAQ,KAAK,IAAI,CAAC,GAAGA,UAAS,KAAK,OAAO,GAAG;AAC/C,iBAAO;AAAA,QACf;AAAA,MACA;AACI,aAAO;AAAA,IACX;AAAA;AAGAE,YAAiB;AAEjB,QAAM,MAAM/E,gBAAA;AACZ,QAAM,QAAQ,IAAI,IAAG;AAErB,QAAM,eAAeb,oBAAA;AACrB,QAAM,aAAaC,kBAAA;AACnB,QAAM,QAAQM,aAAA;AACd,QAAM,SAASJ,gBAAA;AACf,QAAM;AAAA,IACJ,QAAQmG;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAIjG,UAAA;AACJ,QAAM,EAAE,yBAAyB,WAAU,IAAK0E,iBAAA;AAEhD,QAAM,YAAY,CAAA5F,OAAKA,GAAE,UAAU;AACnC,QAAM,QAAQ,CAAAA,OAAKA,GAAE,UAAU;AAI/B,QAAM,gBAAgB,CAAC,aAAa,YAAY;AAC9C,QAAI,SAAS;AACb,UAAM,uBAAuB,YAAY,MAAK;AAC9C,QAAI,iBAAiB,qBAAqB,IAAG;AAE7C,WAAO,UAAU,qBAAqB,QAAQ;AAC5C,eAAS,qBAAqB,MAAM,CAAC,oBAAoB;AACvD,eAAO,eAAe,WAAW,iBAAiB,OAAO;AAAA,MAC/D,CAAK;AAED,uBAAiB,qBAAqB,IAAG;AAAA,IAC7C;AAEE,WAAO;AAAA,EACT;AAKA,QAAM,kBAAkB,CAAC,MAAM,YAAY;AACzC,UAAM,QAAQ,MAAM,OAAO;AAC3B,WAAO,cAAc,MAAM,OAAO;AAClC,UAAM,SAAS,IAAI;AACnB,WAAO,cAAc,MAAM,OAAO;AAClC,UAAM,UAAU,IAAI;AACpB,WAAO,eAAe,MAAM,OAAO;AACnC,UAAM,UAAU,IAAI;AACpB,WAAO,aAAa,MAAM,OAAO;AACjC,UAAM,SAAS,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,QAAM,CAAC,MAAM,GAAG,YAAW,MAAO,OAAO,OAAO;AAS5D,QAAM,gBAAgB,CAAC,MAAM,YAAY;AACvC,WAAO,KACJ,KAAI,EACJ,MAAM,KAAK,EACX,IAAI,CAACA,OAAM,aAAaA,IAAG,OAAO,CAAC,EACnC,KAAK,GAAG;AAAA,EACb;AAEA,QAAM,eAAe,CAAC,MAAM,YAAY;AACtC,UAAM,IAAI,QAAQ,QAAQmH,IAAG,EAAE,UAAU,IAAIA,IAAG,EAAE,KAAK;AACvD,WAAO,KAAK,QAAQ,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,OAAO;AACzC,YAAM,SAAS,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE;AACnC,UAAI;AAEJ,UAAI,IAAI,CAAC,GAAG;AACV,cAAM;AAAA,MACZ,WAAe,IAAI,CAAC,GAAG;AACjB,cAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MACjC,WAAe,IAAI,CAAC,GAAG;AAEjB,cAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MACzC,WAAe,IAAI;AACb,cAAM,mBAAmB,EAAE;AAC3B,cAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAChC,KAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MACtB,OAAW;AAEL,cAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAC3B,KAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MACtB;AAEI,YAAM,gBAAgB,GAAG;AACzB,aAAO;AAAA,IACX,CAAG;AAAA,EACH;AAUA,QAAM,gBAAgB,CAAC,MAAM,YAAY;AACvC,WAAO,KACJ,KAAI,EACJ,MAAM,KAAK,EACX,IAAI,CAACnH,OAAM,aAAaA,IAAG,OAAO,CAAC,EACnC,KAAK,GAAG;AAAA,EACb;AAEA,QAAM,eAAe,CAAC,MAAM,YAAY;AACtC,UAAM,SAAS,MAAM,OAAO;AAC5B,UAAM,IAAI,QAAQ,QAAQmH,IAAG,EAAE,UAAU,IAAIA,IAAG,EAAE,KAAK;AACvD,UAAMN,KAAI,QAAQ,oBAAoB,OAAO;AAC7C,WAAO,KAAK,QAAQ,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,OAAO;AACzC,YAAM,SAAS,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE;AACnC,UAAI;AAEJ,UAAI,IAAI,CAAC,GAAG;AACV,cAAM;AAAA,MACZ,WAAe,IAAI,CAAC,GAAG;AACjB,cAAM,KAAK,CAAC,OAAOA,EAAC,KAAK,CAAC,IAAI,CAAC;AAAA,MACrC,WAAe,IAAI,CAAC,GAAG;AACjB,YAAI,MAAM,KAAK;AACb,gBAAM,KAAK,CAAC,IAAI,CAAC,KAAKA,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,QAC/C,OAAa;AACL,gBAAM,KAAK,CAAC,IAAI,CAAC,KAAKA,EAAC,KAAK,CAAC,IAAI,CAAC;AAAA,QAC1C;AAAA,MACA,WAAe,IAAI;AACb,cAAM,mBAAmB,EAAE;AAC3B,YAAI,MAAM,KAAK;AACb,cAAI,MAAM,KAAK;AACb,kBAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACpC,KAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,UAC/B,OAAe;AACL,kBAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACpC,KAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,UAC1B;AAAA,QACA,OAAa;AACL,gBAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OACrB,CAAC,IAAI,CAAC;AAAA,QACnB;AAAA,MACA,OAAW;AACL,cAAM,OAAO;AACb,YAAI,MAAM,KAAK;AACb,cAAI,MAAM,KAAK;AACb,kBAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAC/B,GAAaA,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,UACnC,OAAe;AACL,kBAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAC/B,GAAaA,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,UAC9B;AAAA,QACA,OAAa;AACL,gBAAM,KAAK,CAAC,IAAI,CAAC,IAAI,MAChB,CAAC,IAAI,CAAC;AAAA,QACnB;AAAA,MACA;AAEI,YAAM,gBAAgB,GAAG;AACzB,aAAO;AAAA,IACX,CAAG;AAAA,EACH;AAEA,QAAM,iBAAiB,CAAC,MAAM,YAAY;AACxC,UAAM,kBAAkB,MAAM,OAAO;AACrC,WAAO,KACJ,MAAM,KAAK,EACX,IAAI,CAAC7G,OAAM,cAAcA,IAAG,OAAO,CAAC,EACpC,KAAK,GAAG;AAAA,EACb;AAEA,QAAM,gBAAgB,CAAC,MAAM,YAAY;AACvC,WAAO,KAAK,KAAI;AAChB,UAAM,IAAI,QAAQ,QAAQmH,IAAG,EAAE,WAAW,IAAIA,IAAG,EAAE,MAAM;AACzD,WAAO,KAAK,QAAQ,GAAG,CAAC,KAAK,MAAM,GAAG,GAAG,GAAG,OAAO;AACjD,YAAM,UAAU,MAAM,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAC5C,YAAM,KAAK,IAAI,CAAC;AAChB,YAAM,KAAK,MAAM,IAAI,CAAC;AACtB,YAAM,KAAK,MAAM,IAAI,CAAC;AACtB,YAAM,OAAO;AAEb,UAAI,SAAS,OAAO,MAAM;AACxB,eAAO;AAAA,MACb;AAII,WAAK,QAAQ,oBAAoB,OAAO;AAExC,UAAI,IAAI;AACN,YAAI,SAAS,OAAO,SAAS,KAAK;AAEhC,gBAAM;AAAA,QACd,OAAa;AAEL,gBAAM;AAAA,QACd;AAAA,MACA,WAAe,QAAQ,MAAM;AAGvB,YAAI,IAAI;AACN,cAAI;AAAA,QACZ;AACM,YAAI;AAEJ,YAAI,SAAS,KAAK;AAGhB,iBAAO;AACP,cAAI,IAAI;AACN,gBAAI,CAAC,IAAI;AACT,gBAAI;AACJ,gBAAI;AAAA,UACd,OAAe;AACL,gBAAI,CAAC,IAAI;AACT,gBAAI;AAAA,UACd;AAAA,QACA,WAAiB,SAAS,MAAM;AAGxB,iBAAO;AACP,cAAI,IAAI;AACN,gBAAI,CAAC,IAAI;AAAA,UACnB,OAAe;AACL,gBAAI,CAAC,IAAI;AAAA,UACnB;AAAA,QACA;AAEM,YAAI,SAAS,KAAK;AAChB,eAAK;AAAA,QACb;AAEM,cAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AAAA,MACtC,WAAe,IAAI;AACb,cAAM,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;AAAA,MACtC,WAAe,IAAI;AACb,cAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAC5B,KAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MACtB;AAEI,YAAM,iBAAiB,GAAG;AAE1B,aAAO;AAAA,IACX,CAAG;AAAA,EACH;AAIA,QAAM,eAAe,CAAC,MAAM,YAAY;AACtC,UAAM,gBAAgB,MAAM,OAAO;AAEnC,WAAO,KACJ,KAAI,EACJ,QAAQA,IAAG,EAAE,IAAI,GAAG,EAAE;AAAA,EAC3B;AAEA,QAAM,cAAc,CAAC,MAAM,YAAY;AACrC,UAAM,eAAe,MAAM,OAAO;AAClC,WAAO,KACJ,KAAI,EACJ,QAAQA,IAAG,QAAQ,oBAAoB,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE;AAAA,EACnE;AAQA,QAAM,gBAAgB,WAAS,CAAC,IAC9B,MAAM,IAAI,IAAI,IAAI,KAAK,IACvB,IAAI,IAAI,IAAI,IAAI,QAAQ;AACxB,QAAI,IAAI,EAAE,GAAG;AACX,aAAO;AAAA,IACX,WAAa,IAAI,EAAE,GAAG;AAClB,aAAO,KAAK,EAAE,OAAO,QAAQ,OAAO,EAAE;AAAA,IAC1C,WAAa,IAAI,EAAE,GAAG;AAClB,aAAO,KAAK,EAAE,IAAI,EAAE,KAAK,QAAQ,OAAO,EAAE;AAAA,IAC9C,WAAa,KAAK;AACd,aAAO,KAAK,IAAI;AAAA,IACpB,OAAS;AACL,aAAO,KAAK,IAAI,GAAG,QAAQ,OAAO,EAAE;AAAA,IACxC;AAEE,QAAI,IAAI,EAAE,GAAG;AACX,WAAK;AAAA,IACT,WAAa,IAAI,EAAE,GAAG;AAClB,WAAK,IAAI,CAAC,KAAK,CAAC;AAAA,IACpB,WAAa,IAAI,EAAE,GAAG;AAClB,WAAK,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;AAAA,IAC1B,WAAa,KAAK;AACd,WAAK,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG;AAAA,IACnC,WAAa,OAAO;AAChB,WAAK,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;AAAA,IAChC,OAAS;AACL,WAAK,KAAK,EAAE;AAAA,IAChB;AAEE,WAAO,GAAG,IAAI,IAAI,EAAE,GAAG,KAAI;AAAA,EAC7B;AAEA,QAAM,UAAU,CAAC,KAAKZ,UAAS,YAAY;AACzC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAI,CAAC,IAAI,CAAC,EAAE,KAAKA,QAAO,GAAG;AACzB,eAAO;AAAA,MACb;AAAA,IACA;AAEE,QAAIA,SAAQ,WAAW,UAAU,CAAC,QAAQ,mBAAmB;AAM3D,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,cAAM,IAAI,CAAC,EAAE,MAAM;AACnB,YAAI,IAAI,CAAC,EAAE,WAAW,WAAW,KAAK;AACpC;AAAA,QACR;AAEM,YAAI,IAAI,CAAC,EAAE,OAAO,WAAW,SAAS,GAAG;AACvC,gBAAM,UAAU,IAAI,CAAC,EAAE;AACvB,cAAI,QAAQ,UAAUA,SAAQ,SAC1B,QAAQ,UAAUA,SAAQ,SAC1B,QAAQ,UAAUA,SAAQ,OAAO;AACnC,mBAAO;AAAA,UACjB;AAAA,QACA;AAAA,MACA;AAGI,aAAO;AAAA,IACX;AAEE,WAAO;AAAA,EACT;;;;;;;;AC3iBA;AAEA,QAAM,MAAM,OAAO,YAAY;AAAA,EAE/B,MAAM,WAAW;AAAA,IACf,WAAW,MAAO;AAChB,aAAO;AAAA,IACX;AAAA,IAEE,YAAa,MAAM,SAAS;AAC1B,gBAAU,aAAa,OAAO;AAE9B,UAAI,gBAAgB,YAAY;AAC9B,YAAI,KAAK,UAAU,CAAC,CAAC,QAAQ,OAAO;AAClC,iBAAO;AAAA,QACf,OAAa;AACL,iBAAO,KAAK;AAAA,QACpB;AAAA,MACA;AAEI,aAAO,KAAK,KAAI,EAAG,MAAM,KAAK,EAAE,KAAK,GAAG;AACxC,YAAM,cAAc,MAAM,OAAO;AACjC,WAAK,UAAU;AACf,WAAK,QAAQ,CAAC,CAAC,QAAQ;AACvB,WAAK,MAAM,IAAI;AAEf,UAAI,KAAK,WAAW,KAAK;AACvB,aAAK,QAAQ;AAAA,MACnB,OAAW;AACL,aAAK,QAAQ,KAAK,WAAW,KAAK,OAAO;AAAA,MAC/C;AAEI,YAAM,QAAQ,IAAI;AAAA,IACtB;AAAA,IAEE,MAAO,MAAM;AACX,YAAM,IAAI,KAAK,QAAQ,QAAQY,IAAG,EAAE,eAAe,IAAIA,IAAG,EAAE,UAAU;AACtE,YAAM,IAAI,KAAK,MAAM,CAAC;AAEtB,UAAI,CAAC,GAAG;AACN,cAAM,IAAI,UAAU,uBAAuB,IAAI,EAAE;AAAA,MACvD;AAEI,WAAK,WAAW,EAAE,CAAC,MAAM,SAAY,EAAE,CAAC,IAAI;AAC5C,UAAI,KAAK,aAAa,KAAK;AACzB,aAAK,WAAW;AAAA,MACtB;AAGI,UAAI,CAAC,EAAE,CAAC,GAAG;AACT,aAAK,SAAS;AAAA,MACpB,OAAW;AACL,aAAK,SAAS,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,QAAQ,KAAK;AAAA,MACvD;AAAA,IACA;AAAA,IAEE,WAAY;AACV,aAAO,KAAK;AAAA,IAChB;AAAA,IAEE,KAAMZ,UAAS;AACb,YAAM,mBAAmBA,UAAS,KAAK,QAAQ,KAAK;AAEpD,UAAI,KAAK,WAAW,OAAOA,aAAY,KAAK;AAC1C,eAAO;AAAA,MACb;AAEI,UAAI,OAAOA,aAAY,UAAU;AAC/B,YAAI;AACF,UAAAA,WAAU,IAAI,OAAOA,UAAS,KAAK,OAAO;AAAA,QAClD,SAAe,IAAI;AACX,iBAAO;AAAA,QACf;AAAA,MACA;AAEI,aAAO,IAAIA,UAAS,KAAK,UAAU,KAAK,QAAQ,KAAK,OAAO;AAAA,IAChE;AAAA,IAEE,WAAY,MAAM,SAAS;AACzB,UAAI,EAAE,gBAAgB,aAAa;AACjC,cAAM,IAAI,UAAU,0BAA0B;AAAA,MACpD;AAEI,UAAI,KAAK,aAAa,IAAI;AACxB,YAAI,KAAK,UAAU,IAAI;AACrB,iBAAO;AAAA,QACf;AACM,eAAO,IAAI,MAAM,KAAK,OAAO,OAAO,EAAE,KAAK,KAAK,KAAK;AAAA,MAC3D,WAAe,KAAK,aAAa,IAAI;AAC/B,YAAI,KAAK,UAAU,IAAI;AACrB,iBAAO;AAAA,QACf;AACM,eAAO,IAAI,MAAM,KAAK,OAAO,OAAO,EAAE,KAAK,KAAK,MAAM;AAAA,MAC5D;AAEI,gBAAU,aAAa,OAAO;AAG9B,UAAI,QAAQ,sBACT,KAAK,UAAU,cAAc,KAAK,UAAU,aAAa;AAC1D,eAAO;AAAA,MACb;AACI,UAAI,CAAC,QAAQ,sBACV,KAAK,MAAM,WAAW,QAAQ,KAAK,KAAK,MAAM,WAAW,QAAQ,IAAI;AACtE,eAAO;AAAA,MACb;AAGI,UAAI,KAAK,SAAS,WAAW,GAAG,KAAK,KAAK,SAAS,WAAW,GAAG,GAAG;AAClE,eAAO;AAAA,MACb;AAEI,UAAI,KAAK,SAAS,WAAW,GAAG,KAAK,KAAK,SAAS,WAAW,GAAG,GAAG;AAClE,eAAO;AAAA,MACb;AAEI,UACG,KAAK,OAAO,YAAY,KAAK,OAAO,WACrC,KAAK,SAAS,SAAS,GAAG,KAAK,KAAK,SAAS,SAAS,GAAG,GAAG;AAC5D,eAAO;AAAA,MACb;AAEI,UAAI,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,OAAO,KAC5C,KAAK,SAAS,WAAW,GAAG,KAAK,KAAK,SAAS,WAAW,GAAG,GAAG;AAChE,eAAO;AAAA,MACb;AAEI,UAAI,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,OAAO,KAC5C,KAAK,SAAS,WAAW,GAAG,KAAK,KAAK,SAAS,WAAW,GAAG,GAAG;AAChE,eAAO;AAAA,MACb;AACI,aAAO;AAAA,IACX;AAAA;AAGA,eAAiB;AAEjB,QAAM,eAAe7E,oBAAA;AACrB,QAAM,EAAE,QAAQyF,KAAI,EAAC,IAAKtG,UAAA;AAC1B,QAAM,MAAMC,WAAA;AACZ,QAAM,QAAQM,aAAA;AACd,QAAM,SAASJ,gBAAA;AACf,QAAM,QAAQE,aAAA;;;;;;;;AC9Id;AAEA,QAAM,QAAQQ,aAAA;AACd,QAAM,YAAY,CAAC6E,UAASE,QAAO,YAAY;AAC7C,QAAI;AACF,MAAAA,SAAQ,IAAI,MAAMA,QAAO,OAAO;AAAA,IACpC,SAAW,IAAI;AACX,aAAO;AAAA,IACX;AACE,WAAOA,OAAM,KAAKF,QAAO;AAAA,EAC3B;AACA,gBAAiB;;;;;;;;ACXjB;AAEA,QAAM,QAAQ7E,aAAA;AAGd,QAAM,gBAAgB,CAAC+E,QAAO,YAC5B,IAAI,MAAMA,QAAO,OAAO,EAAE,IACvB,IAAI,UAAQ,KAAK,IAAI,CAAAzG,OAAKA,GAAE,KAAK,EAAE,KAAK,GAAG,EAAE,KAAI,EAAG,MAAM,GAAG,CAAC;AAEnE,oBAAiB;;;;;;;;ACTjB;AAEA,QAAM,SAAS0B,gBAAA;AACf,QAAM,QAAQb,aAAA;AAEd,QAAM,gBAAgB,CAAC,UAAU4F,QAAO,YAAY;AAClD,QAAI,MAAM;AACV,QAAI,QAAQ;AACZ,QAAI,WAAW;AACf,QAAI;AACF,iBAAW,IAAI,MAAMA,QAAO,OAAO;AAAA,IACvC,SAAW,IAAI;AACX,aAAO;AAAA,IACX;AACE,aAAS,QAAQ,CAAC,MAAM;AACtB,UAAI,SAAS,KAAK,CAAC,GAAG;AAEpB,YAAI,CAAC,OAAO,MAAM,QAAQ,CAAC,MAAM,IAAI;AAEnC,gBAAM;AACN,kBAAQ,IAAI,OAAO,KAAK,OAAO;AAAA,QACvC;AAAA,MACA;AAAA,IACA,CAAG;AACD,WAAO;AAAA,EACT;AACA,oBAAiB;;;;;;;;AC1BjB;AAEA,QAAM,SAAS/E,gBAAA;AACf,QAAM,QAAQb,aAAA;AACd,QAAM,gBAAgB,CAAC,UAAU4F,QAAO,YAAY;AAClD,QAAI,MAAM;AACV,QAAI,QAAQ;AACZ,QAAI,WAAW;AACf,QAAI;AACF,iBAAW,IAAI,MAAMA,QAAO,OAAO;AAAA,IACvC,SAAW,IAAI;AACX,aAAO;AAAA,IACX;AACE,aAAS,QAAQ,CAAC,MAAM;AACtB,UAAI,SAAS,KAAK,CAAC,GAAG;AAEpB,YAAI,CAAC,OAAO,MAAM,QAAQ,CAAC,MAAM,GAAG;AAElC,gBAAM;AACN,kBAAQ,IAAI,OAAO,KAAK,OAAO;AAAA,QACvC;AAAA,MACA;AAAA,IACA,CAAG;AACD,WAAO;AAAA,EACT;AACA,oBAAiB;;;;;;;;ACzBjB;AAEA,QAAM,SAAS/E,gBAAA;AACf,QAAM,QAAQb,aAAA;AACd,QAAM,KAAKC,UAAA;AAEX,QAAM,aAAa,CAAC2F,QAAO,UAAU;AACnC,IAAAA,SAAQ,IAAI,MAAMA,QAAO,KAAK;AAE9B,QAAI,SAAS,IAAI,OAAO,OAAO;AAC/B,QAAIA,OAAM,KAAK,MAAM,GAAG;AACtB,aAAO;AAAA,IACX;AAEE,aAAS,IAAI,OAAO,SAAS;AAC7B,QAAIA,OAAM,KAAK,MAAM,GAAG;AACtB,aAAO;AAAA,IACX;AAEE,aAAS;AACT,aAAS,IAAI,GAAG,IAAIA,OAAM,IAAI,QAAQ,EAAE,GAAG;AACzC,YAAM,cAAcA,OAAM,IAAI,CAAC;AAE/B,UAAI,SAAS;AACb,kBAAY,QAAQ,CAAC6B,gBAAe;AAElC,cAAM,UAAU,IAAI,OAAOA,YAAW,OAAO,OAAO;AACpD,gBAAQA,YAAW,UAAQ;AAAA,UACzB,KAAK;AACH,gBAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,sBAAQ;AAAA,YACpB,OAAiB;AACL,sBAAQ,WAAW,KAAK,CAAC;AAAA,YACrC;AACU,oBAAQ,MAAM,QAAQ,OAAM;AAAA,UAE9B,KAAK;AAAA,UACL,KAAK;AACH,gBAAI,CAAC,UAAU,GAAG,SAAS,MAAM,GAAG;AAClC,uBAAS;AAAA,YACrB;AACU;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAEH;AAAA,UAEF;AACE,kBAAM,IAAI,MAAM,yBAAyBA,YAAW,QAAQ,EAAE;AAAA;MAExE,CAAK;AACD,UAAI,WAAW,CAAC,UAAU,GAAG,QAAQ,MAAM,IAAI;AAC7C,iBAAS;AAAA,MACf;AAAA,IACA;AAEE,QAAI,UAAU7B,OAAM,KAAK,MAAM,GAAG;AAChC,aAAO;AAAA,IACX;AAEE,WAAO;AAAA,EACT;AACA,iBAAiB;;;;;;;;AC9DjB;AAEA,QAAM,QAAQ/E,aAAA;AACd,QAAM,aAAa,CAAC+E,QAAO,YAAY;AACrC,QAAI;AAGF,aAAO,IAAI,MAAMA,QAAO,OAAO,EAAE,SAAS;AAAA,IAC9C,SAAW,IAAI;AACX,aAAO;AAAA,IACX;AAAA,EACA;AACA,UAAiB;;;;;;;;ACZjB;AAEA,QAAM,SAAS/E,gBAAA;AACf,QAAM,aAAab,kBAAA;AACnB,QAAM,EAAE,IAAG,IAAK;AAChB,QAAM,QAAQC,aAAA;AACd,QAAM,YAAYM,iBAAA;AAClB,QAAM,KAAKJ,UAAA;AACX,QAAM,KAAKE,UAAA;AACX,QAAM,MAAM0E,WAAA;AACZ,QAAM,MAAME,WAAA;AAEZ,QAAM,UAAU,CAACS,UAASE,QAAO,MAAM,YAAY;AACjD,IAAAF,WAAU,IAAI,OAAOA,UAAS,OAAO;AACrC,IAAAE,SAAQ,IAAI,MAAMA,QAAO,OAAO;AAEhC,QAAI,MAAM,OAAO,MAAM,MAAM;AAC7B,YAAQ,MAAI;AAAA,MACV,KAAK;AACH,eAAO;AACP,gBAAQ;AACR,eAAO;AACP,eAAO;AACP,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,eAAO;AACP,gBAAQ;AACR,eAAO;AACP,eAAO;AACP,gBAAQ;AACR;AAAA,MACF;AACE,cAAM,IAAI,UAAU,uCAAuC;AAAA;AAI/D,QAAI,UAAUF,UAASE,QAAO,OAAO,GAAG;AACtC,aAAO;AAAA,IACX;AAKE,aAAS,IAAI,GAAG,IAAIA,OAAM,IAAI,QAAQ,EAAE,GAAG;AACzC,YAAM,cAAcA,OAAM,IAAI,CAAC;AAE/B,UAAI,OAAO;AACX,UAAI,MAAM;AAEV,kBAAY,QAAQ,CAAC6B,gBAAe;AAClC,YAAIA,YAAW,WAAW,KAAK;AAC7B,UAAAA,cAAa,IAAI,WAAW,SAAS;AAAA,QAC7C;AACM,eAAO,QAAQA;AACf,cAAM,OAAOA;AACb,YAAI,KAAKA,YAAW,QAAQ,KAAK,QAAQ,OAAO,GAAG;AACjD,iBAAOA;AAAA,QACf,WAAiB,KAAKA,YAAW,QAAQ,IAAI,QAAQ,OAAO,GAAG;AACvD,gBAAMA;AAAA,QACd;AAAA,MACA,CAAK;AAID,UAAI,KAAK,aAAa,QAAQ,KAAK,aAAa,OAAO;AACrD,eAAO;AAAA,MACb;AAII,WAAK,CAAC,IAAI,YAAY,IAAI,aAAa,SACnC,MAAM/B,UAAS,IAAI,MAAM,GAAG;AAC9B,eAAO;AAAA,MACb,WAAe,IAAI,aAAa,SAAS,KAAKA,UAAS,IAAI,MAAM,GAAG;AAC9D,eAAO;AAAA,MACb;AAAA,IACA;AACE,WAAO;AAAA,EACT;AAEA,cAAiB;;;;;;;;ACjFjB;AAGA,QAAM,UAAU7E,eAAA;AAChB,QAAM,MAAM,CAAC6E,UAASE,QAAO,YAAY,QAAQF,UAASE,QAAO,KAAK,OAAO;AAC7E,UAAiB;;;;;;;;ACLjB;AAEA,QAAM,UAAU/E,eAAA;AAEhB,QAAM,MAAM,CAAC6E,UAASE,QAAO,YAAY,QAAQF,UAASE,QAAO,KAAK,OAAO;AAC7E,UAAiB;;;;;;;;ACLjB;AAEA,QAAM,QAAQ/E,aAAA;AACd,QAAM,aAAa,CAAC,IAAI,IAAI,YAAY;AACtC,SAAK,IAAI,MAAM,IAAI,OAAO;AAC1B,SAAK,IAAI,MAAM,IAAI,OAAO;AAC1B,WAAO,GAAG,WAAW,IAAI,OAAO;AAAA,EAClC;AACA,iBAAiB;;;;;;;;ACRjB;AAKA,QAAM,YAAYA,iBAAA;AAClB,QAAM,UAAUb,eAAA;AAChB,aAAiB,CAAC,UAAU4F,QAAO,YAAY;AAC7C,UAAM,MAAM,CAAA;AACZ,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,UAAM,IAAI,SAAS,KAAK,CAACnG,IAAG,MAAM,QAAQA,IAAG,GAAG,OAAO,CAAC;AACxD,eAAWiG,YAAW,GAAG;AACvB,YAAM,WAAW,UAAUA,UAASE,QAAO,OAAO;AAClD,UAAI,UAAU;AACZ,eAAOF;AACP,YAAI,CAAC,OAAO;AACV,kBAAQA;AAAA,QAChB;AAAA,MACA,OAAW;AACL,YAAI,MAAM;AACR,cAAI,KAAK,CAAC,OAAO,IAAI,CAAC;AAAA,QAC9B;AACM,eAAO;AACP,gBAAQ;AAAA,MACd;AAAA,IACA;AACE,QAAI,OAAO;AACT,UAAI,KAAK,CAAC,OAAO,IAAI,CAAC;AAAA,IAC1B;AAEE,UAAM,SAAS,CAAA;AACf,eAAW,CAAC,KAAK,GAAG,KAAK,KAAK;AAC5B,UAAI,QAAQ,KAAK;AACf,eAAO,KAAK,GAAG;AAAA,MACrB,WAAe,CAAC,OAAO,QAAQ,EAAE,CAAC,GAAG;AAC/B,eAAO,KAAK,GAAG;AAAA,MACrB,WAAe,CAAC,KAAK;AACf,eAAO,KAAK,KAAK,GAAG,EAAE;AAAA,MAC5B,WAAe,QAAQ,EAAE,CAAC,GAAG;AACvB,eAAO,KAAK,KAAK,GAAG,EAAE;AAAA,MAC5B,OAAW;AACL,eAAO,KAAK,GAAG,GAAG,MAAM,GAAG,EAAE;AAAA,MACnC;AAAA,IACA;AACE,UAAM,aAAa,OAAO,KAAK,MAAM;AACrC,UAAM,WAAW,OAAOE,OAAM,QAAQ,WAAWA,OAAM,MAAM,OAAOA,MAAK;AACzE,WAAO,WAAW,SAAS,SAAS,SAAS,aAAaA;AAAA,EAC5D;;;;;;;;AChDA;AAEA,QAAM,QAAQ/E,aAAA;AACd,QAAM,aAAab,kBAAA;AACnB,QAAM,EAAE,IAAG,IAAK;AAChB,QAAM,YAAYC,iBAAA;AAClB,QAAM,UAAUM,eAAA;AAsChB,QAAM,SAAS,CAAC,KAAK,KAAK,UAAU,CAAA,MAAO;AACzC,QAAI,QAAQ,KAAK;AACf,aAAO;AAAA,IACX;AAEE,UAAM,IAAI,MAAM,KAAK,OAAO;AAC5B,UAAM,IAAI,MAAM,KAAK,OAAO;AAC5B,QAAI,aAAa;AAEjB,UAAO,YAAW,aAAa,IAAI,KAAK;AACtC,iBAAW,aAAa,IAAI,KAAK;AAC/B,cAAM,QAAQ,aAAa,WAAW,WAAW,OAAO;AACxD,qBAAa,cAAc,UAAU;AACrC,YAAI,OAAO;AACT,mBAAS;AAAA,QACjB;AAAA,MACA;AAKI,UAAI,YAAY;AACd,eAAO;AAAA,MACb;AAAA,IACA;AACE,WAAO;AAAA,EACT;AAEA,QAAM,+BAA+B,CAAC,IAAI,WAAW,WAAW,CAAC;AACjE,QAAM,iBAAiB,CAAC,IAAI,WAAW,SAAS,CAAC;AAEjD,QAAM,eAAe,CAAC,KAAK,KAAK,YAAY;AAC1C,QAAI,QAAQ,KAAK;AACf,aAAO;AAAA,IACX;AAEE,QAAI,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,WAAW,KAAK;AAC7C,UAAI,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,WAAW,KAAK;AAC7C,eAAO;AAAA,MACb,WAAe,QAAQ,mBAAmB;AACpC,cAAM;AAAA,MACZ,OAAW;AACL,cAAM;AAAA,MACZ;AAAA,IACA;AAEE,QAAI,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,WAAW,KAAK;AAC7C,UAAI,QAAQ,mBAAmB;AAC7B,eAAO;AAAA,MACb,OAAW;AACL,cAAM;AAAA,MACZ;AAAA,IACA;AAEE,UAAM,QAAQ,oBAAI,IAAG;AACrB,QAAI,IAAI;AACR,eAAWpB,MAAK,KAAK;AACnB,UAAIA,GAAE,aAAa,OAAOA,GAAE,aAAa,MAAM;AAC7C,aAAK,SAAS,IAAIA,IAAG,OAAO;AAAA,MAClC,WAAeA,GAAE,aAAa,OAAOA,GAAE,aAAa,MAAM;AACpD,aAAK,QAAQ,IAAIA,IAAG,OAAO;AAAA,MACjC,OAAW;AACL,cAAM,IAAIA,GAAE,MAAM;AAAA,MACxB;AAAA,IACA;AAEE,QAAI,MAAM,OAAO,GAAG;AAClB,aAAO;AAAA,IACX;AAEE,QAAI;AACJ,QAAI,MAAM,IAAI;AACZ,iBAAW,QAAQ,GAAG,QAAQ,GAAG,QAAQ,OAAO;AAChD,UAAI,WAAW,GAAG;AAChB,eAAO;AAAA,MACb,WAAe,aAAa,MAAM,GAAG,aAAa,QAAQ,GAAG,aAAa,OAAO;AAC3E,eAAO;AAAA,MACb;AAAA,IACA;AAGE,eAAW,MAAM,OAAO;AACtB,UAAI,MAAM,CAAC,UAAU,IAAI,OAAO,EAAE,GAAG,OAAO,GAAG;AAC7C,eAAO;AAAA,MACb;AAEI,UAAI,MAAM,CAAC,UAAU,IAAI,OAAO,EAAE,GAAG,OAAO,GAAG;AAC7C,eAAO;AAAA,MACb;AAEI,iBAAWA,MAAK,KAAK;AACnB,YAAI,CAAC,UAAU,IAAI,OAAOA,EAAC,GAAG,OAAO,GAAG;AACtC,iBAAO;AAAA,QACf;AAAA,MACA;AAEI,aAAO;AAAA,IACX;AAEE,QAAI,QAAQ;AACZ,QAAI,UAAU;AAGd,QAAI,eAAe,MACjB,CAAC,QAAQ,qBACT,GAAG,OAAO,WAAW,SAAS,GAAG,SAAS;AAC5C,QAAI,eAAe,MACjB,CAAC,QAAQ,qBACT,GAAG,OAAO,WAAW,SAAS,GAAG,SAAS;AAE5C,QAAI,gBAAgB,aAAa,WAAW,WAAW,KACnD,GAAG,aAAa,OAAO,aAAa,WAAW,CAAC,MAAM,GAAG;AAC3D,qBAAe;AAAA,IACnB;AAEE,eAAWA,MAAK,KAAK;AACnB,iBAAW,YAAYA,GAAE,aAAa,OAAOA,GAAE,aAAa;AAC5D,iBAAW,YAAYA,GAAE,aAAa,OAAOA,GAAE,aAAa;AAC5D,UAAI,IAAI;AACN,YAAI,cAAc;AAChB,cAAIA,GAAE,OAAO,cAAcA,GAAE,OAAO,WAAW,UAC3CA,GAAE,OAAO,UAAU,aAAa,SAChCA,GAAE,OAAO,UAAU,aAAa,SAChCA,GAAE,OAAO,UAAU,aAAa,OAAO;AACzC,2BAAe;AAAA,UACzB;AAAA,QACA;AACM,YAAIA,GAAE,aAAa,OAAOA,GAAE,aAAa,MAAM;AAC7C,mBAAS,SAAS,IAAIA,IAAG,OAAO;AAChC,cAAI,WAAWA,MAAK,WAAW,IAAI;AACjC,mBAAO;AAAA,UACjB;AAAA,QACA,WAAiB,GAAG,aAAa,QAAQ,CAAC,UAAU,GAAG,QAAQ,OAAOA,EAAC,GAAG,OAAO,GAAG;AAC5E,iBAAO;AAAA,QACf;AAAA,MACA;AACI,UAAI,IAAI;AACN,YAAI,cAAc;AAChB,cAAIA,GAAE,OAAO,cAAcA,GAAE,OAAO,WAAW,UAC3CA,GAAE,OAAO,UAAU,aAAa,SAChCA,GAAE,OAAO,UAAU,aAAa,SAChCA,GAAE,OAAO,UAAU,aAAa,OAAO;AACzC,2BAAe;AAAA,UACzB;AAAA,QACA;AACM,YAAIA,GAAE,aAAa,OAAOA,GAAE,aAAa,MAAM;AAC7C,kBAAQ,QAAQ,IAAIA,IAAG,OAAO;AAC9B,cAAI,UAAUA,MAAK,UAAU,IAAI;AAC/B,mBAAO;AAAA,UACjB;AAAA,QACA,WAAiB,GAAG,aAAa,QAAQ,CAAC,UAAU,GAAG,QAAQ,OAAOA,EAAC,GAAG,OAAO,GAAG;AAC5E,iBAAO;AAAA,QACf;AAAA,MACA;AACI,UAAI,CAACA,GAAE,aAAa,MAAM,OAAO,aAAa,GAAG;AAC/C,eAAO;AAAA,MACb;AAAA,IACA;AAKE,QAAI,MAAM,YAAY,CAAC,MAAM,aAAa,GAAG;AAC3C,aAAO;AAAA,IACX;AAEE,QAAI,MAAM,YAAY,CAAC,MAAM,aAAa,GAAG;AAC3C,aAAO;AAAA,IACX;AAKE,QAAI,gBAAgB,cAAc;AAChC,aAAO;AAAA,IACX;AAEE,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,CAACM,IAAG,GAAG,YAAY;AAClC,QAAI,CAACA,IAAG;AACN,aAAO;AAAA,IACX;AACE,UAAM,OAAO,QAAQA,GAAE,QAAQ,EAAE,QAAQ,OAAO;AAChD,WAAO,OAAO,IAAIA,KACd,OAAO,IAAI,IACX,EAAE,aAAa,OAAOA,GAAE,aAAa,OAAO,IAC5CA;AAAA,EACN;AAGA,QAAM,UAAU,CAACA,IAAG,GAAG,YAAY;AACjC,QAAI,CAACA,IAAG;AACN,aAAO;AAAA,IACX;AACE,UAAM,OAAO,QAAQA,GAAE,QAAQ,EAAE,QAAQ,OAAO;AAChD,WAAO,OAAO,IAAIA,KACd,OAAO,IAAI,IACX,EAAE,aAAa,OAAOA,GAAE,aAAa,OAAO,IAC5CA;AAAA,EACN;AAEA,aAAiB;;;;;;;;ACxPjB;AAGA,QAAM,aAAaoB,UAAA;AACnB,QAAM6G,aAAY1H,iBAAA;AAClB,QAAM,SAASC,gBAAA;AACf,QAAM0H,eAAcpH,mBAAA;AACpB,QAAM,QAAQJ,aAAA;AACd,QAAMqH,SAAQnH,eAAA;AACd,QAAM,QAAQ0E,aAAA;AACd,QAAM,MAAME,WAAA;AACZ,QAAM,OAAO4B,YAAA;AACb,QAAM,QAAQC,aAAA;AACd,QAAM,QAAQC,aAAA;AACd,QAAM,QAAQC,aAAA;AACd,QAAM,aAAaY,kBAAA;AACnB,QAAM,UAAUC,eAAA;AAChB,QAAM,WAAWC,gBAAA;AACjB,QAAM,eAAeC,oBAAA;AACrB,QAAM,eAAeC,oBAAA;AACrB,QAAM,OAAOC,YAAA;AACb,QAAM,QAAQC,aAAA;AACd,QAAM,KAAKC,UAAA;AACX,QAAM,KAAKC,UAAA;AACX,QAAM,KAAKC,UAAA;AACX,QAAM,MAAMC,WAAA;AACZ,QAAM,MAAMC,WAAA;AACZ,QAAM,MAAMC,WAAA;AACZ,QAAM,MAAMC,WAAA;AACZ,QAAM,SAASC,cAAA;AACf,QAAM,aAAaC,kBAAA;AACnB,QAAM,QAAQC,aAAA;AACd,QAAM,YAAYC,iBAAA;AAClB,QAAM,gBAAgBC,qBAAA;AACtB,QAAM,gBAAgBC,qBAAA;AACtB,QAAM,gBAAgBC,qBAAA;AACtB,QAAM,aAAaC,kBAAA;AACnB,QAAM,aAAaC,aAAA;AACnB,QAAM,UAAUC,eAAA;AAChB,QAAM,MAAMC,WAAA;AACZ,QAAM,MAAMC,WAAA;AACZ,QAAM,aAAaC,kBAAA;AACnB,QAAM,gBAAgBC,gBAAA;AACtB,QAAM,SAASC,cAAA;AACf,WAAiB;AAAA,IACf;AAAA,IACA,OAAAhC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,WAAW;AAAA,IACf,KAAK,WAAW;AAAA,IAChB,QAAQ,WAAW;AAAA,IACnB,qBAAqBE,WAAU;AAAA,IAC/B,eAAeA,WAAU;AAAA,IACzB,oBAAoBC,aAAY;AAAA,IAChC,qBAAqBA,aAAY;AAAA,EACnC;;;;;;;;ACvFA;AAEA,QAAM,UAAU,MAAM,QAAQ,aAAa;AAE3C,MAAI,SAAS;AACb,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,QAAQ;AAEX,UAAI,QAAO,KAAM,QAAQ,QAAQ;AAC/B,cAAM,OAAO,QAAQ,OAAO;AAC5B,gBAAQ,OAAO,iBAAiB;AAChC,iBAAS,QAAQ,OAAO,UAAS;AACjC,gBAAQ,OAAO,iBAAiB;AAAA,MACtC,OAAW;AACL,iBAAS,CAAA;AAAA,MACf;AAAA,IACA;AACE,WAAO;AAAA,EACT;AAEA,cAAiB,EAAE,SAAS,UAAS;;;;;;;;ACpBrC;AAEA,QAAM5H,OAAKc;AAKX,QAAM,WAAW;AAQjB,QAAM,eAAe,CAACvB,UAASS,KAAG,aAAaT,OAAM,OAAO;AAQ5D,QAAM,WAAW,CAACA,UAAS,IAAI,QAAQ,CAAC,SAASmK,YAAW;AAC1D1J,SAAG,SAAST,OAAM,SAAS,CAAC,KAAK,SAAS;AACxC,UAAI,KAAK;AACP,QAAAmK,QAAO,GAAG;AAAA,MAChB,OAAW;AACL,gBAAQ,IAAI;AAAA,MAClB;AAAA,IACA,CAAG;AAAA,EACH,CAAC;AAED,eAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA;;;;;;;;ACpCF;AAEA,QAAM,eAAe5I;AACrB,QAAM,EAAE,SAAS,UAAS,IAAKb;AAC/B,QAAM,EAAE,UAAU,UAAU,aAAY,IAAKC,kBAAA;AAE7C,MAAI;AACJ,MAAI;AAEJ,QAAM,UAAU;AAChB,MAAI,aAAa;AAEjB,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,YAAY;AACf,aAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,qBAAa,KAAK,SAAS,CAAC,KAAK,QAAQ;AACvC,uBAAa,MAAM,MAAM;AACzB,kBAAQ,UAAU;AAAA,QAC1B,CAAO;AAAA,MACP,CAAK;AAAA,IACL;AACE,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,YAAY;AACf,UAAI;AACF,qBAAa,aAAa,SAAS,SAAS,EAAE,UAAU,QAAQ;AAAA,MACtE,SAAa,MAAM;AACb,qBAAa;AAAA,MACnB;AAAA,IACA;AACE,WAAO;AAAA,EACT;AAOA,QAAM,QAAQ;AAMd,QAAM,mBAAmB;AAOzB,QAAM,OAAO;AAEb,QAAM,aAAa,CAAC,MAAM,EAAE,SAAS,YAAY,KAAK,EAAE,SAAS,UAAU;AAE3E,QAAM,mBAAmB,MAAM;AAC7B,UAAM,SAAS,UAAS;AACxB,QAAI,OAAO,UAAU,OAAO,OAAO,qBAAqB;AACtD,aAAO;AAAA,IACX;AACE,QAAI,MAAM,QAAQ,OAAO,aAAa,GAAG;AACvC,UAAI,OAAO,cAAc,KAAK,UAAU,GAAG;AACzC,eAAO;AAAA,MACb;AAAA,IACA;AACE,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,CAAC,QAAQ;AACjC,UAAM,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,SAAS;AAC3C,QAAI,WAAW,QAAQ,SAAS,KAAK,GAAG;AACtC,aAAO;AAAA,IACX;AACE,QAAI,QAAQ,KAAK,SAAS,IAAI,GAAG;AAC/B,aAAO;AAAA,IACX;AACE,WAAO;AAAA,EACT;AAEA,QAAM,0BAA0B,CAAC,YAAY;AAC3C,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,aAAO;AAAA,IACX;AACE,QAAI,QAAQ,SAAS,eAAe,GAAG;AACrC,aAAO;AAAA,IACX;AACE,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,YAAY;AACvC,QAAI,2BAA2B,QAAW;AACxC,aAAO;AAAA,IACX;AACE,6BAAyB;AACzB,QAAI;AACF,YAAM,aAAa,MAAM,SAAS,QAAQ;AAC1C,+BAAyB,wBAAwB,UAAU;AAAA,IAC/D,SAAW,GAAG;AAAA,IAAA;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,2BAA2B,MAAM;AACrC,QAAI,2BAA2B,QAAW;AACxC,aAAO;AAAA,IACX;AACE,6BAAyB;AACzB,QAAI;AACF,YAAM,aAAa,aAAa,QAAQ;AACxC,+BAAyB,wBAAwB,UAAU;AAAA,IAC/D,SAAW,GAAG;AAAA,IAAA;AACZ,WAAO;AAAA,EACT;AAMA,QAAM,SAAS,YAAY;AACzB,QAAIyJ,UAAS;AACb,QAAI,QAAO,GAAI;AACb,MAAAA,UAAS,MAAM,qBAAoB;AACnC,UAAI,CAACA,SAAQ;AACX,QAAAA,UAAS,iBAAgB;AAAA,MAC/B;AACI,UAAI,CAACA,SAAQ;AACX,cAAM,MAAM,MAAM,YAAW;AAC7B,QAAAA,UAAS,kBAAkB,GAAG;AAAA,MACpC;AAAA,IACA;AACE,WAAOA;AAAA,EACT;AAMA,QAAM,aAAa,MAAM;AACvB,QAAIA,UAAS;AACb,QAAI,QAAO,GAAI;AACb,MAAAA,UAAS,yBAAwB;AACjC,UAAI,CAACA,SAAQ;AACX,QAAAA,UAAS,iBAAgB;AAAA,MAC/B;AACI,UAAI,CAACA,SAAQ;AACX,cAAM,MAAM,gBAAe;AAC3B,QAAAA,UAAS,kBAAkB,GAAG;AAAA,MACpC;AAAA,IACA;AACE,WAAOA;AAAA,EACT;AAMA,QAAM,kBAAkB,YAAY,QAAO,KAAM,MAAM,OAAM,MAAO;AAMpE,QAAM,sBAAsB,MAAM,aAAa,WAAU,MAAO;AAEhE,QAAM,wBAAwB,YAAY;AACxC,QAAI,4BAA4B,QAAW;AACzC,aAAO;AAAA,IACX;AACE,8BAA0B;AAC1B,QAAI;AACF,YAAM,aAAa,MAAM,SAAS,QAAQ;AAC1C,YAAM,eAAe,WAAW,MAAM,gBAAgB;AACtD,UAAI,cAAc;AAChB,kCAA0B,aAAa,CAAC;AAAA,MAC9C;AAAA,IACA,SAAW,GAAG;AAAA,IAAA;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,4BAA4B,MAAM;AACtC,QAAI,4BAA4B,QAAW;AACzC,aAAO;AAAA,IACX;AACE,8BAA0B;AAC1B,QAAI;AACF,YAAM,aAAa,aAAa,QAAQ;AACxC,YAAM,eAAe,WAAW,MAAM,gBAAgB;AACtD,UAAI,cAAc;AAChB,kCAA0B,aAAa,CAAC;AAAA,MAC9C;AAAA,IACA,SAAW,GAAG;AAAA,IAAA;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,MAAM;AAC9B,UAAM,SAAS,UAAS;AACxB,QAAI,OAAO,UAAU,OAAO,OAAO,qBAAqB;AACtD,aAAO,OAAO,OAAO;AAAA,IACzB;AACE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,CAAC,MAAM,EAAE,KAAI,EAAG,MAAM,KAAK,EAAE,CAAC;AAEpD,QAAM,qBAAqB,CAAC,QAAQ;AAClC,UAAM,CAAC,SAAS,MAAM,IAAI,IAAI,IAAI,MAAM,SAAS;AACjD,QAAI,WAAW,QAAQ,SAAS,KAAK,GAAG;AACtC,aAAO,cAAc,OAAO;AAAA,IAChC;AACE,QAAI,QAAQ,QAAQ,KAAK,SAAS,IAAI,GAAG;AACvC,aAAO,cAAc,IAAI;AAAA,IAC7B;AACE,WAAO;AAAA,EACT;AAMA,QAAMhE,WAAU,YAAY;AAC1B,QAAIA,WAAU;AACd,QAAI,QAAO,GAAI;AACb,MAAAA,WAAU,MAAM,sBAAqB;AACrC,UAAI,CAACA,UAAS;AACZ,QAAAA,WAAU,kBAAiB;AAAA,MACjC;AACI,UAAI,CAACA,UAAS;AACZ,cAAM,MAAM,MAAM,YAAW;AAC7B,QAAAA,WAAU,mBAAmB,GAAG;AAAA,MACtC;AAAA,IACA;AACE,WAAOA;AAAA,EACT;AAMA,QAAM,cAAc,MAAM;AACxB,QAAIA,WAAU;AACd,QAAI,QAAO,GAAI;AACb,MAAAA,WAAU,0BAAyB;AACnC,UAAI,CAACA,UAAS;AACZ,QAAAA,WAAU,kBAAiB;AAAA,MACjC;AACI,UAAI,CAACA,UAAS;AACZ,cAAM,MAAM,gBAAe;AAC3B,QAAAA,WAAU,mBAAmB,GAAG;AAAA,MACtC;AAAA,IACA;AACE,WAAOA;AAAA,EACT;AAEA,eAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAAA;AAAA,IACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148]}
|