@tableau/mcp-server 1.10.2 → 1.10.3
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/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/package.json +1 -1
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/config.ts", "../src/tools/toolName.ts", "../src/transports.ts", "../src/utils/invariant.ts", "../src/logging/log.ts", "../src/logging/serverLogger.ts", "../src/utils/getExceptionMessage.ts", "../src/server.ts", "../package.json", "../src/tools/contentExploration/searchContent.ts", "../src/logging/secretMask.ts", "../src/sdks/tableau/interceptors.ts", "../src/sdks/tableau/methods/authenticationMethods.ts", "../src/utils/getJwt.ts", "../src/sdks/tableau/apis/authenticationApi.ts", "../src/sdks/tableau/types/credentials.ts", "../src/sdks/tableau/methods/methods.ts", "../src/sdks/tableau/methods/authenticatedMethods.ts", "../src/sdks/tableau/methods/contentExplorationMethods.ts", "../src/sdks/tableau/apis/contentExplorationApi.ts", "../src/sdks/tableau/types/contentExploration.ts", "../src/sdks/tableau/methods/datasourcesMethods.ts", "../src/sdks/tableau/apis/datasourcesApi.ts", "../src/sdks/tableau/types/dataSource.ts", "../src/sdks/tableau/types/project.ts", "../src/sdks/tableau/types/pagination.ts", "../src/sdks/tableau/apis/paginationParameters.ts", "../src/sdks/tableau/methods/metadataMethods.ts", "../src/sdks/tableau/apis/metadataApi.ts", "../src/sdks/tableau/methods/pulseMethods.ts", "../node_modules/axios/lib/helpers/bind.js", "../node_modules/axios/lib/utils.js", "../node_modules/axios/lib/core/AxiosError.js", "../node_modules/axios/lib/platform/node/classes/FormData.js", "../node_modules/axios/lib/helpers/toFormData.js", "../node_modules/axios/lib/helpers/AxiosURLSearchParams.js", "../node_modules/axios/lib/helpers/buildURL.js", "../node_modules/axios/lib/core/InterceptorManager.js", "../node_modules/axios/lib/defaults/transitional.js", "../node_modules/axios/lib/platform/node/index.js", "../node_modules/axios/lib/platform/node/classes/URLSearchParams.js", "../node_modules/axios/lib/platform/common/utils.js", "../node_modules/axios/lib/platform/index.js", "../node_modules/axios/lib/helpers/toURLEncodedForm.js", "../node_modules/axios/lib/helpers/formDataToJSON.js", "../node_modules/axios/lib/defaults/index.js", "../node_modules/axios/lib/helpers/parseHeaders.js", "../node_modules/axios/lib/core/AxiosHeaders.js", "../node_modules/axios/lib/core/transformData.js", "../node_modules/axios/lib/cancel/isCancel.js", "../node_modules/axios/lib/cancel/CanceledError.js", "../node_modules/axios/lib/core/settle.js", "../node_modules/axios/lib/helpers/isAbsoluteURL.js", "../node_modules/axios/lib/helpers/combineURLs.js", "../node_modules/axios/lib/core/buildFullPath.js", "../node_modules/axios/lib/adapters/http.js", "../node_modules/axios/lib/env/data.js", "../node_modules/axios/lib/helpers/parseProtocol.js", "../node_modules/axios/lib/helpers/fromDataURI.js", "../node_modules/axios/lib/helpers/AxiosTransformStream.js", "../node_modules/axios/lib/helpers/formDataToStream.js", "../node_modules/axios/lib/helpers/readBlob.js", "../node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js", "../node_modules/axios/lib/helpers/callbackify.js", "../node_modules/axios/lib/helpers/speedometer.js", "../node_modules/axios/lib/helpers/throttle.js", "../node_modules/axios/lib/helpers/progressEventReducer.js", "../node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js", "../node_modules/axios/lib/helpers/isURLSameOrigin.js", "../node_modules/axios/lib/helpers/cookies.js", "../node_modules/axios/lib/core/mergeConfig.js", "../node_modules/axios/lib/helpers/resolveConfig.js", "../node_modules/axios/lib/adapters/xhr.js", "../node_modules/axios/lib/helpers/composeSignals.js", "../node_modules/axios/lib/helpers/trackStream.js", "../node_modules/axios/lib/adapters/fetch.js", "../node_modules/axios/lib/adapters/adapters.js", "../node_modules/axios/lib/core/dispatchRequest.js", "../node_modules/axios/lib/helpers/validator.js", "../node_modules/axios/lib/core/Axios.js", "../node_modules/axios/lib/cancel/CancelToken.js", "../node_modules/axios/lib/helpers/spread.js", "../node_modules/axios/lib/helpers/isAxiosError.js", "../node_modules/axios/lib/helpers/HttpStatusCode.js", "../node_modules/axios/lib/axios.js", "../node_modules/axios/index.js", "../src/sdks/tableau/apis/pulseApi.ts", "../src/sdks/tableau/types/pulse.ts", "../src/sdks/tableau/methods/viewsMethods.ts", "../src/sdks/tableau/apis/viewsApi.ts", "../src/sdks/tableau/types/view.ts", "../src/sdks/tableau/methods/vizqlDataServiceMethods.ts", "../src/sdks/tableau/apis/vizqlDataServiceApi.ts", "../src/sdks/tableau/methods/workbooksMethods.ts", "../src/sdks/tableau/apis/workbooksApi.ts", "../src/sdks/tableau/types/workbook.ts", "../src/sdks/tableau/restApi.ts", "../src/restApiInstance.ts", "../src/tools/tool.ts", "../src/tools/contentExploration/searchContentUtils.ts", "../src/tools/getDatasourceMetadata/getDatasourceMetadata.ts", "../src/tools/getVizqlDataServiceDisabledError.ts", "../src/tools/validateDatasourceLuid.ts", "../src/tools/getDatasourceMetadata/datasourceMetadataUtils.ts", "../src/tools/listDatasources/listDatasources.ts", "../src/utils/paginate.ts", "../src/tools/genericFilterDescription.ts", "../src/tools/listDatasources/datasourcesFilterUtils.ts", "../src/utils/parseAndValidateFilterString.ts", "../src/tools/pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.ts", "../src/tools/pulse/getPulseDisabledError.ts", "../src/tools/pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.ts", "../src/tools/pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.ts", "../src/tools/pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.ts", "../src/tools/pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.ts", "../src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.ts", "../src/tools/queryDatasource/queryDatasource.ts", "../src/tools/queryDatasource/datasourceCredentials.ts", "../src/tools/queryDatasource/queryDatasourceErrorHandler.ts", "../src/tools/queryDatasource/validators/validateFields.ts", "../src/tools/queryDatasource/validators/validateFilters.ts", "../src/tools/queryDatasource/queryDatasourceValidator.ts", "../src/tools/queryDatasource/queryDescription.ts", "../src/tools/queryDatasource/validators/validateFilterValues.ts", "../src/tools/views/getViewData.ts", "../src/tools/views/getViewImage.ts", "../src/tools/convertPngDataToToolResult.ts", "../src/tools/views/listViews.ts", "../src/tools/views/viewsFilterUtils.ts", "../src/tools/workbooks/getWorkbook.ts", "../src/tools/workbooks/listWorkbooks.ts", "../src/tools/workbooks/workbooksFilterUtils.ts", "../src/tools/tools.ts", "../src/server/express.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport dotenv from 'dotenv';\n\nimport { getConfig } from './config.js';\nimport { isLoggingLevel, log, setLogLevel, setServerLogger, writeToStderr } from './logging/log.js';\nimport { ServerLogger } from './logging/serverLogger.js';\nimport { Server, serverName, serverVersion } from './server.js';\nimport { startExpressServer } from './server/express.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\n\nasync function startServer(): Promise<void> {\n dotenv.config();\n const config = getConfig();\n\n const logLevel = isLoggingLevel(config.defaultLogLevel) ? config.defaultLogLevel : 'debug';\n if (config.enableServerLogging) {\n setServerLogger(new ServerLogger({ logDirectory: config.serverLogDirectory }));\n }\n\n switch (config.transport) {\n case 'stdio': {\n const server = new Server();\n server.registerTools();\n server.registerRequestHandlers();\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n setLogLevel(server, logLevel);\n log.info(server, `${server.name} v${server.version} running on stdio`);\n break;\n }\n case 'http': {\n const { url } = await startExpressServer({ basePath: serverName, config, logLevel });\n\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(\n `${serverName} v${serverVersion} stateless streamable HTTP server available at ${url}`,\n );\n break;\n }\n }\n\n if (config.disableLogMasking) {\n writeToStderr('Log masking is disabled!');\n }\n}\n\ntry {\n await startServer();\n} catch (error) {\n writeToStderr(`Fatal error when starting the server: ${getExceptionMessage(error)}`);\n process.exit(1);\n}\n", "import { CorsOptions } from 'cors';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { isToolGroupName, isToolName, toolGroups, ToolName } from './tools/toolName.js';\nimport { isTransport, TransportName } from './transports.js';\nimport invariant from './utils/invariant.js';\n\nconst __dirname = fileURLToPath(new URL('.', import.meta.url));\n\nconst authTypes = ['pat', 'direct-trust'] as const;\ntype AuthType = (typeof authTypes)[number];\n\nexport class Config {\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n siteName: string;\n patName: string;\n patValue: string;\n jwtSubClaim: string;\n connectedAppClientId: string;\n connectedAppSecretId: string;\n connectedAppSecretValue: string;\n jwtAdditionalPayload: string;\n datasourceCredentials: string;\n defaultLogLevel: string;\n disableLogMasking: boolean;\n includeTools: Array<ToolName>;\n excludeTools: Array<ToolName>;\n maxResultLimit: number | null;\n disableQueryDatasourceFilterValidation: boolean;\n disableMetadataApiRequests: boolean;\n enableServerLogging: boolean;\n serverLogDirectory: string;\n\n constructor() {\n const cleansedVars = removeClaudeMcpBundleUserConfigTemplates(process.env);\n const {\n AUTH: auth,\n SERVER: server,\n SITE_NAME: siteName,\n TRANSPORT: transport,\n SSL_KEY: sslKey,\n SSL_CERT: sslCert,\n HTTP_PORT_ENV_VAR_NAME: httpPortEnvVarName,\n CORS_ORIGIN_CONFIG: corsOriginConfig,\n PAT_NAME: patName,\n PAT_VALUE: patValue,\n JWT_SUB_CLAIM: jwtSubClaim,\n CONNECTED_APP_CLIENT_ID: clientId,\n CONNECTED_APP_SECRET_ID: secretId,\n CONNECTED_APP_SECRET_VALUE: secretValue,\n JWT_ADDITIONAL_PAYLOAD: jwtAdditionalPayload,\n DATASOURCE_CREDENTIALS: datasourceCredentials,\n DEFAULT_LOG_LEVEL: defaultLogLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n INCLUDE_TOOLS: includeTools,\n EXCLUDE_TOOLS: excludeTools,\n MAX_RESULT_LIMIT: maxResultLimit,\n DISABLE_QUERY_DATASOURCE_FILTER_VALIDATION: disableQueryDatasourceFilterValidation,\n DISABLE_METADATA_API_REQUESTS: disableMetadataApiRequests,\n ENABLE_SERVER_LOGGING: enableServerLogging,\n SERVER_LOG_DIRECTORY: serverLogDirectory,\n } = cleansedVars;\n\n const defaultPort = 3927;\n const httpPort = cleansedVars[httpPortEnvVarName?.trim() || 'PORT'] || defaultPort.toString();\n const httpPortNumber = parseInt(httpPort, 10);\n\n this.siteName = siteName ?? '';\n this.auth = authTypes.find((type) => type === auth) ?? 'pat';\n this.transport = isTransport(transport) ? transport : 'stdio';\n this.sslKey = sslKey?.trim() ?? '';\n this.sslCert = sslCert?.trim() ?? '';\n this.httpPort = isNaN(httpPortNumber) ? defaultPort : httpPortNumber;\n this.corsOriginConfig = getCorsOriginConfig(corsOriginConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultLogLevel = defaultLogLevel ?? 'debug';\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableQueryDatasourceFilterValidation = disableQueryDatasourceFilterValidation === 'true';\n this.disableMetadataApiRequests = disableMetadataApiRequests === 'true';\n this.enableServerLogging = enableServerLogging === 'true';\n this.serverLogDirectory = serverLogDirectory || join(__dirname, 'logs');\n\n const maxResultLimitNumber = maxResultLimit ? parseInt(maxResultLimit) : NaN;\n this.maxResultLimit =\n isNaN(maxResultLimitNumber) || maxResultLimitNumber <= 0 ? null : maxResultLimitNumber;\n\n this.includeTools = includeTools\n ? includeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n this.excludeTools = excludeTools\n ? excludeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n if (this.includeTools.length > 0 && this.excludeTools.length > 0) {\n throw new Error('Cannot include and exclude tools simultaneously');\n }\n\n invariant(server, 'The environment variable SERVER is not set');\n validateServer(server);\n\n if (this.auth === 'pat') {\n invariant(patName, 'The environment variable PAT_NAME is not set');\n invariant(patValue, 'The environment variable PAT_VALUE is not set');\n } else if (this.auth === 'direct-trust') {\n invariant(jwtSubClaim, 'The environment variable JWT_SUB_CLAIM is not set');\n invariant(clientId, 'The environment variable CONNECTED_APP_CLIENT_ID is not set');\n invariant(secretId, 'The environment variable CONNECTED_APP_SECRET_ID is not set');\n invariant(secretValue, 'The environment variable CONNECTED_APP_SECRET_VALUE is not set');\n }\n\n this.server = server;\n this.patName = patName ?? '';\n this.patValue = patValue ?? '';\n this.jwtSubClaim = jwtSubClaim ?? '';\n this.connectedAppClientId = clientId ?? '';\n this.connectedAppSecretId = secretId ?? '';\n this.connectedAppSecretValue = secretValue ?? '';\n this.jwtAdditionalPayload = jwtAdditionalPayload || '{}';\n }\n}\n\nfunction validateServer(server: string): void {\n if (!server.startsWith('https://')) {\n throw new Error(`The environment variable SERVER must start with \"https://\": ${server}`);\n }\n\n try {\n const _ = new URL(server);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `The environment variable SERVER is not a valid URL: ${server} -- ${errorMessage}`,\n );\n }\n}\n\nfunction getCorsOriginConfig(corsOriginConfig: string): CorsOptions['origin'] {\n if (!corsOriginConfig) {\n return true;\n }\n\n if (corsOriginConfig.match(/^true|false$/i)) {\n return corsOriginConfig.toLowerCase() === 'true';\n }\n\n if (corsOriginConfig === '*') {\n return '*';\n }\n\n if (corsOriginConfig.startsWith('[') && corsOriginConfig.endsWith(']')) {\n try {\n const origins = JSON.parse(corsOriginConfig) as Array<string>;\n return origins.map((origin) => new URL(origin).origin);\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${corsOriginConfig}`,\n );\n }\n }\n\n try {\n return new URL(corsOriginConfig).origin;\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${corsOriginConfig}`,\n );\n }\n}\n\n// When the user does not provide a site name in the Claude MCP Bundle configuration,\n// Claude doesn't replace its value and sets the site name to \"${user_config.site_name}\".\nfunction removeClaudeMcpBundleUserConfigTemplates(\n envVars: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n return Object.entries(envVars).reduce<Record<string, string | undefined>>((acc, [key, value]) => {\n if (value?.startsWith('${user_config.')) {\n acc[key] = '';\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n};\n", "export const toolNames = [\n 'list-datasources',\n 'list-workbooks',\n 'list-views',\n 'query-datasource',\n 'get-datasource-metadata',\n 'get-workbook',\n 'get-view-data',\n 'get-view-image',\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n 'search-content',\n] as const;\nexport type ToolName = (typeof toolNames)[number];\n\nexport const toolGroupNames = [\n 'datasource',\n 'workbook',\n 'view',\n 'pulse',\n 'content-exploration',\n] as const;\nexport type ToolGroupName = (typeof toolGroupNames)[number];\n\nexport const toolGroups = {\n datasource: ['list-datasources', 'get-datasource-metadata', 'query-datasource'],\n workbook: ['list-workbooks', 'get-workbook'],\n view: ['list-views', 'get-view-data', 'get-view-image'],\n pulse: [\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n ],\n 'content-exploration': ['search-content'],\n} as const satisfies Record<ToolGroupName, Array<ToolName>>;\n\nexport function isToolName(value: unknown): value is ToolName {\n return !!toolNames.find((name) => name === value);\n}\n\nexport function isToolGroupName(value: unknown): value is ToolGroupName {\n return !!toolGroupNames.find((name) => name === value);\n}\n", "const transports = ['stdio', 'http'] as const;\nexport type TransportName = (typeof transports)[number];\nexport function isTransport(transport: unknown): transport is TransportName {\n return !!transports.find((t) => t === transport);\n}\n", "export default function invariant(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ? message : 'Invariant Violation');\n }\n}\n", "import { LoggingLevel, RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Server } from '../server.js';\nimport { ToolName } from '../tools/toolName.js';\nimport { ServerLogger } from './serverLogger.js';\ntype Logger = 'rest-api' | (string & {});\ntype LogType = LoggingLevel | 'request' | 'response' | 'tool';\ntype LogMessage = {\n type: LogType;\n [key: string]: any;\n};\n\nexport const loggingLevels = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'critical',\n 'alert',\n 'emergency',\n] as const;\n\nlet currentLogLevel: LoggingLevel = 'debug';\nlet serverLogger: ServerLogger | undefined;\n\nexport function isLoggingLevel(level: unknown): level is LoggingLevel {\n return !!loggingLevels.find((l) => l === level);\n}\n\nexport const setLogLevel = (\n server: Server,\n level: LoggingLevel,\n { silent = false }: { silent?: boolean } = {},\n): void => {\n if (currentLogLevel === level) {\n return;\n }\n\n currentLogLevel = level;\n\n if (!silent) {\n log.notice(server, `Logging level set to: ${level}`);\n }\n};\n\nexport const setServerLogger = (logger: ServerLogger): void => {\n serverLogger = logger;\n};\n\ntype LogMethodOptions = Partial<{ logger: Logger; requestId: RequestId }>;\n\nexport const log = {\n debug: getSendLoggingMessageFn('debug'),\n info: getSendLoggingMessageFn('info'),\n notice: getSendLoggingMessageFn('notice'),\n warning: getSendLoggingMessageFn('warning'),\n error: getSendLoggingMessageFn('error'),\n critical: getSendLoggingMessageFn('critical'),\n alert: getSendLoggingMessageFn('alert'),\n emergency: getSendLoggingMessageFn('emergency'),\n} satisfies {\n [level in LoggingLevel]: (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions,\n ) => Promise<void>;\n};\n\nexport const shouldLogWhenLevelIsAtLeast = (level = currentLogLevel): boolean => {\n return loggingLevels.indexOf(level) >= loggingLevels.indexOf(currentLogLevel);\n};\n\nexport const writeToStderr = (message: string): void => {\n if (process.env.TABLEAU_MCP_TEST === 'true') {\n // Silence logging when running in test mode\n return;\n }\n\n message = message.endsWith('\\n') ? message : `${message}\\n`;\n process.stderr.write(message);\n};\n\nexport const getToolLogMessage = ({\n requestId,\n toolName,\n args,\n}: {\n requestId: RequestId;\n toolName: ToolName;\n args: unknown;\n}): LogMessage => {\n return {\n type: 'tool',\n requestId,\n tool: {\n name: toolName,\n ...(args !== undefined ? { args } : {}),\n },\n };\n};\n\nfunction getSendLoggingMessageFn(level: LoggingLevel) {\n return async (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions = {\n logger: server.name,\n },\n ) => {\n serverLogger?.log({ message, level, logger });\n\n if (!shouldLogWhenLevelIsAtLeast(level)) {\n return;\n }\n\n // server.sendNotification doesn't provide a way to provide the relatedRequestId\n // so we're using server.notification directly.\n return server.server.notification(\n {\n method: 'notifications/message',\n params: {\n level,\n logger,\n data: JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n currentLogLevel,\n message,\n },\n null,\n 2,\n ),\n },\n },\n {\n relatedRequestId: requestId,\n },\n );\n };\n}\n", "import { appendFile } from 'node:fs/promises';\n\nimport { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { writeToStderr } from './log.js';\n\nexport class ServerLogger {\n private readonly _logDirectory: string;\n private readonly _fileMutexes = new Map<string, Promise<void>>();\n\n constructor({ logDirectory }: { logDirectory: string }) {\n this._logDirectory = logDirectory;\n\n if (!existsSync(this._logDirectory)) {\n mkdirSync(this._logDirectory, { recursive: true });\n }\n }\n\n async log(obj: Record<string, unknown>): Promise<void> {\n // Create a new log file each hour e.g. 2025-10-15T21-00-00-000Z.log\n const timestamp = new Date().toISOString();\n const filename = `${new Date(new Date().setMinutes(0, 0, 0)).toISOString().replace(/[:.]/g, '-')}.log`;\n const logFilePath = join(this._logDirectory, filename);\n\n // Get or create a mutex for this specific log file\n const mutexKey = logFilePath;\n const currentMutex = this._fileMutexes.get(mutexKey) ?? Promise.resolve();\n\n // Chain the file write operation after the current mutex\n const newMutex = currentMutex.then(async () => {\n try {\n // appendFile will create the file if it doesn't exist\n await appendFile(logFilePath, JSON.stringify({ timestamp, ...obj }) + '\\n');\n } catch (error) {\n writeToStderr(`Failed to write to log file ${logFilePath}: ${getExceptionMessage(error)}`);\n }\n });\n\n this._fileMutexes.set(mutexKey, newMutex);\n\n // Clean up completed mutexes to prevent memory leaks\n newMutex.finally(() => {\n if (this._fileMutexes.get(mutexKey) === newMutex) {\n this._fileMutexes.delete(mutexKey);\n }\n });\n\n // Wait for the file write operation to complete\n await newMutex;\n }\n}\n", "export function getExceptionMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error) ?? 'undefined';\n } catch {\n return `${error}`;\n }\n}\n", "import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nimport pkg from '../package.json' with { type: 'json' };\nimport { getConfig } from './config.js';\nimport { setLogLevel } from './logging/log.js';\nimport { Tool } from './tools/tool.js';\nimport { toolNames } from './tools/toolName.js';\nimport { toolFactories } from './tools/tools.js';\n\nexport const serverName = 'tableau-mcp';\nexport const serverVersion = pkg.version;\n\nexport class Server extends McpServer {\n readonly name: string;\n readonly version: string;\n\n constructor() {\n super(\n {\n name: serverName,\n version: serverVersion,\n },\n {\n capabilities: {\n logging: {},\n tools: {},\n },\n },\n );\n\n this.name = serverName;\n this.version = serverVersion;\n }\n\n registerTools = (): void => {\n for (const {\n name,\n description,\n paramsSchema,\n annotations,\n callback,\n } of this._getToolsToRegister()) {\n this.tool(name, description, paramsSchema, annotations, callback);\n }\n };\n\n registerRequestHandlers = (): void => {\n this.server.setRequestHandler(SetLevelRequestSchema, async (request) => {\n setLogLevel(this, request.params.level);\n return {};\n });\n };\n\n private _getToolsToRegister = (): Array<Tool<any>> => {\n const { includeTools, excludeTools } = getConfig();\n\n const tools = toolFactories.map((tool) => tool(this));\n const toolsToRegister = tools.filter((tool) => {\n if (includeTools.length > 0) {\n return includeTools.includes(tool.name);\n }\n\n if (excludeTools.length > 0) {\n return !excludeTools.includes(tool.name);\n }\n\n return true;\n });\n\n if (toolsToRegister.length === 0) {\n throw new Error(`\n No tools to register.\n Tools available = [${toolNames.join(', ')}].\n EXCLUDE_TOOLS = [${excludeTools.join(', ')}].\n INCLUDE_TOOLS = [${includeTools.join(', ')}]\n `);\n }\n\n return toolsToRegister;\n };\n}\n\nexport const exportedForTesting = {\n Server,\n};\n", "{\n \"name\": \"@tableau/mcp-server\",\n \"description\": \"An MCP server for Tableau, providing a suite of tools that will make it easier for developers to build AI applications that integrate with Tableau.\",\n \"version\": \"1.10.2\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/tableau/tableau-mcp.git\"\n },\n \"homepage\": \"https://github.com/tableau/tableau-mcp\",\n \"bugs\": \"https://github.com/tableau/tableau-mcp/issues\",\n \"author\": \"Tableau\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"keywords\": [\n \"tableau\",\n \"mcp\"\n ],\n \"bin\": {\n \"tableau-mcp-server\": \"./build/index.js\"\n },\n \"scripts\": {\n \":build\": \"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --minify --outdir=build --sourcemap\",\n \"build\": \"run-s :build exec-perms\",\n \"build:watch\": \"npm run :build -- --watch\",\n \"build:docker\": \"docker build -t tableau-mcp .\",\n \":build:mcpb\": \"npx -y @anthropic-ai/mcpb pack . tableau-mcp.mcpb\",\n \"build:mcpb\": \"run-s build:manifest:script build:manifest :build:mcpb\",\n \"build:manifest\": \"node build/scripts/createClaudeMcpBundleManifest.mjs\",\n \"build:manifest:script\": \"esbuild src/scripts/createClaudeMcpBundleManifest.ts --bundle --platform=node --format=esm --outdir=build/scripts --sourcemap=inline --out-extension:.js=.mjs\",\n \"start:http\": \"node build/index.js\",\n \"start:http:docker\": \"docker run -p 3927:3927 -i --rm --env-file env.list tableau-mcp\",\n \"lint\": \"npm exec eslint\",\n \"inspect\": \"npx @modelcontextprotocol/inspector --config config.json --server tableau\",\n \":inspect:http\": \"npx @modelcontextprotocol/inspector --config config.http.json --server tableau\",\n \"inspect:http\": \"run-p start:http :inspect:http\",\n \"inspect:docker\": \"npx @modelcontextprotocol/inspector --config config.docker.json --server tableau\",\n \"inspect:docker:http\": \"run-p start:http:docker :inspect:http\",\n \"build:inspect\": \"run-s build inspect\",\n \"build:inspect:docker\": \"run-s build:docker inspect:docker\",\n \"build:inspect:docker:http\": \"run-s build:docker inspect:docker:http\",\n \"exec-perms\": \"shx chmod +x build/*.js\",\n \"test\": \"vitest --config ./vitest.config.ts\",\n \"test:e2e\": \"vitest --config ./vitest.config.e2e.ts\",\n \"test:eval\": \"vitest --config ./vitest.config.eval.ts\",\n \"coverage\": \"vitest run --config ./vitest.config.ts --coverage\",\n \"version:major\": \"npm version major --no-git-tag-version\",\n \"version:minor\": \"npm version minor --no-git-tag-version\",\n \"version:patch\": \"npm version patch --no-git-tag-version\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.12.1\",\n \"@zodios/core\": \"^10.9.6\",\n \"cors\": \"^2.8.5\",\n \"dotenv\": \"^16.5.0\",\n \"express\": \"^5.1.0\",\n \"fast-levenshtein\": \"^3.0.0\",\n \"jose\": \"^6.0.12\",\n \"ts-results-es\": \"^5.0.1\",\n \"zod\": \"^3.24.3\",\n \"zod-validation-error\": \"^4.0.1\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/mcpb\": \"^1.0.0\",\n \"@eslint/eslintrc\": \"^3.3.1\",\n \"@eslint/js\": \"^9.25.1\",\n \"@modelcontextprotocol/inspector\": \"^0.16.6\",\n \"@openai/agents\": \"^0.1.9\",\n \"@types/cors\": \"^2.8.19\",\n \"@types/eslint__js\": \"^8.42.3\",\n \"@types/express\": \"^5.0.3\",\n \"@types/fast-levenshtein\": \"^0.0.1\",\n \"@types/node\": \"^22.15.3\",\n \"@typescript-eslint/eslint-plugin\": \"^8.31.1\",\n \"@typescript-eslint/parser\": \"^8.31.1\",\n \"@vitest/coverage-v8\": \"^3.1.3\",\n \"esbuild\": \"^0.25.5\",\n \"eslint\": \"^9.25.1\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"eslint-plugin-prettier\": \"^5.2.6\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"npm-run-all\": \"^4.1.5\",\n \"openai\": \"^5.23.2\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"shx\": \"^0.4.0\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.31.1\",\n \"vitest\": \"^3.1.3\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n orderBySchema,\n searchContentFilterSchema,\n} from '../../sdks/tableau/types/contentExploration.js';\nimport { Server } from '../../server.js';\nimport { Tool } from '../tool.js';\nimport {\n buildFilterString,\n buildOrderByString,\n reduceSearchContentResponse,\n} from './searchContentUtils.js';\n\nconst paramsSchema = {\n terms: z.string().trim().nonempty().optional(),\n limit: z.number().int().min(1).max(2000).default(100).optional(),\n orderBy: orderBySchema.optional(),\n filter: searchContentFilterSchema.optional(),\n};\n\nexport const getSearchContentTool = (server: Server): Tool<typeof paramsSchema> => {\n const searchContentTool = new Tool({\n server,\n name: 'search-content',\n description: `\nThis tool searches across all supported content types for objects relevant to the search expression specified by search terms and filters.\n\n**Parameters:**\n\n- \\`terms\\` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. If the terms parameter is not provided, it searches for everything bound by the specified filters.\n\n- \\`filter\\` (optional): Allows you to limit search results based on:\n - \\`contentTypes\\`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook'\n - \\`ownerIds\\`: Filter by specific owner IDs (array of integers)\n - \\`modifiedTime\\`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include\n\n- \\`limit\\` (optional): The number of items to return in the search response (default: 100, max: 2000)\n\n- \\`orderBy\\` (optional): Determines the sorting method for returned items. Available sorting methods:\n - \\`hitsTotal\\`: Number of times a content item has been viewed since it was created\n - \\`hitsSmallSpanTotal\\`: Number of times a content item was viewed in the last month\n - \\`hitsMediumSpanTotal\\`: Number of times a content item was viewed in the last 3 months\n - \\`hitsLargeSpanTotal\\`: Number of times a content item was viewed in the last year\n - \\`downstreamWorkbookCount\\`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table'\n \n For each sort method, you can specify a sort direction: 'asc' for ascending or 'desc' for descending (default: 'asc'). The orderBy parameter is an array of objects containing the sorting method and direction. The first element determines primary sorting, with subsequent elements used as tiebreakers.\n\n**Important Notes:**\n- If \\`orderBy\\` is omitted, the search will sort items by their \"relevance score\" in descending order, which is Tableau's internal algorithm for providing the most relevant results`,\n paramsSchema,\n annotations: {\n title: 'Search Content',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ terms, limit, orderBy, filter }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const orderByString = orderBy ? buildOrderByString(orderBy) : undefined;\n const filterString = filter ? buildFilterString(filter) : undefined;\n return await searchContentTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const response = await restApi.contentExplorationMethods.searchContent({\n terms,\n page: 0,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? 100)\n : (limit ?? 100),\n orderBy: orderByString,\n filter: filterString,\n });\n return reduceSearchContentResponse(response);\n },\n }),\n );\n },\n });\n },\n });\n\n return searchContentTool;\n};\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport {\n RequestInterceptorConfig,\n ResponseInterceptorConfig,\n} from '../sdks/tableau/interceptors.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { shouldLogWhenLevelIsAtLeast, writeToStderr } from './log.js';\n\ntype MaskedKeys = 'data' | 'headers';\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\ntype MaskedRequest = Optional<RequestInterceptorConfig, MaskedKeys>;\ntype MaskedResponse = Optional<ResponseInterceptorConfig, MaskedKeys>;\n\nexport const maskRequest = (config: RequestInterceptorConfig): MaskedRequest => {\n const result = clone<MaskedRequest>(config);\n if (result.isErr()) {\n return config;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n\n if (Array.isArray(maskedData?.data?.datasource?.connections)) {\n const connections = maskedData.data.datasource.connections as Array<{\n connectionLuid: string;\n connectionUsername: string;\n connectionPassword: string;\n }>;\n\n connections.forEach((connection) => {\n connection.connectionUsername = '<redacted>';\n connection.connectionPassword = '<redacted>';\n });\n }\n\n if (maskedData.headers?.['X-Tableau-Auth']) {\n maskedData.headers['X-Tableau-Auth'] = '<redacted>';\n }\n\n if (maskedData.params?.['user_id']) {\n maskedData.params['user_id'] = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n delete maskedData.params;\n }\n\n return maskedData;\n};\n\nexport const maskResponse = (response: ResponseInterceptorConfig): MaskedResponse => {\n const result = clone<MaskedResponse>(response);\n if (result.isErr()) {\n return response;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n }\n\n return maskedData;\n};\n\nfunction clone<T>(obj: T): Result<T, Error> {\n try {\n return Ok(structuredClone(obj));\n } catch (error) {\n if (error instanceof Error) {\n return Err(error);\n }\n\n const message = getExceptionMessage(error);\n writeToStderr(`Could not clone object, notification may not be sanitized! Error: ${message}`);\n return Err(new Error(message));\n }\n}\n", "import { ZodiosClass } from '@zodios/core';\n\nexport type RequestInterceptor = (config: RequestInterceptorConfig) => void;\nexport type ResponseInterceptor = (response: ResponseInterceptorConfig) => void;\nexport type ErrorInterceptor = (error: unknown, baseUrl: string) => void;\n\nexport type AxiosInterceptor = ZodiosClass<any>['axios']['interceptors'];\nexport type AxiosRequestInterceptor = Parameters<AxiosInterceptor['request']['use']>[0];\nexport type AxiosRequestInterceptorConfig = Parameters<NonNullable<AxiosRequestInterceptor>>[0];\nexport type RequestInterceptorConfig = {\n baseUrl: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosRequestInterceptorConfig, 'headers'>;\n\nexport type AxiosResponseInterceptor = Parameters<AxiosInterceptor['response']['use']>[0];\nexport type AxiosResponseInterceptorConfig = Parameters<NonNullable<AxiosResponseInterceptor>>[0];\nexport type ResponseInterceptorConfig = {\n baseUrl: string;\n url: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosResponseInterceptorConfig, 'headers' | 'statusText' | 'config'>;\n\nexport function getRequestInterceptorConfig(\n config: AxiosRequestInterceptorConfig,\n): Omit<RequestInterceptorConfig, 'baseUrl'> {\n return {\n method: config.method ?? 'UNKNOWN METHOD',\n url: config.url ?? 'UNKNOWN URL',\n headers: config.headers,\n data: config.data,\n params: config.params,\n };\n}\n\nexport function getResponseInterceptorConfig(\n response: AxiosResponseInterceptorConfig,\n): Omit<ResponseInterceptorConfig, 'baseUrl'> {\n return {\n url: response.config.url ?? 'UNKNOWN URL',\n status: response.status,\n headers: response.headers,\n data: response.data,\n };\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { getJwt } from '../../../utils/getJwt.js';\nimport { authenticationApis } from '../apis/authenticationApi.js';\nimport { AuthConfig } from '../authConfig.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\nimport Methods from './methods.js';\n\n/**\n * Authentication methods of the Tableau Server REST API\n *\n * @export\n * @class AuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport default class AuthenticationMethods extends Methods<typeof authenticationApis> {\n constructor(baseUrl: string) {\n super(new Zodios(baseUrl, authenticationApis));\n }\n\n /**\n * Signs you in as a user on the specified site on Tableau Server or Tableau Cloud.\n *\n * @param {AuthConfig} authConfig - The authentication configuration\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_in\n */\n signIn = async (authConfig: AuthConfig): Promise<Credentials> => {\n return (\n await this._apiClient.signIn({\n credentials: {\n site: {\n contentUrl: authConfig.siteName,\n },\n ...(await (async () => {\n switch (authConfig.type) {\n case 'pat':\n return {\n personalAccessTokenName: authConfig.patName,\n personalAccessTokenSecret: authConfig.patValue,\n };\n case 'direct-trust':\n return {\n jwt: await getJwt({\n username: authConfig.username,\n connectedApp: {\n clientId: authConfig.clientId,\n secretId: authConfig.secretId,\n secretValue: authConfig.secretValue,\n },\n scopes: authConfig.scopes,\n additionalPayload: authConfig.additionalPayload,\n }),\n };\n }\n })()),\n },\n })\n ).credentials;\n };\n}\n\n/**\n * Authentication methods of the Tableau Server REST API that assume the user is already authenticated\n *\n * @export\n * @class AuthenticatedAuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport class AuthenticatedAuthenticationMethods extends AuthenticatedMethods<\n typeof authenticationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, authenticationApis), creds);\n }\n\n /**\n * Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_out\n *\n * Required scopes: none\n *\n */\n signOut = async (): Promise<void> => {\n await this._apiClient.signOut(undefined, {\n ...this.authHeader,\n });\n };\n}\n", "import { randomUUID } from 'node:crypto';\n\nimport { JWTHeaderParameters, JWTPayload, SignJWT } from 'jose';\n\nexport async function getJwt({\n username,\n connectedApp,\n scopes,\n additionalPayload,\n}: {\n username: string;\n connectedApp: {\n clientId: string;\n secretId: string;\n secretValue: string;\n };\n scopes: Set<string>;\n additionalPayload?: Record<string, unknown>;\n}): Promise<string> {\n const header: JWTHeaderParameters = {\n alg: 'HS256',\n typ: 'JWT',\n kid: connectedApp.secretId,\n };\n\n const payload: JWTPayload = {\n jti: randomUUID(),\n iss: connectedApp.clientId,\n aud: 'tableau',\n sub: username,\n scp: [...scopes],\n iat: Math.floor(Date.now() / 1000) - 5,\n exp: Math.floor(Date.now() / 1000) + 5 * 60,\n ...additionalPayload,\n };\n\n const token = await new SignJWT(payload)\n .setProtectedHeader(header)\n .sign(new TextEncoder().encode(connectedApp.secretValue));\n\n return token;\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { credentialsSchema } from '../types/credentials.js';\n\nconst signInRequestSchema = z.object({\n credentials: z\n .object({\n site: z.object({\n contentUrl: z.string(),\n }),\n })\n .and(\n z\n .object({\n personalAccessTokenName: z.string(),\n personalAccessTokenSecret: z.string(),\n })\n .or(\n z.object({\n jwt: z.string(),\n }),\n ),\n ),\n});\n\nconst signInEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signin',\n alias: 'signIn',\n description: 'Signs in with Tableau credentials.',\n response: credentialsSchema,\n parameters: [\n {\n name: 'credentials',\n type: 'Body',\n schema: signInRequestSchema,\n },\n ],\n});\n\nconst signOutEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signout',\n alias: 'signOut',\n description:\n 'Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.',\n response: z.void(),\n});\n\nconst authenticationApi = makeApi([signInEndpoint, signOutEndpoint]);\nexport const authenticationApis = [\n ...authenticationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const credentialsSchema = z.object({\n credentials: z.object({\n site: z.object({\n id: z.string(),\n }),\n user: z.object({\n id: z.string(),\n }),\n token: z.string(),\n }),\n});\n\nexport type Credentials = z.infer<typeof credentialsSchema>['credentials'];\n", "import { ZodiosClass, ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nexport default class Methods<T extends ZodiosEndpointDefinitions> {\n protected _apiClient: ZodiosInstance<T>;\n\n constructor(apiClient: ZodiosInstance<T>) {\n this._apiClient = apiClient;\n }\n\n get interceptors(): ZodiosClass<T>['axios']['interceptors'] {\n return this._apiClient.axios.interceptors;\n }\n}\n", "import { ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nimport { Credentials } from '../types/credentials.js';\nimport Methods from './methods.js';\n\ntype AuthHeaders = {\n headers: {\n 'X-Tableau-Auth': string;\n };\n};\n\n/**\n * Base abstract class for any methods classes that require authentication.\n *\n * @export\n * @abstract\n * @class AuthenticatedMethods\n */\nexport default abstract class AuthenticatedMethods<\n T extends ZodiosEndpointDefinitions,\n> extends Methods<T> {\n private _creds: Credentials;\n\n protected get authHeader(): AuthHeaders {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n\n return {\n headers: {\n 'X-Tableau-Auth': this._creds.token,\n },\n };\n }\n\n protected get userId(): string {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n return this._creds.user.id;\n }\n\n constructor(apiClient: ZodiosInstance<T>, creds: Credentials) {\n super(apiClient);\n this._creds = creds;\n }\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { contentExplorationApis } from '../apis/contentExplorationApi.js';\nimport { SearchContentResponse } from '../types/contentExploration.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Content Exploration methods of the Tableau Server REST API\n *\n * @export\n * @class ContentExplorationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm\n */\nexport default class ContentExplorationMethods extends AuthenticatedMethods<\n typeof contentExplorationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, contentExplorationApis), creds);\n }\n\n /**\n * Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param terms - The search terms\n * @param page - The number of the page in the list reponse pages to return. Maximum number of items is 2000.\n * @param limit - The number of items to return on each page. The default is 10.\n * @param orderBy - The sorting method for items returned.\n * @param filter - An expression to filter the response\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm#ContentExplorationService_getSearch\n */\n searchContent = async (queries: {\n terms?: string;\n page?: number;\n limit?: number;\n orderBy?: string;\n filter?: string;\n }): Promise<SearchContentResponse> => {\n Object.entries(queries).forEach(([key, value]) => {\n if (value === undefined) {\n delete queries[key as keyof typeof queries];\n }\n });\n const response = await this._apiClient.searchContent({ queries, ...this.authHeader });\n return response.hits;\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { searchContentResponseSchema } from '../types/contentExploration.js';\n\nconst searchContentEndpoint = makeEndpoint({\n method: 'get',\n path: '/search',\n alias: 'searchContent',\n description:\n 'Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.',\n parameters: [\n {\n name: 'terms',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'page',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'limit',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'order_by',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n },\n ],\n response: z.object({\n hits: searchContentResponseSchema,\n }),\n});\n\nconst contentExplorationApi = makeApi([searchContentEndpoint]);\n\nexport const contentExplorationApis = [\n ...contentExplorationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst orderingMethods = z.enum([\n 'hitsTotal',\n 'hitsSmallSpanTotal',\n 'hitsMediumSpanTotal',\n 'hitsLargeSpanTotal',\n 'downstreamWorkbookCount',\n]);\n\nexport const orderBySchema = z\n .array(\n z.object({\n method: orderingMethods,\n sortDirection: z.enum(['asc', 'desc']).default('asc').optional(),\n }),\n )\n .nonempty();\n\nexport type OrderBy = z.infer<typeof orderBySchema>;\n\nconst contentTypes = z.enum([\n 'lens',\n 'datasource',\n 'virtualconnection',\n 'collection',\n 'project',\n 'flow',\n 'datarole',\n 'table',\n 'database',\n 'view',\n 'workbook',\n]);\n\nconst modifiedTimeSchema = z.union([\n z.array(z.string().datetime()).nonempty(),\n z\n .object({\n startDate: z.string().datetime(),\n endDate: z.string().datetime().optional(),\n })\n .strict(),\n z\n .object({\n startDate: z.string().datetime().optional(),\n endDate: z.string().datetime(),\n })\n .strict(),\n]);\n\nexport const searchContentFilterBase = z\n .object({\n contentTypes: z.array(contentTypes).nonempty(),\n ownerIds: z.array(z.number().int()).nonempty(),\n modifiedTime: modifiedTimeSchema,\n })\n .partial();\n\nexport const searchContentFilterSchema = z.union([\n searchContentFilterBase.extend({ contentTypes: z.array(contentTypes).nonempty() }).strict(),\n searchContentFilterBase.extend({ ownerIds: z.array(z.number().int()).nonempty() }).strict(),\n searchContentFilterBase.extend({ modifiedTime: modifiedTimeSchema }).strict(),\n]);\n\nexport type SearchContentFilter = z.infer<typeof searchContentFilterSchema>;\n\nconst searchContentItemSchema = z.object({\n uri: z.string(),\n content: z.record(z.string(), z.unknown()),\n});\n\nexport const searchContentResponseSchema = z\n .object({\n next: z.string(),\n prev: z.string(),\n pageIndex: z.number().int(),\n startIndex: z.number().int(),\n total: z.number().int(),\n limit: z.number().int(),\n items: z.array(searchContentItemSchema),\n })\n .partial();\n\nexport type SearchContentItem = z.infer<typeof searchContentItemSchema>;\n\nexport type SearchContentResponse = z.infer<typeof searchContentResponseSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { datasourcesApis } from '../apis/datasourcesApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { DataSource } from '../types/dataSource.js';\nimport { Pagination } from '../types/pagination.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Data Sources methods of the Tableau Server REST API\n *\n * @export\n * @class DatasourcesMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm\n */\nexport default class DatasourcesMethods extends AuthenticatedMethods<typeof datasourcesApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, datasourcesApis), creds);\n }\n\n /**\n * Returns a list of published data sources on the specified site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter datasources by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm#query_data_sources\n */\n listDatasources = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; datasources: DataSource[] }> => {\n const response = await this._apiClient.listDatasources({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n datasources: response.datasources.datasource ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { dataSourceSchema } from '../types/dataSource.js';\nimport { paginationSchema } from '../types/pagination.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst listDatasourcesRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/datasources',\n alias: 'listDatasources',\n description:\n 'Returns a list of published data sources on the specified site. Supports a filter string as a query parameter in the format field:operator:value.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description: 'Filter string in the format field:operator:value (e.g., name:eq:Project Views)',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n datasources: z.object({\n datasource: z.optional(z.array(dataSourceSchema)),\n }),\n }),\n});\n\nconst datasourcesApi = makeApi([listDatasourcesRestEndpoint]);\nexport const datasourcesApis = [...datasourcesApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\n\nexport const dataSourceSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n project: projectSchema,\n});\n\nexport type DataSource = z.infer<typeof dataSourceSchema>;\n", "import { z } from 'zod';\n\nexport const projectSchema = z.object({\n name: z.string(),\n id: z.string(),\n});\n", "import { z } from 'zod';\n\nexport const paginationSchema = z.object({\n pageNumber: z.coerce.number(),\n pageSize: z.coerce.number(),\n totalAvailable: z.coerce.number(),\n});\n\nexport type Pagination = z.infer<typeof paginationSchema>;\n", "import { ZodiosEndpointParameter } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const paginationParameters = [\n {\n name: 'pageSize',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.',\n },\n {\n name: 'pageNumber',\n type: 'Query',\n schema: z.number().optional(),\n description: 'The offset for paging. The default is 1.',\n },\n] as const satisfies Array<ZodiosEndpointParameter>;\n", "import { Zodios } from '@zodios/core';\n\nimport { GraphQLResponse, metadataApis } from '../apis/metadataApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Metadata methods of the Tableau Server REST API\n *\n * @export\n * @class MetadataMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_metadata.htm\n */\nexport default class MetadataMethods extends AuthenticatedMethods<typeof metadataApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, metadataApis), creds);\n }\n\n /**\n * Executes a GraphQL query against the Tableau Server.\n *\n * Required scopes: `tableau:content:read`\n *\n * @link https://help.tableau.com/current/api/metadata_api/en-us/index.html\n *\n * @param {string} query\n */\n graphql = async (query: string): Promise<GraphQLResponse> => {\n return await this._apiClient.graphql({ query }, { ...this.authHeader });\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const graphqlResponse = z.object({\n data: z.object({\n publishedDatasources: z.array(\n z.object({\n name: z.string().nullable(),\n description: z.string().nullable(),\n owner: z.object({\n name: z.string().nullable(),\n }),\n fields: z.array(\n z.object({\n name: z.string(),\n isHidden: z.boolean().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(\n z\n .object({\n attribute: z.string(),\n value: z.string().nullable(),\n })\n .nullable(),\n )\n .nullable(),\n fullyQualifiedName: z.string(),\n __typename: z.string(),\n // Common field properties (optional since they depend on field type)\n dataCategory: z.string().nullish(),\n role: z.string().nullish(),\n dataType: z.string().nullish(),\n defaultFormat: z.string().nullish(),\n semanticRole: z.string().nullish(),\n aggregation: z.string().nullish(),\n aggregationParam: z.string().nullish(),\n // CalculatedField specific properties\n formula: z.string().nullish(),\n isAutoGenerated: z.boolean().nullish(),\n hasUserReference: z.boolean().nullish(),\n // BinField specific properties\n binSize: z.number().nullish(),\n // GroupField specific properties\n hasOther: z.boolean().nullish(),\n // CombinedSetField specific properties\n delimiter: z.string().nullish(),\n combinationType: z.string().nullish(),\n }),\n ),\n }),\n ),\n }),\n});\n\nexport type GraphQLResponse = z.infer<typeof graphqlResponse>;\n\nconst graphqlEndpoint = makeEndpoint({\n method: 'post',\n path: '/graphql',\n alias: 'graphql',\n response: graphqlResponse,\n parameters: [\n {\n name: 'query',\n type: 'Body',\n schema: z.object({\n query: z.string(),\n }),\n },\n ],\n});\n\nconst metadataApi = makeApi([graphqlEndpoint]);\nexport const metadataApis = [...metadataApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport z from 'zod';\n\nimport { isAxiosError } from '../../../utils/isAxiosError.js';\nimport { pulseApis } from '../apis/pulseApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport {\n pulseBundleRequestSchema,\n pulseBundleResponseSchema,\n PulseInsightBundleType,\n PulseMetric,\n PulseMetricDefinition,\n PulseMetricDefinitionView,\n PulseMetricSubscription,\n} from '../types/pulse.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Pulse methods of the Tableau Server REST API\n *\n * @export\n * @class PulseMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm\n */\nexport default class PulseMethods extends AuthenticatedMethods<typeof pulseApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, pulseApis), creds);\n }\n\n /**\n * Returns a list of all published Pulse Metric Definitions.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param view - The view of the definition to return. If not specified, the default view is returned.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListDefinitions\n */\n listAllPulseMetricDefinitions = async (\n view?: PulseMetricDefinitionView,\n ): Promise<PulseResult<PulseMetricDefinition[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listAllPulseMetricDefinitions({\n queries: { view },\n ...this.authHeader,\n });\n return response.definitions ?? [];\n });\n };\n\n /**\n * Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param metricDefinitionIds - The list of metric definition IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetDefinitionsByPost\n */\n listPulseMetricDefinitionsFromMetricDefinitionIds = async (\n metricDefinitionIds: string[],\n view?: PulseMetricDefinitionView,\n ): Promise<PulseResult<PulseMetricDefinition[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricDefinitionsFromMetricDefinitionIds(\n { definition_ids: metricDefinitionIds },\n { queries: { view }, ...this.authHeader },\n );\n return response.definitions ?? [];\n });\n };\n\n /**\n * Returns a list of published Pulse Metrics.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param pulseMetricDefinitionID - The ID of the Pulse Metric Definition to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListMetrics\n */\n listPulseMetricsFromMetricDefinitionId = async (\n pulseMetricDefinitionID: string,\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricDefinitionId({\n params: { pulseMetricDefinitionID },\n ...this.authHeader,\n });\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metrics for a list of metric IDs.\n *\n * Required scopes: `tableau:insight_metrics:read`\n *\n * @param metricIds - The list of metric IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetMetrics\n */\n listPulseMetricsFromMetricIds = async (\n metricIds: string[],\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricIds(\n { metric_ids: metricIds },\n { ...this.authHeader },\n );\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metric Subscriptions for the current user.\n *\n * Required scopes: `tableau:metric_subscriptions:read`\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseSubscriptionService_ListSubscriptions\n */\n listPulseMetricSubscriptionsForCurrentUser = async (): Promise<\n PulseResult<PulseMetricSubscription[]>\n > => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricSubscriptionsForCurrentUser({\n queries: { user_id: this.userId },\n ...this.authHeader,\n });\n return response.subscriptions ?? [];\n });\n };\n\n /**\n * Returns the generated bundle of the current aggregate value for the Pulse metric.\n *\n * Required scopes: `tableau:insights:read`\n *\n * @param bundleRequest - The request to generate a bundle for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseInsightsService_GenerateInsightBundleBasic\n */\n generatePulseMetricValueInsightBundle = async (\n bundleRequest: z.infer<typeof pulseBundleRequestSchema>,\n bundleType: PulseInsightBundleType,\n ): Promise<PulseResult<z.infer<typeof pulseBundleResponseSchema>>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.generatePulseMetricValueInsightBundle(\n { bundle_request: bundleRequest.bundle_request },\n { params: { bundle_type: bundleType }, ...this.authHeader },\n );\n return response ?? {};\n });\n };\n}\n\ntype PulseResult<T> = Result<T, 'tableau-server' | 'pulse-disabled'>;\nasync function guardAgainstPulseDisabled<T>(callback: () => Promise<T>): Promise<PulseResult<T>> {\n try {\n return new Ok(await callback());\n } catch (error) {\n if (isAxiosError(error)) {\n if (error.response?.status === 404) {\n return new Err('tableau-server');\n }\n\n if (\n error.response?.status === 400 &&\n error.response.headers.tableau_error_code === '0xd3408984' &&\n error.response.headers.validation_code === '400999'\n ) {\n // ntbue-service-chassis/-/blob/main/server/interceptors/site_settings.go\n return new Err('pulse-disabled');\n }\n }\n\n throw error;\n }\n}\n", "'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n", "'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n", "import FormData from 'form-data';\n\nexport default FormData;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n", "'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n", "'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n", "import crypto from 'crypto';\nimport URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n const randomValues = new Uint32Array(size);\n crypto.randomFillSync(randomValues);\n for (let i = 0; i < size; i++) {\n str += alphabet[randomValues[i] % length];\n }\n\n return str;\n}\n\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n ALPHABET,\n generateString,\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n", "'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n", "const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n", "import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n", "'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n", "'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n", "'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n", "'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n", "'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n", "'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n", "'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n", "'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport proxyFromEnv from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport {EventEmitter} from 'events';\nimport formDataToStream from \"../helpers/formDataToStream.js\";\nimport readBlob from \"../helpers/readBlob.js\";\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from \"../helpers/callbackify.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n}\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n\nconst flushOnFinish = (stream, [throttled, flush]) => {\n stream\n .on('end', flush)\n .on('error', flush);\n\n return throttled;\n}\n\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n }\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n }\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n })\n};\n\nconst resolveFamily = ({address, family}) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return ({\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4)\n });\n}\n\nconst buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family});\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let {data, lookup, family} = config;\n const {responseType, responseEncoding} = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n if (err) {\n return cb(err);\n }\n\n const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n }\n }\n\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new EventEmitter();\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n emitter.removeAllListeners();\n }\n\n onDone((value, isRejected) => {\n isDone = true;\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n });\n\n function abort(reason) {\n emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n\n emitter.once('abort', reject);\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n // Apply the same semantics as HTTP: only enforce if a finite, non-negative cap is set.\n if (config.maxContentLength > -1) {\n // Use the exact string passed to fromDataURI (config.url); fall back to fullPath if needed.\n const dataUrl = String(config.url || fullPath || '');\n const estimated = estimateDataURLDecodedBytes(dataUrl);\n\n if (estimated > config.maxContentLength) {\n return reject(new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config\n ));\n }\n }\n\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const {onUploadProgress, onDownloadProgress} = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(data, (formHeaders) => {\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {\n }\n }\n } else if (utils.isBlob(data) || utils.isFile(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', flushOnFinish(\n data,\n progressEventDecorator(\n contentLength,\n progressEventReducer(asyncDecorator(onUploadProgress), false, 3)\n )\n ));\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname.startsWith(\"[\") ? parsed.hostname.slice(1, -1) : parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = +res.headers['content-length'];\n\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', flushOnFinish(\n transformStream,\n progressEventDecorator(\n responseLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)\n )\n ));\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const offListeners = stream.finished(responseStream, () => {\n offListeners();\n onFinished();\n });\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'stream has been aborted',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n emitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n emitter.once('abort', err => {\n reject(err);\n req.destroy(err);\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n reject(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n abort();\n });\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n}\n\nexport const __setProxy = setProxy;\n", "export const VERSION = \"1.12.1\";", "'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n", "'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const internals = this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n const pushChunk = (_chunk, _callback) => {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n internals.isCaptured && this.emit('progress', internals.bytesSeen);\n\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\n\nexport default AxiosTransformStream;\n", "import util from 'util';\nimport {Readable} from 'stream';\nimport utils from \"../utils.js\";\nimport readBlob from \"./readBlob.js\";\nimport platform from \"../platform/index.js\";\n\nconst BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const {escapeName} = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode(){\n yield this.headers;\n\n const {value} = this;\n\n if(utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match) => ({\n '\\r' : '%0D',\n '\\n' : '%0A',\n '\"' : '%22',\n }[match]));\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)\n } = options || {};\n\n if(!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long')\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`\n }\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from((async function *() {\n for(const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })());\n};\n\nexport default formDataToStream;\n", "const {asyncIterator} = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream()\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer()\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n}\n\nexport default readBlob;\n", "\"use strict\";\n\nimport stream from \"stream\";\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) { // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n", "import utils from \"../utils.js\";\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn) ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n}\n\nexport default callbackify;\n", "'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n", "/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n", "import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n", "/**\n * Estimate decoded byte length of a data:// URL *without* allocating large buffers.\n * - For base64: compute exact decoded size using length and padding;\n * handle %XX at the character-count level (no string allocation).\n * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.\n *\n * @param {string} url\n * @returns {number}\n */\nexport default function estimateDataURLDecodedBytes(url) {\n if (!url || typeof url !== 'string') return 0;\n if (!url.startsWith('data:')) return 0;\n\n const comma = url.indexOf(',');\n if (comma < 0) return 0;\n\n const meta = url.slice(5, comma);\n const body = url.slice(comma + 1);\n const isBase64 = /;base64/i.test(meta);\n\n if (isBase64) {\n let effectiveLen = body.length;\n const len = body.length; // cache length\n\n for (let i = 0; i < len; i++) {\n if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {\n const a = body.charCodeAt(i + 1);\n const b = body.charCodeAt(i + 2);\n const isHex =\n ((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&\n ((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));\n\n if (isHex) {\n effectiveLen -= 2;\n i += 2;\n }\n }\n }\n\n let pad = 0;\n let idx = len - 1;\n\n const tailIsPct3D = (j) =>\n j >= 2 &&\n body.charCodeAt(j - 2) === 37 && // '%'\n body.charCodeAt(j - 1) === 51 && // '3'\n (body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'\n\n if (idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n idx--;\n } else if (tailIsPct3D(idx)) {\n pad++;\n idx -= 3;\n }\n }\n\n if (pad === 1 && idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n } else if (tailIsPct3D(idx)) {\n pad++;\n }\n }\n\n const groups = Math.floor(effectiveLen / 4);\n const bytes = groups * 3 - (pad || 0);\n return bytes > 0 ? bytes : 0;\n }\n\n return Buffer.byteLength(body, 'utf8');\n}\n", "import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n", "import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n", "import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n", "import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n", "\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({fetch, Request, Response}) => ({\n fetch, Request, Response\n }))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n const {fetch, Request, Response} = Object.assign({}, globalFetchAPI, env);\n const isFetchSupported = isFunction(fetch);\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? fetch(request, fetchOptions) : fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, config ? config.env : null);\n\n const {fetch, Request, Response} = env;\n\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n", "import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n", "'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n", "'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n", "'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n", "'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n", "'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n", "const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n", "'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n", "import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport {\n pulseBundleRequestSchema,\n pulseBundleResponseSchema,\n pulseInsightBundleTypeEnum,\n pulseMetricDefinitionSchema,\n pulseMetricDefinitionViewEnum,\n pulseMetricSchema,\n pulseMetricSubscriptionSchema,\n} from '../types/pulse.js';\n\nconst listAllPulseMetricDefinitionsRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions',\n alias: 'listAllPulseMetricDefinitions',\n description: 'Returns a list of all published Pulse Metric Definitions on the specified site.',\n parameters: [\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n }),\n});\n\nconst listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/definitions%3AbatchGet',\n alias: 'listPulseMetricDefinitionsFromMetricDefinitionIds',\n description:\n 'Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.',\n parameters: [\n {\n name: 'definition_ids',\n type: 'Body',\n schema: z.object({ definition_ids: z.array(z.string().nonempty()).min(1) }),\n description: 'A list of metric definition IDs to retrieve.',\n },\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n }),\n});\n\nconst listPulseMetricsFromMetricDefinitionIdRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions/:pulseMetricDefinitionID/metrics',\n alias: 'listPulseMetricsFromMetricDefinitionId',\n description: 'Returns a list of published Pulse Metrics for a specific Pulse Metric Definition.',\n parameters: [\n {\n name: 'pulseMetricDefinitionID',\n type: 'Path',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n total_available: z.number(),\n }),\n});\n\nconst listPulseMetricsFromMetricIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/metrics%3AbatchGet',\n alias: 'listPulseMetricsFromMetricIds',\n description: 'Returns a list of Pulse Metrics for a list of metric IDs.',\n parameters: [\n {\n name: 'metric_ids',\n type: 'Body',\n schema: z.object({ metric_ids: z.array(z.string().nonempty()) }),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n }),\n});\n\nconst listPulseMetricSubscriptionsForCurrentUserRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/subscriptions',\n alias: 'listPulseMetricSubscriptionsForCurrentUser',\n description: 'Returns a list of Pulse Subscriptions for the current user.',\n parameters: [\n {\n name: 'user_id',\n type: 'Query',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n subscriptions: z.array(pulseMetricSubscriptionSchema),\n }),\n});\n\nconst generatePulseMetricValueInsightBundleRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/insights/:bundle_type',\n alias: 'generatePulseMetricValueInsightBundle',\n description: 'Generates a bundle for the current aggregated value for the Pulse metric.',\n parameters: [\n {\n name: 'bundle_request',\n type: 'Body',\n schema: pulseBundleRequestSchema,\n },\n {\n name: 'bundle_type',\n type: 'Path',\n schema: z.enum(pulseInsightBundleTypeEnum),\n },\n ],\n response: pulseBundleResponseSchema,\n});\n\nconst pulseApi = makeApi([\n generatePulseMetricValueInsightBundleRestEndpoint,\n listAllPulseMetricDefinitionsRestEndpoint,\n listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint,\n listPulseMetricsFromMetricDefinitionIdRestEndpoint,\n listPulseMetricSubscriptionsForCurrentUserRestEndpoint,\n listPulseMetricsFromMetricIdsRestEndpoint,\n]);\nexport const pulseApis = [...pulseApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst pulseMetadataSchema = z.object({\n name: z.string(),\n description: z.string(),\n id: z.string(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n definition_version: z.coerce.number(),\n last_updated_user: z.object({ id: z.string() }).optional(),\n});\n\nconst pulseDatasourceSchema = z.object({\n id: z.string(),\n});\n\nconst pulseFilterSchema = z.object({\n field: z.string(),\n operator: z.string(),\n categorical_values: z.array(\n z.object({\n string_value: z.string().optional(),\n bool_value: z.boolean().optional(),\n null_value: z.string().optional(),\n }),\n ),\n});\n\nconst pulseBasicSpecificationSchema = z.object({\n measure: z.object({ field: z.string(), aggregation: z.string() }),\n time_dimension: z.object({ field: z.string() }),\n filters: z.array(pulseFilterSchema),\n});\n\nconst pulseSpecificationSchema = z.object({\n datasource: pulseDatasourceSchema,\n basic_specification: pulseBasicSpecificationSchema,\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n is_running_total: z.boolean(),\n});\n\nexport const pulseExtensionOptionsSchema = z.object({\n allowed_dimensions: z.array(z.string()),\n allowed_granularities: z.array(z.string()),\n offset_from_today: z.number(),\n});\n\nexport const pulseMetricSpecificationSchema = z.object({\n filters: z.array(pulseFilterSchema),\n measurement_period: z.object({\n granularity: z.string(),\n range: z.string(),\n }),\n comparison: z.object({ comparison: z.string() }),\n});\n\nexport const pulseGoalsSchema = z.object({\n target: z.object({ value: z.number() }).optional(),\n});\n\nexport const pulseMetricSchema = z.object({\n id: z.string(),\n specification: pulseMetricSpecificationSchema,\n definition_id: z.string(),\n is_default: z.boolean(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n goals: pulseGoalsSchema.optional(),\n is_followed: z.boolean(),\n});\n\nexport const pulseRepresentationOptionsSchema = z.object({\n type: z.string(),\n number_units: z.object({\n singular_noun: z.string(),\n plural_noun: z.string(),\n }),\n sentiment_type: z.string(),\n row_level_id_field: z.object({ identifier_col: z.string() }),\n row_level_entity_names: z.object({\n entity_name_singular: z.string().optional(),\n entity_name_plural: z.string().optional(),\n }),\n row_level_name_field: z.object({ name_col: z.string() }),\n currency_code: z.string(),\n});\n\nexport const insightOptionsSchema = z.object({\n settings: z.array(z.object({ type: z.string(), disabled: z.boolean() })),\n});\n\nexport const comparisonSchema = z.object({\n comparisons: z.array(\n z.object({\n compare_config: z.object({ comparison: z.string() }),\n index: z.coerce.number(),\n }),\n ),\n});\n\nexport const datasourceGoalsSchema = z.array(\n z.object({\n basic_specification: pulseBasicSpecificationSchema,\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n minimum_granularity: z.string(),\n }),\n);\n\nexport const pulseMetricDefinitionSchema = z.object({\n metadata: pulseMetadataSchema,\n specification: pulseSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n metrics: z.array(pulseMetricSchema),\n total_metrics: z.coerce.number(),\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n comparisons: comparisonSchema,\n datasource_goals: datasourceGoalsSchema,\n});\n\nexport const pulseMetricSubscriptionSchema = z.object({\n id: z.string(),\n metric_id: z.string(),\n});\n\nexport const languageEnumSchema = z.enum([\n 'LANGUAGE_UNSPECIFIED',\n 'LANGUAGE_DE_DE',\n 'LANGUAGE_EN_US',\n 'LANGUAGE_EN_GB',\n 'LANGUAGE_ES_ES',\n 'LANGUAGE_FR_FR',\n 'LANGUAGE_FR_CA',\n 'LANGUAGE_GA_IE',\n 'LANGUAGE_IT_IT',\n 'LANGUAGE_JA_JP',\n 'LANGUAGE_KO_KR',\n 'LANGUAGE_NL_NL',\n 'LANGUAGE_PT_BR',\n 'LANGUAGE_SV_SE',\n 'LANGUAGE_TH_TH',\n 'LANGUAGE_ZH_CN',\n 'LANGUAGE_ZH_TW',\n]);\nexport type LanguageEnumType = z.infer<typeof languageEnumSchema>;\n\nexport const localeEnumSchema = z.enum([\n 'LOCALE_UNSPECIFIED',\n 'LOCALE_AR_AE',\n 'LOCALE_AR_BH',\n 'LOCALE_AR_DZ',\n 'LOCALE_AR_EG',\n 'LOCALE_AR_IQ',\n 'LOCALE_AR_JO',\n 'LOCALE_AR_KW',\n 'LOCALE_AR_LB',\n 'LOCALE_AR_LY',\n 'LOCALE_AR_MA',\n 'LOCALE_AR_OM',\n 'LOCALE_AR_QA',\n 'LOCALE_AR_SA',\n 'LOCALE_AR_SD',\n 'LOCALE_AR_SY',\n 'LOCALE_AR_TN',\n 'LOCALE_AR_YE',\n 'LOCALE_BE_BY',\n 'LOCALE_BG_BG',\n 'LOCALE_CA_ES',\n 'LOCALE_CS_CZ',\n 'LOCALE_DA_DK',\n 'LOCALE_DE_AT',\n 'LOCALE_DE_CH',\n 'LOCALE_DE_DE',\n 'LOCALE_DE_LU',\n 'LOCALE_EL_CY',\n 'LOCALE_EL_GR',\n 'LOCALE_EN_AU',\n 'LOCALE_EN_CA',\n 'LOCALE_EN_GB',\n 'LOCALE_EN_IE',\n 'LOCALE_EN_IN',\n 'LOCALE_EN_MT',\n 'LOCALE_EN_NZ',\n 'LOCALE_EN_PH',\n 'LOCALE_EN_SG',\n 'LOCALE_EN_US',\n 'LOCALE_EN_ZA',\n 'LOCALE_ES_AR',\n 'LOCALE_ES_BO',\n 'LOCALE_ES_CL',\n 'LOCALE_ES_CO',\n 'LOCALE_ES_CR',\n 'LOCALE_ES_DO',\n 'LOCALE_ES_EC',\n 'LOCALE_ES_ES',\n 'LOCALE_ES_GT',\n 'LOCALE_ES_HN',\n 'LOCALE_ES_MX',\n 'LOCALE_ES_NI',\n 'LOCALE_ES_PA',\n 'LOCALE_ES_PE',\n 'LOCALE_ES_PR',\n 'LOCALE_ES_PY',\n 'LOCALE_ES_SV',\n 'LOCALE_ES_US',\n 'LOCALE_ES_UY',\n 'LOCALE_ES_VE',\n 'LOCALE_ET_EE',\n 'LOCALE_FI_FI',\n 'LOCALE_FR_BE',\n 'LOCALE_FR_CA',\n 'LOCALE_FR_CH',\n 'LOCALE_FR_FR',\n 'LOCALE_FR_LU',\n 'LOCALE_GA_IE',\n 'LOCALE_HE_IL',\n 'LOCALE_HI_IN',\n 'LOCALE_HR_HR',\n 'LOCALE_HU_HU',\n 'LOCALE_ID_ID',\n 'LOCALE_IN_ID',\n 'LOCALE_IS_IS',\n 'LOCALE_IT_CH',\n 'LOCALE_IT_IT',\n 'LOCALE_IW_IL',\n 'LOCALE_JA_JP',\n 'LOCALE_KO_KR',\n 'LOCALE_LT_LT',\n 'LOCALE_LV_LV',\n 'LOCALE_MK_MK',\n 'LOCALE_MS_MY',\n 'LOCALE_MT_MT',\n 'LOCALE_NL_BE',\n 'LOCALE_NL_NL',\n 'LOCALE_NB_NO',\n 'LOCALE_NO_NO',\n 'LOCALE_PL_PL',\n 'LOCALE_PT_BR',\n 'LOCALE_PT_PT',\n 'LOCALE_RO_RO',\n 'LOCALE_RU_RU',\n 'LOCALE_SK_SK',\n 'LOCALE_SL_SI',\n 'LOCALE_SQ_AL',\n 'LOCALE_SR_BA',\n 'LOCALE_SR_ME',\n 'LOCALE_SR_RS',\n 'LOCALE_SV_SE',\n 'LOCALE_TH_TH',\n 'LOCALE_TR_TR',\n 'LOCALE_UK_UA',\n 'LOCALE_VI_VN',\n 'LOCALE_ZH_CN',\n 'LOCALE_ZH_HK',\n 'LOCALE_ZH_SG',\n 'LOCALE_ZH_TW',\n]);\nexport type LocaleEnumType = z.infer<typeof localeEnumSchema>;\n\nexport const outputFormatEnumSchema = z.enum([\n 'OUTPUT_FORMAT_UNSPECIFIED',\n 'OUTPUT_FORMAT_HTML',\n 'OUTPUT_FORMAT_TEXT',\n]);\nexport type OutputFormatEnumType = z.infer<typeof outputFormatEnumSchema>;\n\nexport const pulseBundleRequestSchema = z.object({\n bundle_request: z.object({\n version: z.number(),\n options: z.object({\n output_format: outputFormatEnumSchema,\n time_zone: z.string(),\n language: languageEnumSchema,\n locale: localeEnumSchema,\n }),\n input: z.object({\n metadata: z.object({\n name: z.string().nonempty(),\n metric_id: z.string().nonempty(),\n definition_id: z.string().nonempty(),\n }),\n metric: z.object({\n definition: z.object({\n datasource: z.object({\n id: z.string(),\n }),\n basic_specification: pulseBasicSpecificationSchema,\n is_running_total: z.boolean(),\n }),\n metric_specification: pulseMetricSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n goals: pulseGoalsSchema.optional(),\n }),\n }),\n }),\n});\n\nexport const popcBanInsightGroupSchema = z.object({\n type: z.string(),\n insights: z.array(\n z.object({\n result: z.object({\n type: z.string(),\n version: z.number(),\n content: z.string().optional(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n facts: z.any().optional(),\n characterization: z.string().optional(),\n question: z.string(),\n score: z.number(),\n }),\n insight_type: z.string(),\n }),\n ),\n summaries: z.array(\n z.object({\n result: z.object({\n id: z.string(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n generation_id: z.string(),\n timestamp: z.string().optional(),\n last_attempted_timestamp: z.string().optional(),\n }),\n }),\n ),\n});\n\nexport const pulseBundleResponseSchema = z.object({\n bundle_response: z.object({\n result: z.object({\n insight_groups: z.array(popcBanInsightGroupSchema),\n has_errors: z.boolean(),\n characterization: z.string(),\n }),\n }),\n});\n\nexport const pulseInsightBundleTypeEnum = ['ban', 'springboard', 'basic', 'detail'] as const;\nexport type PulseInsightBundleType = (typeof pulseInsightBundleTypeEnum)[number];\n\nexport const pulseMetricDefinitionViewEnum = [\n 'DEFINITION_VIEW_BASIC',\n 'DEFINITION_VIEW_FULL',\n 'DEFINITION_VIEW_DEFAULT',\n] as const;\nexport type PulseMetricDefinitionView = (typeof pulseMetricDefinitionViewEnum)[number];\n\nexport type PulseMetricDefinition = z.infer<typeof pulseMetricDefinitionSchema>;\nexport type PulseMetric = z.infer<typeof pulseMetricSchema>;\nexport type PulseMetricSubscription = z.infer<typeof pulseMetricSubscriptionSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { viewsApis } from '../apis/viewsApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { View } from '../types/view.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Views methods of the Tableau Server REST API\n *\n * @export\n * @class ViewsMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class ViewsMethods extends AuthenticatedMethods<typeof viewsApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, viewsApis), creds);\n }\n\n /**\n * Returns a specified view rendered as data in comma separated value (CSV) format.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_data\n */\n queryViewData = async ({\n viewId,\n siteId,\n }: {\n viewId: string;\n siteId: string;\n }): Promise<string> => {\n return await this._apiClient.queryViewData({\n params: { siteId, viewId },\n ...this.authHeader,\n });\n };\n\n /**\n * Returns an image of the specified view.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @param {number} width - (Optional) The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.\n * @param {number} height - (Optional) The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.\n * @param {string} resolution - (Optional) The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_image\n */\n queryViewImage = async ({\n viewId,\n siteId,\n width,\n height,\n resolution,\n }: {\n viewId: string;\n siteId: string;\n width?: number;\n height?: number;\n resolution?: 'high';\n }): Promise<string> => {\n return await this._apiClient.queryViewImage({\n params: { siteId, viewId },\n queries: { vizWidth: width, vizHeight: height, resolution },\n ...this.authHeader,\n responseType: 'arraybuffer',\n });\n };\n\n /**\n * Returns all the views for the specified workbook, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return views for.\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_workbook\n */\n queryViewsForWorkbook = async ({\n workbookId,\n siteId,\n includeUsageStatistics,\n }: {\n workbookId: string;\n siteId: string;\n includeUsageStatistics?: boolean;\n }): Promise<View[]> => {\n return (\n await this._apiClient.queryViewsForWorkbook({\n params: { siteId, workbookId },\n queries: { includeUsageStatistics },\n ...this.authHeader,\n })\n ).views.view;\n };\n\n /**\n * Returns all the views for the specified site, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @param {string} filter - (Optional) Fields and operators that you can use to filter results\n * @param {number} pageSize - (Optional) The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param {number} pageNumber - (Optional) The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_site\n */\n queryViewsForSite = async ({\n siteId,\n includeUsageStatistics,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n includeUsageStatistics?: boolean;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; views: View[] }> => {\n const response = await this._apiClient.queryViewsForSite({\n params: { siteId },\n queries: { includeUsageStatistics, filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n views: response.views.view ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { viewSchema } from '../types/view.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst queryViewDataEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/views/:viewId/data`,\n alias: 'queryViewData',\n description: 'Returns a specified view rendered as data in comma separated value (CSV) format.',\n response: z.string(),\n});\n\nconst queryViewImageEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/views/:viewId/image`,\n alias: 'queryViewImage',\n description: 'Returns an image of the specified view.',\n parameters: [\n {\n name: 'vizWidth',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.',\n },\n {\n name: 'vizHeight',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.',\n },\n {\n name: 'resolution',\n type: 'Query',\n schema: z.literal('high').optional(),\n description:\n 'The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.',\n },\n ],\n response: z.string(),\n});\n\nconst queryViewsForWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/workbooks/:workbookId/views`,\n alias: 'queryViewsForWorkbook',\n description:\n 'Returns all the views for the specified workbook, optionally including usage statistics.',\n parameters: [\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n ],\n response: z.object({ views: z.object({ view: z.array(viewSchema) }) }),\n});\n\nconst queryViewsForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/views`,\n alias: 'queryViewsForSite',\n description:\n 'Returns all the views for the specified site, optionally including usage statistics.',\n parameters: [\n ...paginationParameters,\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of views to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n views: z.object({ view: z.array(viewSchema).optional() }),\n }),\n});\n\nconst viewsApi = makeApi([\n queryViewDataEndpoint,\n queryViewImageEndpoint,\n queryViewsForWorkbookEndpoint,\n queryViewsForSiteEndpoint,\n]);\n\nexport const viewsApis = [...viewsApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const viewSchema = z.object({\n id: z.string(),\n name: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n workbook: z\n .object({\n id: z.string(),\n })\n .optional(),\n owner: z\n .object({\n id: z.string(),\n })\n .optional(),\n project: z\n .object({\n id: z.string(),\n })\n .optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n usage: z\n .object({\n totalViewCount: z.coerce.number(),\n })\n .optional(),\n});\n\nexport type View = z.infer<typeof viewSchema>;\n", "import { isErrorFromAlias, Zodios, ZodiosError } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport {\n MetadataResponse,\n QueryOutput,\n QueryRequest,\n ReadMetadataRequest,\n TableauError,\n vizqlDataServiceApis,\n} from '../apis/vizqlDataServiceApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * The VizQL Data Service (VDS) provides a programmatic way for you to access your published data outside of a Tableau visualization.\n *\n * @export\n * @class VizqlDataServiceMethods\n * @extends {AuthenticatedMethods<typeof vizqlDataServiceApis>}\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/index.html\n */\nexport default class VizqlDataServiceMethods extends AuthenticatedMethods<\n typeof vizqlDataServiceApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, vizqlDataServiceApis), creds);\n }\n\n /**\n * Queries a specific data source and returns the resulting data.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {z.infer<typeof QueryRequest>} queryRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/QueryDatasource\n */\n queryDatasource = async (\n queryRequest: z.infer<typeof QueryRequest>,\n ): Promise<Result<QueryOutput, 'feature-disabled' | TableauError | ZodiosError>> => {\n try {\n return Ok(await this._apiClient.queryDatasource(queryRequest, { ...this.authHeader }));\n } catch (error) {\n if (isErrorFromAlias(this._apiClient.api, 'queryDatasource', error)) {\n if (error.response.status === 404) {\n return Err('feature-disabled');\n }\n\n return Err(error.response.data);\n }\n\n if (error instanceof ZodiosError) {\n return Err(error);\n }\n\n throw error;\n }\n };\n\n /**\n * Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {z.infer<typeof ReadMetadataRequest>} readMetadataRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/ReadMetadata\n */\n readMetadata = async (\n readMetadataRequest: z.infer<typeof ReadMetadataRequest>,\n ): Promise<Result<MetadataResponse, 'feature-disabled'>> => {\n try {\n return Ok(await this._apiClient.readMetadata(readMetadataRequest, { ...this.authHeader }));\n } catch (error) {\n if (\n isErrorFromAlias(this._apiClient.api, 'readMetadata', error) &&\n error.response.status === 404\n ) {\n return Err('feature-disabled');\n }\n\n throw error;\n }\n };\n}\n", "import { makeApi, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nconst Connection = z.object({\n connectionLuid: z.string().optional(),\n connectionUsername: z.string(),\n connectionPassword: z.string(),\n});\n\nexport const Datasource = z.object({\n datasourceLuid: z.string().nonempty(),\n connections: z.array(Connection).optional(),\n});\n\nconst ReturnFormat = z.enum(['OBJECTS', 'ARRAYS']);\n\nconst QueryOptions = z\n .object({\n returnFormat: ReturnFormat,\n debug: z.boolean().default(false),\n })\n .partial()\n .passthrough();\n\nexport const ReadMetadataRequest = z\n .object({\n datasource: Datasource,\n options: QueryOptions.optional(),\n })\n .passthrough();\n\nexport const Function = z.enum([\n 'SUM',\n 'AVG',\n 'MEDIAN',\n 'COUNT',\n 'COUNTD',\n 'MIN',\n 'MAX',\n 'STDEV',\n 'VAR',\n 'COLLECT',\n 'YEAR',\n 'QUARTER',\n 'MONTH',\n 'WEEK',\n 'DAY',\n 'TRUNC_YEAR',\n 'TRUNC_QUARTER',\n 'TRUNC_MONTH',\n 'TRUNC_WEEK',\n 'TRUNC_DAY',\n 'AGG',\n 'NONE',\n 'UNSPECIFIED',\n]);\n\nconst DataType = z.enum([\n 'INTEGER',\n 'REAL',\n 'STRING',\n 'DATETIME',\n 'BOOLEAN',\n 'DATE',\n 'SPATIAL',\n 'UNKNOWN',\n]);\n\nconst PeriodType = z.enum(['MINUTES', 'HOURS', 'DAYS', 'WEEKS', 'MONTHS', 'QUARTERS', 'YEARS']);\n\nconst FieldMetadata = z\n .object({\n fieldName: z.string(),\n fieldCaption: z.string(),\n dataType: DataType,\n defaultAggregation: Function,\n columnClass: z.enum(['COLUMN', 'BIN', 'GROUP', 'CALCULATION', 'TABLE_CALCULATION']),\n formula: z.string(),\n logicalTableId: z.string(),\n })\n .partial()\n .passthrough();\n\nconst ParameterValue = z.union([z.number(), z.string(), z.boolean(), z.null()]);\n\nconst ParameterBase = z.object({\n parameterCaption: z.string(),\n dataType: DataType.exclude(['DATETIME', 'SPATIAL', 'UNKNOWN']),\n parameterName: z.string().optional(),\n value: ParameterValue,\n});\n\nconst Parameter = z.discriminatedUnion('parameterType', [\n ParameterBase.extend({ parameterType: z.literal('ANY_VALUE') }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('LIST'),\n members: z.array(ParameterValue),\n }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('QUANTITATIVE_DATE'),\n value: z.string().nullable(),\n minDate: z.string().nullish(),\n maxDate: z.string().nullish(),\n periodValue: z.number().nullish(),\n periodType: PeriodType.nullish(),\n }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('QUANTITATIVE_RANGE'),\n value: z.number().nullable(),\n min: z.number().nullish(),\n max: z.number().nullish(),\n step: z.number().nullish(),\n }).strict(),\n]);\n\nexport const MetadataOutput = z\n .object({\n data: z.array(FieldMetadata),\n extraData: z.object({\n parameters: z.array(Parameter),\n }),\n })\n .partial()\n .passthrough();\n\nexport type FieldMetadata = z.infer<typeof FieldMetadata>;\nexport type MetadataResponse = z.infer<typeof MetadataOutput>;\n\nexport const TableauError = z\n .object({\n errorCode: z.string(),\n message: z.string(),\n datetime: z.string().datetime({ offset: true }),\n debug: z.object({}).partial().passthrough(),\n 'tab-error-code': z.string(),\n })\n .partial()\n .passthrough();\n\nexport type TableauError = z.infer<typeof TableauError>;\n\nconst SortDirection = z.enum(['ASC', 'DESC']);\n\nconst FieldBase = z.object({\n fieldCaption: z.string(),\n fieldAlias: z.string().optional(),\n maxDecimalPlaces: z.number().int().optional(),\n sortDirection: SortDirection.optional(),\n sortPriority: z.number().int().optional(),\n});\n\nexport const Field = z.union([\n FieldBase.strict(),\n FieldBase.extend({ function: Function }).strict(),\n FieldBase.extend({ calculation: z.string() }).strict(),\n]);\n\nexport const FilterField = z.union([\n z.object({ fieldCaption: z.string() }).strict(),\n z.object({ fieldCaption: z.string(), function: Function }).strict(),\n z.object({ calculation: z.string() }).strict(),\n]);\n\nconst FilterBase = z.object({\n field: FilterField,\n context: z.boolean().optional(),\n});\n\nconst SimpleFilterBase = z.object({\n field: z.object({ fieldCaption: z.string() }).strict(),\n context: z.boolean().optional(),\n});\n\nexport const SetFilter = SimpleFilterBase.extend({\n filterType: z.literal('SET'),\n values: z.union([z.array(z.string()), z.array(z.number()), z.array(z.boolean())]),\n exclude: z.boolean().optional(),\n});\n\nconst RelativeDateFilterBase = SimpleFilterBase.extend({\n filterType: z.literal('DATE'),\n periodType: PeriodType,\n anchorDate: z.string().optional(),\n includeNulls: z.boolean().optional(),\n});\n\nconst RelativeDateFilter = z.discriminatedUnion('dateRangeType', [\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('CURRENT') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('LAST') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('NEXT') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('TODATE') }).strict(),\n RelativeDateFilterBase.extend({\n dateRangeType: z.literal('LASTN'),\n rangeN: z.number().int(),\n }).strict(),\n RelativeDateFilterBase.extend({\n dateRangeType: z.literal('NEXTN'),\n rangeN: z.number().int(),\n }).strict(),\n]);\n\nconst MatchFilterBase = SimpleFilterBase.extend({\n filterType: z.literal('MATCH'),\n startsWith: z.string().optional(),\n endsWith: z.string().optional(),\n contains: z.string().optional(),\n exclude: z.boolean().optional(),\n});\n\nexport const MatchFilter = z.union([\n MatchFilterBase.extend({ startsWith: z.string() }).strict(),\n MatchFilterBase.extend({ endsWith: z.string() }).strict(),\n MatchFilterBase.extend({ contains: z.string() }).strict(),\n]);\n\nconst QuantitativeNumericalFilterBase = FilterBase.extend({\n filterType: z.literal('QUANTITATIVE_NUMERICAL'),\n});\n\nconst QuantitativeNumericalFilter = z.discriminatedUnion('quantitativeFilterType', [\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('RANGE'),\n min: z.number(),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('MIN'),\n min: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('MAX'),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n }).strict(),\n]);\n\nconst QuantitativeDateFilterBase = FilterBase.extend({\n filterType: z.literal('QUANTITATIVE_DATE'),\n});\n\nconst QuantitativeDateFilter = z.discriminatedUnion('quantitativeFilterType', [\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('RANGE'),\n minDate: z.string(),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('MIN'),\n minDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('MAX'),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n }).strict(),\n]);\n\nexport const TopNFilter = FilterBase.extend({\n filterType: z.literal('TOP'),\n howMany: z.number().int(),\n fieldToMeasure: FilterField,\n direction: z.enum(['TOP', 'BOTTOM']).optional().default('TOP'),\n});\n\nexport const Filter = z.union([\n SetFilter.strict(),\n TopNFilter.strict(),\n ...MatchFilter.options,\n ...QuantitativeNumericalFilter.options,\n ...QuantitativeDateFilter.options,\n ...RelativeDateFilter.options,\n]);\n\nexport const Query = z.strictObject({\n fields: z.array(Field),\n filters: z.array(Filter).optional(),\n});\n\nconst QueryDatasourceOptions = QueryOptions.and(\n z\n .object({\n disaggregate: z.boolean(),\n })\n .partial()\n .passthrough(),\n);\n\nexport const QueryRequest = z\n .object({\n datasource: Datasource,\n query: Query,\n options: QueryDatasourceOptions.optional(),\n })\n .passthrough();\n\nexport const QueryOutput = z\n .object({\n data: z.array(z.unknown()),\n })\n .partial()\n .passthrough();\n\nexport type QueryOutput = z.infer<typeof QueryOutput>;\n\nconst vizqlDataServiceApi = makeApi([\n {\n method: 'post',\n path: '/query-datasource',\n alias: 'queryDatasource',\n description: `Queries a specific data source and returns the resulting data.`,\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: QueryRequest,\n },\n ],\n response: QueryOutput,\n errors: [\n {\n status: 'default',\n schema: TableauError,\n },\n {\n status: 404,\n schema: z.any(),\n },\n ],\n },\n {\n method: 'post',\n path: '/read-metadata',\n alias: 'readMetadata',\n description: `Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.`,\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: ReadMetadataRequest,\n },\n ],\n response: MetadataOutput,\n errors: [\n {\n status: 404,\n schema: z.any(),\n },\n ],\n },\n {\n method: 'get',\n path: '/simple-request',\n alias: 'simpleRequest',\n description: `Sends a request that can be used for testing or doing a health check.`,\n requestFormat: 'json',\n response: z.string(),\n },\n]);\n\nexport const vizqlDataServiceApis = [\n ...vizqlDataServiceApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\n\nimport { workbooksApis } from '../apis/workbooksApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { Workbook } from '../types/workbook.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Workbooks methods of the Tableau Server REST API\n *\n * @export\n * @class WorkbooksMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class WorkbooksMethods extends AuthenticatedMethods<typeof workbooksApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, workbooksApis), creds);\n }\n\n /**\n * Returns information about the specified workbook, including information about views and tags.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return information for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbook\n */\n getWorkbook = async ({\n workbookId,\n siteId,\n }: {\n workbookId: string;\n siteId: string;\n }): Promise<Workbook> => {\n return (\n await this._apiClient.getWorkbook({\n params: { siteId, workbookId },\n ...this.authHeader,\n })\n ).workbook;\n };\n\n /**\n * Returns the workbooks on a site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter workbooks by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbooks_for_site\n */\n queryWorkbooksForSite = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; workbooks: Workbook[] }> => {\n const response = await this._apiClient.queryWorkbooksForSite({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n workbooks: response.workbooks.workbook ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { workbookSchema } from '../types/workbook.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst getWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/workbooks/:workbookId`,\n alias: 'getWorkbook',\n description:\n 'Returns information about the specified workbook, including information about views and tags.',\n response: z.object({ workbook: workbookSchema }),\n});\n\nconst queryWorkbooksForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/workbooks`,\n alias: 'queryWorkbooksForSite',\n description: 'Returns the workbooks on a site.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of workbooks to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n workbooks: z.object({\n workbook: z.optional(z.array(workbookSchema)),\n }),\n }),\n});\n\nconst workbooksApi = makeApi([queryWorkbooksForSiteEndpoint, getWorkbookEndpoint]);\n\nexport const workbooksApis = [...workbooksApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\nimport { viewSchema } from './view.js';\n\nexport const workbookSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n webpageUrl: z.string().optional(),\n contentUrl: z.string(),\n project: projectSchema.optional(),\n showTabs: z.coerce.boolean(),\n defaultViewId: z.string().optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n views: z.optional(\n z.object({\n view: z.array(viewSchema),\n }),\n ),\n});\n\nexport type Workbook = z.infer<typeof workbookSchema>;\n", "import { AuthConfig } from './authConfig.js';\nimport {\n AxiosInterceptor,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n ResponseInterceptor,\n} from './interceptors.js';\nimport AuthenticationMethods, {\n AuthenticatedAuthenticationMethods,\n} from './methods/authenticationMethods.js';\nimport ContentExplorationMethods from './methods/contentExplorationMethods.js';\nimport DatasourcesMethods from './methods/datasourcesMethods.js';\nimport MetadataMethods from './methods/metadataMethods.js';\nimport PulseMethods from './methods/pulseMethods.js';\nimport ViewsMethods from './methods/viewsMethods.js';\nimport VizqlDataServiceMethods from './methods/vizqlDataServiceMethods.js';\nimport WorkbooksMethods from './methods/workbooksMethods.js';\nimport { Credentials } from './types/credentials.js';\n\n/**\n * Interface for the Tableau REST APIs\n *\n * @export\n * @class RestApi\n */\nexport default class RestApi {\n private _creds?: Credentials;\n private readonly _host: string;\n private readonly _baseUrl: string;\n private readonly _baseUrlWithoutVersion: string;\n\n private _authenticationMethods?: AuthenticationMethods;\n private _authenticatedAuthenticationMethods?: AuthenticatedAuthenticationMethods;\n private _contentExplorationMethods?: ContentExplorationMethods;\n private _datasourcesMethods?: DatasourcesMethods;\n private _metadataMethods?: MetadataMethods;\n private _pulseMethods?: PulseMethods;\n private _vizqlDataServiceMethods?: VizqlDataServiceMethods;\n private _viewsMethods?: ViewsMethods;\n private _workbooksMethods?: WorkbooksMethods;\n private static _version = '3.24';\n\n private _requestInterceptor?: [RequestInterceptor, ErrorInterceptor?];\n private _responseInterceptor?: [ResponseInterceptor, ErrorInterceptor?];\n\n constructor(\n host: string,\n options?: Partial<{\n requestInterceptor: [RequestInterceptor, ErrorInterceptor?];\n responseInterceptor: [ResponseInterceptor, ErrorInterceptor?];\n }>,\n ) {\n this._host = host;\n this._baseUrl = `${this._host}/api/${RestApi._version}`;\n this._baseUrlWithoutVersion = `${this._host}/api/-`;\n this._requestInterceptor = options?.requestInterceptor;\n this._responseInterceptor = options?.responseInterceptor;\n }\n\n private get creds(): Credentials {\n if (!this._creds) {\n throw new Error('No credentials found. Authenticate by calling signIn() first.');\n }\n\n return this._creds;\n }\n\n get siteId(): string {\n return this.creds.site.id;\n }\n\n private get authenticationMethods(): AuthenticationMethods {\n if (!this._authenticationMethods) {\n this._authenticationMethods = new AuthenticationMethods(this._baseUrl);\n this._addInterceptors(this._baseUrl, this._authenticationMethods.interceptors);\n }\n return this._authenticationMethods;\n }\n\n private get authenticatedAuthenticationMethods(): AuthenticatedAuthenticationMethods {\n if (!this._authenticatedAuthenticationMethods) {\n this._authenticatedAuthenticationMethods = new AuthenticatedAuthenticationMethods(\n this._baseUrl,\n this.creds,\n );\n this._addInterceptors(this._baseUrl, this._authenticatedAuthenticationMethods.interceptors);\n }\n return this._authenticatedAuthenticationMethods;\n }\n\n get contentExplorationMethods(): ContentExplorationMethods {\n if (!this._contentExplorationMethods) {\n this._contentExplorationMethods = new ContentExplorationMethods(\n this._baseUrlWithoutVersion,\n this.creds,\n );\n this._addInterceptors(\n this._baseUrlWithoutVersion,\n this._contentExplorationMethods.interceptors,\n );\n }\n\n return this._contentExplorationMethods;\n }\n\n get datasourcesMethods(): DatasourcesMethods {\n if (!this._datasourcesMethods) {\n this._datasourcesMethods = new DatasourcesMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._datasourcesMethods.interceptors);\n }\n\n return this._datasourcesMethods;\n }\n\n get metadataMethods(): MetadataMethods {\n if (!this._metadataMethods) {\n const baseUrl = `${this._host}/api/metadata`;\n this._metadataMethods = new MetadataMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._metadataMethods.interceptors);\n }\n\n return this._metadataMethods;\n }\n\n get pulseMethods(): PulseMethods {\n if (!this._pulseMethods) {\n this._pulseMethods = new PulseMethods(this._baseUrlWithoutVersion, this.creds);\n this._addInterceptors(this._baseUrlWithoutVersion, this._pulseMethods.interceptors);\n }\n\n return this._pulseMethods;\n }\n\n get vizqlDataServiceMethods(): VizqlDataServiceMethods {\n if (!this._vizqlDataServiceMethods) {\n const baseUrl = `${this._host}/api/v1/vizql-data-service`;\n this._vizqlDataServiceMethods = new VizqlDataServiceMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._vizqlDataServiceMethods.interceptors);\n }\n\n return this._vizqlDataServiceMethods;\n }\n\n get viewsMethods(): ViewsMethods {\n if (!this._viewsMethods) {\n this._viewsMethods = new ViewsMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._viewsMethods.interceptors);\n }\n\n return this._viewsMethods;\n }\n\n get workbooksMethods(): WorkbooksMethods {\n if (!this._workbooksMethods) {\n this._workbooksMethods = new WorkbooksMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._workbooksMethods.interceptors);\n }\n\n return this._workbooksMethods;\n }\n\n signIn = async (authConfig: AuthConfig): Promise<void> => {\n this._creds = await this.authenticationMethods.signIn(authConfig);\n };\n\n signOut = async (): Promise<void> => {\n await this.authenticatedAuthenticationMethods.signOut();\n this._creds = undefined;\n };\n\n private _addInterceptors = (baseUrl: string, interceptors: AxiosInterceptor): void => {\n interceptors.request.use(\n (config) => {\n this._requestInterceptor?.[0]({\n baseUrl,\n ...getRequestInterceptorConfig(config),\n });\n return config;\n },\n (error) => {\n this._requestInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n\n interceptors.response.use(\n (response) => {\n this._responseInterceptor?.[0]({\n baseUrl,\n ...getResponseInterceptorConfig(response),\n });\n return response;\n },\n (error) => {\n this._responseInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n };\n}\n", "import { RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Config, getConfig } from './config.js';\nimport { log, shouldLogWhenLevelIsAtLeast } from './logging/log.js';\nimport { maskRequest, maskResponse } from './logging/secretMask.js';\nimport {\n AxiosResponseInterceptorConfig,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n RequestInterceptorConfig,\n ResponseInterceptor,\n ResponseInterceptorConfig,\n} from './sdks/tableau/interceptors.js';\nimport RestApi from './sdks/tableau/restApi.js';\nimport { Server } from './server.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\nimport { isAxiosError } from './utils/isAxiosError.js';\n\ntype JwtScopes =\n | 'tableau:viz_data_service:read'\n | 'tableau:content:read'\n | 'tableau:insight_definitions_metrics:read'\n | 'tableau:insight_metrics:read'\n | 'tableau:metric_subscriptions:read'\n | 'tableau:insights:read'\n | 'tableau:views:download';\n\nconst getNewRestApiInstanceAsync = async (\n config: Config,\n requestId: RequestId,\n server: Server,\n jwtScopes: Set<JwtScopes>,\n): Promise<RestApi> => {\n const restApi = new RestApi(config.server, {\n requestInterceptor: [\n getRequestInterceptor(server, requestId),\n getRequestErrorInterceptor(server, requestId),\n ],\n responseInterceptor: [\n getResponseInterceptor(server, requestId),\n getResponseErrorInterceptor(server, requestId),\n ],\n });\n\n if (config.auth === 'pat') {\n await restApi.signIn({\n type: 'pat',\n patName: config.patName,\n patValue: config.patValue,\n siteName: config.siteName,\n });\n } else if (config.auth === 'direct-trust') {\n await restApi.signIn({\n type: 'direct-trust',\n siteName: config.siteName,\n username: getJwtSubClaim(config),\n clientId: config.connectedAppClientId,\n secretId: config.connectedAppSecretId,\n secretValue: config.connectedAppSecretValue,\n scopes: jwtScopes,\n additionalPayload: getJwtAdditionalPayload(config),\n });\n }\n\n return restApi;\n};\n\nexport const useRestApi = async <T>({\n config,\n requestId,\n server,\n callback,\n jwtScopes,\n}: {\n config: Config;\n requestId: RequestId;\n server: Server;\n jwtScopes: Array<JwtScopes>;\n callback: (restApi: RestApi) => Promise<T>;\n}): Promise<T> => {\n const restApi = await getNewRestApiInstanceAsync(config, requestId, server, new Set(jwtScopes));\n try {\n return await callback(restApi);\n } finally {\n await restApi.signOut();\n }\n};\n\nexport const getRequestInterceptor =\n (server: Server, requestId: RequestId): RequestInterceptor =>\n (request) => {\n request.headers['User-Agent'] = `${server.name}/${server.version}`;\n logRequest(server, request, requestId);\n return request;\n };\n\nexport const getRequestErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.request) {\n log.error(server, `Request ${requestId} failed with error: ${getExceptionMessage(error)}`, {\n logger: 'rest-api',\n requestId,\n });\n return;\n }\n\n const { request } = error;\n logRequest(\n server,\n {\n baseUrl,\n ...getRequestInterceptorConfig(request),\n },\n requestId,\n );\n };\n\nexport const getResponseInterceptor =\n (server: Server, requestId: RequestId): ResponseInterceptor =>\n (response) => {\n logResponse(server, response, requestId);\n return response;\n };\n\nexport const getResponseErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.response) {\n log.error(\n server,\n `Response from request ${requestId} failed with error: ${getExceptionMessage(error)}`,\n { logger: 'rest-api', requestId },\n );\n return;\n }\n\n // The type for the AxiosResponse headers is complex and not directly assignable to that of the Axios response interceptor's.\n const { response } = error as { response: AxiosResponseInterceptorConfig };\n logResponse(\n server,\n {\n baseUrl,\n ...getResponseInterceptorConfig(response),\n },\n requestId,\n );\n };\n\nfunction logRequest(server: Server, request: RequestInterceptorConfig, requestId: RequestId): void {\n const config = getConfig();\n const maskedRequest = config.disableLogMasking ? request : maskRequest(request);\n const url = new URL(maskedRequest.url ?? '', maskedRequest.baseUrl);\n if (request.params && Object.keys(request.params).length > 0) {\n url.search = new URLSearchParams(request.params).toString();\n }\n\n const messageObj = {\n type: 'request',\n requestId,\n method: maskedRequest.method,\n url: url.toString(),\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedRequest.headers,\n data: maskedRequest.data,\n params: maskedRequest.params,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction logResponse(\n server: Server,\n response: ResponseInterceptorConfig,\n requestId: RequestId,\n): void {\n const config = getConfig();\n const maskedResponse = config.disableLogMasking ? response : maskResponse(response);\n const url = new URL(maskedResponse.url ?? '', maskedResponse.baseUrl);\n if (response.request?.params && Object.keys(response.request.params).length > 0) {\n url.search = new URLSearchParams(response.request.params).toString();\n }\n const messageObj = {\n type: 'response',\n requestId,\n url: url.toString(),\n status: maskedResponse.status,\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedResponse.headers,\n data: maskedResponse.data,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction getJwtSubClaim(config: Config): string {\n return config.jwtSubClaim;\n}\n\nfunction getJwtAdditionalPayload(config: Config): Record<string, unknown> {\n const json = config.jwtAdditionalPayload;\n return JSON.parse(json || '{}');\n}\n", "import { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { CallToolResult, RequestId, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Result } from 'ts-results-es';\nimport { z, ZodRawShape, ZodTypeAny } from 'zod';\nimport { fromError, isZodErrorLike } from 'zod-validation-error';\n\nimport { getToolLogMessage, log } from '../logging/log.js';\nimport { Server } from '../server.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { ToolName } from './toolName.js';\n\ntype ArgsValidator<Args extends ZodRawShape | undefined = undefined> = Args extends ZodRawShape\n ? (args: z.objectOutputType<Args, ZodTypeAny>) => void\n : never;\n\n/**\n * The parameters for creating a tool instance\n *\n * @typeParam Args - The schema of the tool's parameters\n */\nexport type ToolParams<Args extends ZodRawShape | undefined = undefined> = {\n // The MCP server instance\n server: Server;\n\n // The name of the tool\n name: ToolName;\n\n // The description of the tool\n description: string;\n\n // The schema of the tool's parameters\n paramsSchema: Args;\n\n // The annotations of the tool\n annotations: ToolAnnotations;\n\n // A function that validates the tool's arguments provided by the client\n argsValidator?: ArgsValidator<Args>;\n\n // The implementation of the tool itself\n callback: ToolCallback<Args>;\n};\n\n/**\n * The parameters the logAndExecute method\n *\n * @typeParam T - The type of the result the tool's implementation returns\n * @typeParam E - The type of the error the tool's implementation can return\n * @typeParam Args - The schema of the tool's parameters\n */\ntype LogAndExecuteParams<T, E, Args extends ZodRawShape | undefined = undefined> = {\n // The request ID of the tool call\n requestId: RequestId;\n\n // The arguments of the tool call\n args: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;\n\n // A function that contains the business logic of the tool to be logged and executed\n callback: () => Promise<Result<T, E | ZodiosError>>;\n\n // A function that can transform a successful result of the callback into a CallToolResult\n getSuccessResult?: (result: T) => CallToolResult;\n\n // A function that can transform an error result of the callback into a string.\n // Required if the callback can return an error result.\n getErrorText?: (error: E) => string;\n};\n\n/**\n * Represents an MCP tool\n *\n * @template Args - The schema of the tool's parameters or undefined if the tool has no parameters\n */\nexport class Tool<Args extends ZodRawShape | undefined = undefined> {\n server: Server;\n name: ToolName;\n description: string;\n paramsSchema: Args;\n annotations: ToolAnnotations;\n argsValidator?: ArgsValidator<Args>;\n callback: ToolCallback<Args>;\n\n constructor({\n server,\n name,\n description,\n paramsSchema,\n annotations,\n argsValidator,\n callback,\n }: ToolParams<Args>) {\n this.server = server;\n this.name = name;\n this.description = description;\n this.paramsSchema = paramsSchema;\n this.annotations = annotations;\n this.argsValidator = argsValidator;\n this.callback = callback;\n }\n\n logInvocation({ requestId, args }: { requestId: RequestId; args: unknown }): void {\n log.debug(this.server, getToolLogMessage({ requestId, toolName: this.name, args }));\n }\n\n // Overload for E = undefined (getErrorText omitted)\n async logAndExecute<T>(\n params: Omit<LogAndExecuteParams<T, undefined, Args>, 'getErrorText'>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getSuccessResult omitted)\n async logAndExecute<T, E>(\n params: Required<Omit<LogAndExecuteParams<T, E, Args>, 'getSuccessResult'>>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getErrorText required)\n async logAndExecute<T, E>(\n params: Required<LogAndExecuteParams<T, E, Args>>,\n ): Promise<CallToolResult>;\n\n // Implementation\n async logAndExecute<T, E>({\n requestId,\n args,\n callback,\n getSuccessResult,\n getErrorText,\n }: LogAndExecuteParams<T, E, Args>): Promise<CallToolResult> {\n this.logInvocation({ requestId, args });\n\n if (args) {\n try {\n this.argsValidator?.(args);\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n\n try {\n const result = await callback();\n\n if (result.isOk()) {\n if (getSuccessResult) {\n return getSuccessResult(result.value);\n }\n\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify(result.value),\n },\n ],\n };\n }\n\n if (result.error instanceof ZodiosError) {\n return getErrorResult(requestId, result.error);\n }\n\n if (getErrorText) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: getErrorText(result.error),\n },\n ],\n };\n } else {\n return getErrorResult(requestId, result.error);\n }\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n}\n\nfunction getErrorResult(requestId: RequestId, error: unknown): CallToolResult {\n if (error instanceof ZodiosError && isZodErrorLike(error.cause)) {\n // Schema validation errors on otherwise successful API calls will not return an \"error\" result to the MCP client.\n // We instead return the full response from the API with a data quality warning message\n // that mentions why the schema validation failed.\n // This should make it so users don't get \"stuck\" when our schemas are too strict or wrong.\n // The only con is that the full response from the API might be larger than normal\n // since a successful schema validation \"trims\" the response down to the shape of the schema.\n const validationError = fromError(error.cause);\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n data: error.data,\n warning: validationError.toString(),\n }),\n },\n ],\n };\n }\n\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `requestId: ${requestId}, error: ${getExceptionMessage(error)}`,\n },\n ],\n };\n}\n", "import {\n OrderBy,\n SearchContentFilter,\n SearchContentResponse,\n} from '../../sdks/tableau/types/contentExploration.js';\n\nexport function buildOrderByString(orderBy: OrderBy): string {\n const methodsUsed = new Set<string>();\n return orderBy\n .flatMap((ordering) => {\n if (methodsUsed.has(ordering.method)) {\n return []; // skip duplicate methods\n }\n methodsUsed.add(ordering.method);\n return ordering.method + (ordering.sortDirection ? `:${ordering.sortDirection}` : '');\n })\n .join(',');\n}\n\nexport function buildFilterString(filter: SearchContentFilter): string {\n const filterExpressions: Array<string> = [];\n if (filter.contentTypes) {\n if (filter.contentTypes.length === 1) {\n filterExpressions.push(`type:eq:${filter.contentTypes[0]}`);\n } else {\n const typesUsed = new Set<string>();\n for (const type of filter.contentTypes) {\n typesUsed.add(type);\n }\n filterExpressions.push(`type:in:[${Array.from(typesUsed).join(',')}]`);\n }\n }\n if (filter.ownerIds) {\n if (filter.ownerIds.length === 1) {\n filterExpressions.push(`ownerId:eq:${filter.ownerIds[0]}`);\n } else {\n const idsUsed = new Set<number>();\n for (const id of filter.ownerIds) {\n idsUsed.add(id);\n }\n filterExpressions.push(`ownerId:in:[${Array.from(idsUsed).join(',')}]`);\n }\n }\n if (filter.modifiedTime) {\n if (Array.isArray(filter.modifiedTime)) {\n if (filter.modifiedTime.length === 1) {\n filterExpressions.push(`modifiedTime:eq:${filter.modifiedTime[0]}`);\n } else {\n const modifiedTimesUsed = new Set<string>();\n for (const modifiedTime of filter.modifiedTime) {\n modifiedTimesUsed.add(modifiedTime);\n }\n filterExpressions.push(`modifiedTime:in:[${Array.from(modifiedTimesUsed).join(',')}]`);\n }\n } else if (filter.modifiedTime.startDate && filter.modifiedTime.endDate) {\n let startDate = filter.modifiedTime.startDate;\n let endDate = filter.modifiedTime.endDate;\n // if the client provides startDate and endDate in the wrong order, we swap them\n if (startDate > endDate) {\n startDate = filter.modifiedTime.endDate;\n endDate = filter.modifiedTime.startDate;\n }\n filterExpressions.push(`modifiedTime:gte:${startDate}`);\n filterExpressions.push(`modifiedTime:lte:${endDate}`);\n } else if (filter.modifiedTime.startDate) {\n filterExpressions.push(`modifiedTime:gte:${filter.modifiedTime.startDate}`);\n } else if (filter.modifiedTime.endDate) {\n filterExpressions.push(`modifiedTime:lte:${filter.modifiedTime.endDate}`);\n }\n }\n\n return filterExpressions.join(',');\n}\n\nexport function reduceSearchContentResponse(\n response: SearchContentResponse,\n): Array<Record<string, unknown>> {\n const searchResults: Array<Record<string, unknown>> = [];\n if (response.items) {\n for (const item of response.items) {\n searchResults.push(getReducedSearchItemContent(item.content));\n }\n }\n return searchResults;\n}\n\nfunction getReducedSearchItemContent(content: Record<string, any>): Record<string, unknown> {\n const reducedContent: Record<string, unknown> = {};\n if (content.modifiedTime) {\n reducedContent.modifiedTime = content.modifiedTime;\n }\n if (content.sheetType) {\n reducedContent.sheetType = content.sheetType;\n }\n if (content.caption) {\n reducedContent.caption = content.caption;\n }\n if (content.workbookDescription) {\n reducedContent.workbookDescription = content.workbookDescription;\n }\n if (content.type) {\n reducedContent.type = content.type;\n }\n if (content.ownerId) {\n reducedContent.ownerId = content.ownerId;\n }\n if (content.title) {\n reducedContent.title = content.title;\n }\n if (content.ownerName) {\n reducedContent.ownerName = content.ownerName;\n }\n if (content.containerName) {\n if (content.type === 'view') {\n reducedContent.parentWorkbookName = content.containerName;\n } else {\n reducedContent.containerName = content.containerName;\n }\n }\n if (content.luid) {\n reducedContent.luid = content.luid;\n }\n if (content.locationName) {\n reducedContent.locationName = content.locationName;\n }\n if (content.comments?.length) {\n reducedContent.comments = content.comments;\n }\n if (content.hitsTotal != undefined) {\n reducedContent.totalViewCount = content.hitsTotal;\n }\n if (content.favoritesTotal != undefined) {\n reducedContent.favoritesTotal = content.favoritesTotal;\n }\n if (content.tags?.length) {\n reducedContent.tags = content.tags;\n }\n if (content.projectName) {\n reducedContent.projectName = content.projectName;\n }\n if (content.hitsSmallSpanTotal != undefined) {\n reducedContent.viewCountLastMonth = content.hitsSmallSpanTotal;\n }\n if (content.downstreamWorkbookCount != undefined) {\n reducedContent.downstreamWorkbookCount = content.downstreamWorkbookCount;\n }\n if (content.isConnectable != undefined) {\n reducedContent.isConnectable = content.isConnectable;\n }\n if (content.datasourceIsPublished != undefined) {\n reducedContent.datasourceIsPublished = content.datasourceIsPublished;\n }\n if (content.connectionType) {\n reducedContent.connectionType = content.connectionType;\n }\n if (content.isCertified != undefined) {\n reducedContent.isCertified = content.isCertified;\n }\n if (content.hasExtracts != undefined) {\n reducedContent.hasExtracts = content.hasExtracts;\n }\n if (content.extractRefreshedAt) {\n reducedContent.extractRefreshedAt = content.extractRefreshedAt;\n }\n if (content.extractUpdatedAt) {\n reducedContent.extractUpdatedAt = content.extractUpdatedAt;\n }\n if (content.connectedWorkbooksCount != undefined) {\n reducedContent.connectedWorkbooksCount = content.connectedWorkbooksCount;\n }\n if (content.extractCreationPending != undefined) {\n reducedContent.extractCreationPending = content.extractCreationPending;\n }\n if (content.hasSevereDataQualityWarning != undefined) {\n reducedContent.hasSevereDataQualityWarning = content.hasSevereDataQualityWarning;\n }\n if (content.datasourceLuid) {\n reducedContent.datasourceLuid = content.datasourceLuid;\n }\n if (content.hasActiveDataQualityWarning != undefined) {\n reducedContent.hasActiveDataQualityWarning = content.hasActiveDataQualityWarning;\n }\n return reducedContent;\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { Server } from '../../server.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { Tool } from '../tool.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport {\n combineFields,\n FieldsResult,\n simplifyReadMetadataResult,\n} from './datasourceMetadataUtils.js';\n\nexport const getGraphqlQuery = (datasourceLuid: string): string => `\n query datasourceFieldInfo {\n publishedDatasources(filter: { luid: \"${datasourceLuid}\" }) {\n name\n description\n owner {\n name\n }\n fields {\n name\n isHidden\n description\n descriptionInherited {\n attribute\n value\n }\n fullyQualifiedName\n __typename\n ... on AnalyticsField {\n __typename\n }\n ... on ColumnField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n }\n ... on CalculatedField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n formula\n isAutoGenerated\n hasUserReference\n }\n ... on BinField {\n dataCategory\n role\n dataType\n formula\n binSize\n }\n ... on GroupField {\n dataCategory\n role\n dataType\n hasOther\n }\n ... on CombinedSetField {\n delimiter\n combinationType\n }\n }\n }\n }`;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n};\n\nexport type GetDatasourceMetadataError = {\n type: 'feature-disabled';\n};\n\nexport const getGetDatasourceMetadataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getDatasourceMetadataTool = new Tool({\n server,\n name: 'get-datasource-metadata',\n description: `\n This tool retrieves field metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API.\n The fields provided by this tool will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc.\n This tool should be used for getting the metadata to ground the use of a tool that queries Tableau published data sources.\n `,\n paramsSchema,\n annotations: {\n title: 'Get Datasource Metadata',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateDatasourceLuid,\n callback: async ({ datasourceLuid }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const query = getGraphqlQuery(datasourceLuid);\n\n return await getDatasourceMetadataTool.logAndExecute<\n FieldsResult,\n GetDatasourceMetadataError\n >({\n requestId,\n args: { datasourceLuid },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read', 'tableau:viz_data_service:read'],\n callback: async (restApi) => {\n // Fetching metadata from VizQL Data Service API.\n const readMetadataResult = await restApi.vizqlDataServiceMethods.readMetadata({\n datasource: {\n datasourceLuid,\n },\n });\n\n if (readMetadataResult.isErr()) {\n return Err({ type: 'feature-disabled' });\n }\n\n if (config.disableMetadataApiRequests) {\n // Exit early since requests to the Tableau Metadata API are disabled.\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n let listFieldsResult: GraphQLResponse;\n\n try {\n // Fetching metadata from Tableau Metadata API.\n // Using try-catch here since requests could fail if the service is not enabled.\n listFieldsResult = await restApi.metadataMethods.graphql(query);\n } catch {\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n // Combine the results from the VizQL Data Service API and the Tableau Metadata API.\n return Ok(combineFields(readMetadataResult.value, listFieldsResult));\n },\n });\n },\n getErrorText: (error: GetDatasourceMetadataError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n }\n },\n });\n },\n });\n\n return getDatasourceMetadataTool;\n};\n", "export function getVizqlDataServiceDisabledError(): string {\n return [\n 'The VizQL Data Service is disabled on this Tableau Server.',\n 'To enable it, use TSM using the instructions at https://help.tableau.com/current/server-linux/en-us/cli_configuration-set_tsm.htm#featuresvizqldataservicedeploywithtsm.',\n ].join(' ');\n}\n", "export function validateDatasourceLuid({ datasourceLuid }: { datasourceLuid: string }): void {\n if (!datasourceLuid) {\n throw new Error('datasourceLuid must be a non-empty string.');\n }\n}\n", "import { z } from 'zod';\n\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { MetadataResponse } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\nexport const fieldSchema = z\n .object({\n name: z.string(),\n columnClass: z.string(),\n dataType: z.string().nullable(),\n defaultAggregation: z.string().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(z.object({ attribute: z.string(), value: z.string().nullable() }).nullable())\n .nullable(),\n dataCategory: z.string().nullable(),\n role: z.string().nullable(),\n defaultFormat: z.string().nullable(),\n semanticRole: z.string().nullable(),\n aggregation: z.string().nullable(),\n aggregationParam: z.string().nullable(),\n formula: z.string().nullable(),\n isAutoGenerated: z.boolean().nullable(),\n hasUserReference: z.boolean().nullable(),\n binSize: z.number().nullable(),\n })\n .partial();\n\nexport const parameterSchema = z\n .object({\n name: z.string(),\n parameterType: z.string(),\n dataType: z.string().nullable(),\n value: z.union([z.number(), z.string(), z.boolean(), z.null()]),\n members: z.array(z.union([z.number(), z.string(), z.boolean(), z.null()])),\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n minDate: z.string().nullable(),\n maxDate: z.string().nullable(),\n periodValue: z.number().nullable(),\n periodType: z.string().nullable(),\n })\n .partial();\n\nexport const fieldsResultSchema = z.object({\n fields: z.array(fieldSchema),\n parameters: z.array(parameterSchema),\n});\n\ntype Parameter = z.infer<typeof parameterSchema>;\ntype Field = z.infer<typeof fieldSchema>;\nexport type FieldsResult = z.infer<typeof fieldsResultSchema>;\n\nexport function simplifyReadMetadataResult(readMetadataResult: MetadataResponse): FieldsResult {\n const simplifiedResponse: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n return simplifiedResponse;\n }\n\n // This is a simplified response that attempts to reduce tokens by\n // only including essential fields and renaming properties.\n for (const field of readMetadataResult.data) {\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n simplifiedResponse.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n simplifiedResponse.parameters.push(toPush);\n }\n }\n\n return simplifiedResponse;\n}\n\nexport function combineFields(\n readMetadataResult: MetadataResponse,\n listFieldsResult: GraphQLResponse,\n): FieldsResult {\n // Create a response object that combines field data from\n // readMetadata (VizQL Data Service API) and listFields (GraphQL Metadata API) results\n // to optimize for LLM accuracy and reduce tokens in response.\n const combinedFields: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n if (listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n // fallback to returning listFields results if we don't have any fields from readMetadata.\n for (const field of listFieldsResult.data.publishedDatasources[0].fields) {\n const toPush: Field = { name: field.name };\n if (field.dataType) {\n toPush.dataType = field.dataType;\n }\n if (field.aggregation) {\n toPush.defaultAggregation = field.aggregation;\n }\n populateFieldWithAdditionalProperties(field, toPush);\n combinedFields.fields.push(toPush);\n }\n }\n\n return combinedFields;\n }\n\n // Only include fields from readMetadata results in our response object since only those can be used in queries.\n for (const field of readMetadataResult.data) {\n // only keeping essential field properties.\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n combinedFields.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n combinedFields.parameters.push(toPush);\n }\n }\n\n if (!listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n return combinedFields;\n }\n\n // Of the fields in our response object, populate them with additional properties we get from listFields results.\n for (const field of combinedFields.fields) {\n const matchingListField = listFieldsResult.data.publishedDatasources[0].fields.find(\n (f) => f.name === field.name,\n );\n if (matchingListField) {\n populateFieldWithAdditionalProperties(matchingListField, field);\n }\n }\n\n return combinedFields;\n}\n\nfunction populateFieldWithAdditionalProperties(sourceField: Field, targetField: Field): void {\n if (sourceField.description) {\n targetField.description = sourceField.description;\n }\n if (sourceField.descriptionInherited?.length) {\n targetField.descriptionInherited = sourceField.descriptionInherited;\n }\n if (sourceField.dataCategory) {\n targetField.dataCategory = sourceField.dataCategory;\n }\n if (sourceField.role) {\n targetField.role = sourceField.role;\n }\n if (sourceField.defaultFormat) {\n targetField.defaultFormat = sourceField.defaultFormat;\n }\n if (sourceField.formula) {\n targetField.formula = sourceField.formula;\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.isAutoGenerated != undefined) {\n targetField.isAutoGenerated = sourceField.isAutoGenerated;\n }\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.hasUserReference != undefined) {\n targetField.hasUserReference = sourceField.hasUserReference;\n }\n }\n // Possibly null or undefined, only populate if defined.\n if (sourceField.binSize != undefined) {\n targetField.binSize = sourceField.binSize;\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { Tool } from '../tool.js';\nimport { parseAndValidateDatasourcesFilterString } from './datasourcesFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListDatasourcesTool = (server: Server): Tool<typeof paramsSchema> => {\n const listDatasourcesTool = new Tool({\n server,\n name: 'list-datasources',\n description: `\n Retrieves a list of published data sources from a specified Tableau site using the Tableau REST API. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Views) for precise and flexible data source discovery. Use this tool when a user requests to list, search, or filter Tableau data sources on a site.\n \n **Supported Filter Fields and Operators**\n | Field | Operators |\n |------------------------|-------------------------------------------|\n | authenticationType | eq, in |\n | connectedWorkbookType | eq, gt, gte, lt, lte |\n | connectionTo | eq, in |\n | connectionType | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | databaseName | eq, in |\n | databaseUserName | eq, in |\n | description | eq, in |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlert | eq |\n | hasEmbeddedPassword | eq |\n | hasExtracts | eq |\n | isCertified | eq |\n | isConnectable | eq |\n | isDefaultPort | eq |\n | isHierarchical | eq |\n | isPublished | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq |\n | ownerName | eq, in |\n | projectName* | eq, in |\n | serverName | eq, in |\n | serverPort | eq |\n | size | eq, gt, gte, lt, lte |\n | tableName | eq, in |\n | tags | eq, in |\n | type | eq |\n | updatedAt | eq, gt, gte, lt, lte |\n \n ${genericFilterDescription}\n \n **Example Usage:**\n - List all data sources on a site\n - List data sources with the name \"Project Views\":\n filter: \"name:eq:Project Views\"\n - List data sources in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List data sources created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List data sources with the name \"Project Views\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Project Views,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"\n `,\n paramsSchema,\n annotations: {\n title: 'List Datasources',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ filter, pageSize, limit }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateDatasourcesFilterString(filter) : undefined;\n return await listDatasourcesTool.logAndExecute({\n requestId,\n args: { filter, pageSize, limit },\n callback: async () => {\n const datasources = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const datasources = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, datasources: data } =\n await restApi.datasourcesMethods.listDatasources({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return datasources;\n },\n });\n\n return new Ok(datasources);\n },\n });\n },\n });\n\n return listDatasourcesTool;\n};\n", "import { z } from 'zod';\n\nimport { Pagination } from '../sdks/tableau/types/pagination.js';\n\nconst pageConfigSchema = z\n .object({\n pageSize: z.coerce.number().gt(0),\n pageNumber: z.coerce.number().gt(0),\n limit: z.coerce.number().gt(0),\n })\n .partial();\n\ntype PageConfig = z.infer<typeof pageConfigSchema>;\n\ntype PaginateArgs<T> = {\n pageConfig: PageConfig;\n getDataFn: (pagination: PageConfig) => Promise<{ pagination: Pagination; data: Array<T> }>;\n};\n\nexport async function paginate<T>({ pageConfig, getDataFn }: PaginateArgs<T>): Promise<Array<T>> {\n const { pageSize, limit } = pageConfigSchema.parse(pageConfig);\n const { pagination, data } = await getDataFn(pageConfig);\n const result = [...data];\n\n let { totalAvailable, pageNumber } = pagination;\n while (totalAvailable > result.length && (!limit || limit > result.length)) {\n const { pagination: nextPagination, data: nextData } = await getDataFn({\n pageSize,\n pageNumber: pageNumber + 1,\n limit,\n });\n\n if (nextData.length === 0) {\n throw new Error(\n `No more data available. Last fetched page number: ${pageNumber}, Total available: ${totalAvailable}, Total fetched: ${result.length}`,\n );\n }\n\n ({ totalAvailable, pageNumber } = nextPagination);\n result.push(...nextData);\n }\n\n if (limit && limit < result.length) {\n result.length = limit;\n }\n\n return result;\n}\n", "export const genericFilterDescription = `**Supported Operators**\n - \\`eq\\`: equals\n - \\`gt\\`: greater than\n - \\`gte\\`: greater than or equal\n - \\`in\\`: any of [list] (for searching tags)\n - \\`lt\\`: less than\n - \\`lte\\`: less than or equal\n \n **Filter Expression Notes**\n - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded.\n - Operators are delimited with colons (:). For example: \\`filter=name:eq:Project Views\\`\n - Field names, operator names, and values are case-sensitive.\n - To filter on multiple fields, combine expressions using a comma: \\`filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher\\`\n - Multiple expressions are combined using a logical AND.\n - If you include the same field multiple times, only the last reference is used.\n - For date-time values, use ISO 8601 format (e.g., \\`2016-05-04T21:24:49Z\\`).\n - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions:\n - Starts with: \\`?filter=name:eq:mark*\\`\n - Ends with: \\`?filter=name:eq:*-ample\\`\n - Contains: \\`?filter=name:eq:mark*ex*\\``;\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\n// === Field and Operator Definitions ===\n// [Tableau REST API Data Sources filter fields](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_filtering_and_sorting.htm#datasources)\n\nconst FilterFieldSchema = z.enum([\n 'authenticationType',\n 'connectedWorkbookType',\n 'connectionTo',\n 'connectionType',\n 'contentUrl',\n 'createdAt',\n 'databaseName',\n 'databaseUserName',\n 'description',\n 'favoritesTotal',\n 'hasAlert',\n 'hasEmbeddedPassword',\n 'hasExtracts',\n 'isCertified',\n 'isConnectable',\n 'isDefaultPort',\n 'isHierarchical',\n 'isPublished',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'serverName',\n 'serverPort',\n 'size',\n 'tableName',\n 'tags',\n 'type',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n authenticationType: ['eq', 'in'],\n connectedWorkbookType: ['eq', 'gt', 'gte', 'lt', 'lte'],\n connectionTo: ['eq', 'in'],\n connectionType: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n databaseName: ['eq', 'in'],\n databaseUserName: ['eq', 'in'],\n description: ['eq', 'in'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlert: ['eq'],\n hasEmbeddedPassword: ['eq'],\n hasExtracts: ['eq'],\n isCertified: ['eq'],\n isConnectable: ['eq'],\n isDefaultPort: ['eq'],\n isHierarchical: ['eq'],\n isPublished: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n serverName: ['eq', 'in'],\n serverPort: ['eq'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tableName: ['eq', 'in'],\n tags: ['eq', 'in'],\n type: ['eq'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateDatasourcesFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import z from 'zod';\n\nexport const FilterOperatorSchema = z.enum(['eq', 'in', 'gt', 'gte', 'lt', 'lte']);\nexport type FilterOperator = z.infer<typeof FilterOperatorSchema>;\n\nexport function isISO8601DateTime(value: string): boolean {\n // Basic ISO 8601 regex (covers most common cases)\n // Example: 2016-05-04T21:24:49Z\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/.test(value);\n}\n\nconst dateTimeFields = ['createdAt', 'updatedAt'];\n\n/**\n * Parses and validates a Tableau-style filter string\n * @param filterString e.g. 'name:eq:Project Views,type:eq:Workbook'\n * @param allowedOperatorsByField - A map of filter fields to allowed operators\n * @param filterFieldSchema - A schema for the filter field\n * @returns validated filter string\n * @throws ZodError or custom error for invalid operators\n */\nexport function parseAndValidateFilterString<\n TFilterField extends string,\n TFilterExpression extends { field: TFilterField; operator: FilterOperator; value: string } = {\n field: TFilterField;\n operator: FilterOperator;\n value: string;\n },\n>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema,\n}: {\n filterString: string;\n allowedOperatorsByField: Record<TFilterField, FilterOperator[]>;\n filterFieldSchema: z.ZodSchema<TFilterField>;\n}): string {\n function isOperatorAllowed(field: TFilterField, operator: FilterOperator): boolean {\n const allowed = allowedOperatorsByField[field];\n return allowed.includes(operator);\n }\n\n const expressions = filterString\n .split(',')\n .map((f) => f.trim())\n .filter(Boolean);\n\n const parsedFilters: Record<string, TFilterExpression> = {};\n\n for (const expr of expressions) {\n const [fieldRaw, operatorRaw, ...valueParts] = expr.split(':');\n if (!fieldRaw || !operatorRaw || valueParts.length === 0) {\n throw new Error(`Invalid filter expression format: \"${expr}\"`);\n }\n\n const value = valueParts.join(':');\n\n const field = filterFieldSchema.parse(fieldRaw);\n const operator = FilterOperatorSchema.parse(operatorRaw);\n\n if (!isOperatorAllowed(field, operator)) {\n throw new Error(\n `Operator '${operator}' is not allowed for field '${field}'. Allowed operators: ${allowedOperatorsByField[field].join(', ')}`,\n );\n }\n\n // Validate ISO 8601 for date-time fields\n if (dateTimeFields.includes(field) && !isISO8601DateTime(value)) {\n throw new Error(\n `Value for field '${field}' must be a valid ISO 8601 date-time string (e.g., 2016-05-04T21:24:49Z)`,\n );\n }\n\n parsedFilters[field] = { field, operator, value } as TFilterExpression;\n }\n\n // Reconstruct the filter string from validated filters\n return Object.values(parsedFilters)\n .map((f) => `${f.field}:${f.operator}:${f.value}`)\n .join(',');\n}\n\nexport const exportedForTesting = {\n FilterOperatorSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport z from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport {\n pulseBundleRequestSchema,\n pulseInsightBundleTypeEnum,\n} from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n bundleRequest: pulseBundleRequestSchema,\n bundleType: z.optional(z.enum(pulseInsightBundleTypeEnum)),\n};\n\nexport const getGeneratePulseMetricValueInsightBundleTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const generatePulseMetricValueInsightBundleTool = new Tool({\n server,\n name: 'generate-pulse-metric-value-insight-bundle',\n description: `\nGenerate an insight bundle for the current aggregated value for Pulse Metric using Tableau REST API. You need the full information of the Pulse Metric and Pulse Metric Definition to use this tool.\n\n**Parameters:**\n- \\`bundleRequest\\` (required): The request to generate a bundle for. Most of the information comes from data returned from other tools that retrieve Pulse Metric and Pulse Metric Definition information. When creating the bundleRequest, you will need to set options using the following values:\n - output_format: 'OUTPUT_FORMAT_HTML'\n - time_zone: 'UTC'\n - language: 'LANGUAGE_EN_US'\n - locale: 'LOCALE_EN_US'\n- \\`bundleType\\` (optional): The type of bundle to generate. The default is 'ban'.\n - 'ban' - Return a basic insight bundle with the current aggregated value for the Pulse Metric, period over period change, and the highest ranked insight for each filterable dimension of the metric.\n - 'springboard' - Return a springboard insight bundle with the current value, period over period change, and the highest ranked insight for the metric.\n - 'basic' - Similar to a springboard insight, but data is focused on the dimensions of a metric that are low bandwidth because they have small value sets. It shows the current value, period over period change, and the highest ranked insight for the metric for that data.\n - 'detail' - Shows insights on performance over time of the metric, a summary visualization of metric highs and lows and trends, breakdowns of top contributors for each filterable dimension of the metric, and followup insights based on the top ranked insights not already presented.\n\n**Example Usage:**\n- Generate the default insight bundle for the Pulse metric:\n bundleRequest: {\n bundle_request: {\n version: 1,\n options: {\n output_format: 'OUTPUT_FORMAT_HTML',\n time_zone: 'UTC',\n language: 'LANGUAGE_EN_US',\n locale: 'LOCALE_EN_US',\n },\n input: {\n metadata: {\n name: 'Pulse Metric',\n metric_id: 'CF32DDCC-362B-4869-9487-37DA4D152552',\n definition_id: 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3',\n },\n metric: {\n definition: {\n datasource: {\n id: 'A6FC3C9F-4F40-4906-8DB0-AC70C5FB5A11',\n },\n basic_specification: {\n measure: {\n field: 'Sales',\n aggregation: 'AGGREGATION_SUM', \n },\n time_dimension: {\n field: 'Order Date',\n },\n filters: [],\n },\n is_running_total: false,\n },\n metric_specification: {\n filters: [],\n measurement_period: {\n granularity: 'GRANULARITY_BY_QUARTER',\n range: 'RANGE_LAST_COMPLETE',\n },\n comparison: {\n comparison: 'TIME_COMPARISON_PREVIOUS_PERIOD',\n },\n },\n extension_options: {\n allowed_dimensions: [],\n allowed_granularities: [],\n offset_from_today: 0,\n },\n representation_options: {\n type: 'NUMBER_FORMAT_TYPE_NUMBER',\n number_units: {\n singular_noun: 'unit',\n plural_noun: 'units',\n },\n row_level_id_field: {\n identifier_col: 'Order ID',\n identifier_label: '',\n },\n row_level_entity_names: {\n entity_name_singular: 'Order',\n },\n row_level_name_field: {\n name_col: 'Order Name',\n },\n currency_code: 'CURRENCY_CODE_USD',\n },\n insights_options: {\n show_insights: true,\n settings: [],\n },\n goals: {\n target: {\n value: 100,\n },\n },\n },\n },\n },\n },\n- Generate the ban insight bundle for the Pulse metric:\n bundleType: 'ban',\n bundleRequest: (See default example above)\n- Generate the springboard insight bundle for the Pulse metric:\n bundleType: 'springboard',\n bundleRequest: (See default example above)\n- Generate the basic insight bundle for the Pulse metric:\n bundleType: 'basic',\n bundleRequest: (See default example above)\n- Generate the detail insight bundle for the Pulse metric:\n bundleType: 'detail',\n bundleRequest: (See default example above)\n`,\n paramsSchema,\n annotations: {\n title: 'Generate Pulse Metric Value Insight Bundle',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ bundleRequest, bundleType }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await generatePulseMetricValueInsightBundleTool.logAndExecute({\n requestId,\n args: { bundleRequest, bundleType },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insights:read'],\n callback: async (restApi) =>\n await restApi.pulseMethods.generatePulseMetricValueInsightBundle(\n bundleRequest,\n bundleType ?? 'ban',\n ),\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return generatePulseMetricValueInsightBundleTool;\n};\n", "export function getPulseDisabledError(reason: 'tableau-server' | 'pulse-disabled'): string {\n switch (reason) {\n case 'tableau-server':\n return [\n 'Pulse is not available on Tableau Server.',\n 'Consider disabling the Pulse MCP tools in your client or removing them using the EXCLUDE_TOOLS environment variable.',\n 'To enable Pulse on your Tableau Cloud site, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n case 'pulse-disabled':\n return [\n 'Pulse is disabled on this Tableau Cloud site.',\n 'To enable Pulse, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n};\n\nexport const getListAllPulseMetricDefinitionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listAllPulseMetricDefinitionsTool = new Tool({\n server,\n name: 'list-all-pulse-metric-definitions',\n description: `\nRetrieves a list of all published Pulse Metric Definitions using the Tableau REST API. Use this tool when a user requests to list all Tableau Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n\n**Example Usage:**\n- List all Pulse Metric Definitions on the current site\n- List all Pulse Metric Definitions on the current site with the default view:\n view: 'DEFINITION_VIEW_DEFAULT'\n- List all Pulse Metric Definitions on the current site with the full view:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List all Pulse Metric Definitions on the current site with the basic view:\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for my Pulse Metric Definitions:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List All Pulse Metric Definitions',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ view }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listAllPulseMetricDefinitionsTool.logAndExecute({\n requestId,\n args: { view },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listAllPulseMetricDefinitions(view);\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listAllPulseMetricDefinitionsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricDefinitionIds: z.array(z.string().length(36)).min(1),\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n};\n\nexport const getListPulseMetricDefinitionsFromDefinitionIdsTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricDefinitionsFromDefinitionIdsTool = new Tool({\n server,\n name: 'list-pulse-metric-definitions-from-definition-ids',\n description: `\nRetrieves a list of specific Pulse Metric Definitions using the Tableau REST API from a list of metric definition IDs. Use this tool when a user requests information about specific Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`metricDefinitionIds\\` (required): A list of metric definition IDs to retrieve.\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n\n**Example Usage:**\n- Can you show me details about Pulse Metric Definition with id 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3'\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3']\n- List Pulse Metric Definitions from a list of metric definition IDs:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4']\n- List these Pulse Metric Definitions with the default view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_DEFAULT'\n- List these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL',\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List these Pulse Metric Definitions with the basic view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Definitions from Metric Definition IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ view, metricDefinitionIds }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricDefinitionsFromDefinitionIdsTool.logAndExecute({\n requestId,\n args: { metricDefinitionIds, view },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricDefinitionsFromMetricDefinitionIds(\n metricDefinitionIds,\n view,\n );\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricDefinitionsFromDefinitionIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n pulseMetricDefinitionID: z.string().length(36),\n};\n\nexport const getListPulseMetricsFromMetricDefinitionIdTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricDefinitionIdTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-definition-id',\n description: `\nRetrieves a list of published Pulse Metrics from a Pulse Metric Definition using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a specific Pulse Metric Definition on the current site.\n\n**Parameters:**\n- \\`pulseMetricDefinitionID\\` (required): The ID of the Pulse Metric Definition to list metrics for. It should be the ID of the Pulse Metric Definition, not the name. Example: BBC908D8-29ED-48AB-A78E-ACF8A424C8C3\n\n**Example Usage:**\n- List all Pulse Metrics for this Pulse Metric Definition\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric Definition ID',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ pulseMetricDefinitionID }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricDefinitionIdTool.logAndExecute({\n requestId,\n args: { pulseMetricDefinitionID },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricDefinitionId(\n pulseMetricDefinitionID,\n );\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricDefinitionIdTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricIds: z.array(z.string().length(36)),\n};\n\nexport const getListPulseMetricsFromMetricIdsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricIdsTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-ids',\n description: `\nRetrieves a list of published Pulse Metrics from a list of metric IDs using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a list of metric IDs on the current site.\n\n**Parameters:**\n- \\`metricIds\\` (required): The list of Pulse Metric IDs to list metrics for. It should be the list of metric IDs, not the names or metric definition ids. Example: ['CF32DDCC-362B-4869-9487-37DA4D152552', 'CF32DDCC-362B-4869-9487-37DA4D152553']\n - For data in a Pulse Metric Subscription, use the metric_id field.\n\n**Example Usage:**\n- List all Pulse Metrics from a list of Pulse Metric IDs\n\n**Note:**\n- This tool is recommended for use with data in Pulse Metric Subscriptions.\n- 00000000-0000-0000-0000-000000000000 is not a valid datasource id.\n- If you need a valid datasource id, you may need to retrieve the Pulse Metric Definition for the Pulse Metric which should have a valid datasource information.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ metricIds }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricIdsTool.logAndExecute({\n requestId,\n args: { metricIds },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricIds(metricIds);\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {};\n\nexport const getListPulseMetricSubscriptionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricSubscriptionsTool = new Tool({\n server,\n name: 'list-pulse-metric-subscriptions',\n description: `\nRetrieves a list of published Pulse Metric Subscriptions for the current user using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metric Subscriptions for the current user.\n\n**Example Usage:** \n- List all Pulse Metric Subscriptions for the current user on the current site\n- List all of my Pulse Metric Subscriptions\n\n**Note:**\n- This tool does not directly provide information about Pulse Metric Definitions. If you need to know information about Pulse Metric Defintiions associated with your subscriptions you need to:\n 1. Retrieve Pulse Metrics from the metric ids returned in the Pulse Metric Subscriptions.\n 2. Retrieve Pulse Metric Definitions from the metric definition id returned in the Pulse Metrics.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Subscriptions for Current User',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (_, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricSubscriptionsTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:metric_subscriptions:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricSubscriptionsForCurrentUser();\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricSubscriptionsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Err } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n Datasource,\n Query,\n QueryOutput,\n TableauError,\n} from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { Server } from '../../server.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { Tool } from '../tool.js';\nimport { getDatasourceCredentials } from './datasourceCredentials.js';\nimport { handleQueryDatasourceError } from './queryDatasourceErrorHandler.js';\nimport { validateQuery } from './queryDatasourceValidator.js';\nimport { queryDatasourceToolDescription } from './queryDescription.js';\nimport { validateFilterValues } from './validators/validateFilterValues.js';\n\ntype Datasource = z.infer<typeof Datasource>;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n query: Query,\n};\n\nexport type QueryDatasourceError =\n | {\n type: 'feature-disabled';\n }\n | {\n type: 'filter-validation';\n message: string;\n }\n | {\n type: 'tableau-error';\n error: z.infer<typeof TableauError>;\n };\n\nexport const getQueryDatasourceTool = (server: Server): Tool<typeof paramsSchema> => {\n const queryDatasourceTool = new Tool({\n server,\n name: 'query-datasource',\n description: queryDatasourceToolDescription,\n paramsSchema,\n annotations: {\n title: 'Query Datasource',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateQuery,\n callback: async ({ datasourceLuid, query }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await queryDatasourceTool.logAndExecute<QueryOutput, QueryDatasourceError>({\n requestId,\n args: { datasourceLuid, query },\n callback: async () => {\n const datasource: Datasource = { datasourceLuid };\n const options = {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n } as const;\n\n const credentials = getDatasourceCredentials(datasourceLuid);\n if (credentials) {\n datasource.connections = credentials;\n }\n\n const queryRequest = {\n datasource,\n query,\n options,\n };\n\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:viz_data_service:read'],\n callback: async (restApi) => {\n if (!config.disableQueryDatasourceFilterValidation) {\n // Validate filters values for SET and MATCH filters\n const filterValidationResult = await validateFilterValues(\n server,\n query,\n restApi.vizqlDataServiceMethods,\n datasource,\n );\n\n if (filterValidationResult.isErr()) {\n const errors = filterValidationResult.error;\n const errorMessage = errors.map((error) => error.message).join('\\n\\n');\n return new Err({\n type: 'filter-validation',\n message: errorMessage,\n });\n }\n }\n\n const result = await restApi.vizqlDataServiceMethods.queryDatasource(queryRequest);\n if (result.isErr()) {\n return new Err(\n result.error instanceof ZodiosError\n ? result.error\n : result.error === 'feature-disabled'\n ? { type: 'feature-disabled' }\n : {\n type: 'tableau-error',\n error: result.error,\n },\n );\n }\n return result;\n },\n });\n },\n getErrorText: (error: QueryDatasourceError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n case 'filter-validation':\n return JSON.stringify({\n requestId,\n errorType: 'validation',\n message: error.message,\n });\n case 'tableau-error':\n return JSON.stringify({\n requestId,\n ...handleQueryDatasourceError(error.error),\n });\n }\n },\n });\n },\n });\n\n return queryDatasourceTool;\n};\n", "import { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\n\nconst schema = z.record(\n z.string().nonempty(),\n z.array(\n z\n .object({ luid: z.string().optional(), u: z.string().nonempty(), p: z.string().nonempty() })\n .transform(({ luid, u, p }) => ({\n connectionLuid: luid,\n connectionUsername: u,\n connectionPassword: p,\n })),\n ),\n);\n\ntype Connection = {\n connectionLuid: string | undefined;\n connectionUsername: string;\n connectionPassword: string;\n};\n\nlet credentialMap: Map<string, Array<Connection>> | undefined;\nlet initialized = false;\n\nexport const getDatasourceCredentials = (datasourceLuid: string): Array<Connection> | undefined => {\n if (!initialized) {\n initialized = true;\n\n const { datasourceCredentials } = getConfig();\n if (!datasourceCredentials) {\n return;\n }\n\n let obj: any;\n try {\n obj = JSON.parse(datasourceCredentials);\n } catch (e) {\n throw new Error(\n `Invalid datasource credentials format. Could not parse JSON string: ${datasourceCredentials}`,\n { cause: e },\n );\n }\n\n const parsed = schema.parse(obj);\n credentialMap = new Map(Object.entries(parsed));\n }\n\n return credentialMap?.get(datasourceLuid);\n};\n\nexport const exportedForTesting = {\n resetDatasourceCredentials: () => {\n initialized = false;\n credentialMap = undefined;\n },\n};\n", "/* v8 ignore start -- Exhaustive tests have limited value for this file */\n\nimport { TableauError } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\ntype TableauErrorDetail = TableauError & Partial<{ condition: string; details: string }>;\n\n/**\n * Adds additional context to the VizQl Data Service errors.\n *\n * @param {TableauError} error - The error object\n * @returns {*} {TableauErrorDetail} - The error object with additional context\n * @see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_error_codes.html\n */\nexport function handleQueryDatasourceError(error: TableauError): TableauErrorDetail {\n const errorDetail: TableauErrorDetail = {\n ...error,\n };\n\n switch (error.errorCode) {\n case '400000':\n errorDetail.condition = 'Bad request';\n errorDetail.details =\n 'The content of the request body is invalid. Check for missing or incomplete JSON.';\n break;\n case '400800':\n errorDetail.condition = 'Invalid formula for calculation';\n errorDetail.details =\n 'Invalid custom calculation syntax. For help, see https://help.tableau.com/current/pro/desktop/en-us/functions_operators.htm';\n break;\n case '400802':\n errorDetail.condition = 'Invalid API request';\n errorDetail.details = \"The incoming request isn't valid per the OpenAPI specification.\";\n break;\n case '400803':\n errorDetail.condition = 'Validation failed';\n errorDetail.details = \"The incoming request isn't valid per the validation rules.\";\n break;\n case '400804':\n errorDetail.condition = 'Response too large';\n errorDetail.details =\n 'The response value exceeds the limit. You must apply a filter in your request.';\n break;\n case '401001':\n errorDetail.condition = 'Login error';\n errorDetail.details = 'The login failed for the given user.';\n break;\n case '401002':\n errorDetail.condition = 'Invalid authorization credentials';\n errorDetail.details = 'The provided auth token is formatted incorrectly.';\n break;\n case '403157':\n errorDetail.condition = 'Feature disabled';\n errorDetail.details = 'The feature is disabled.';\n break;\n case '403800':\n errorDetail.condition = 'API access permission denied';\n errorDetail.details =\n \"The user doesn't have API Access granted on the given data source. Set the API Access capability for the given data source to Allowed. For help, see https://help.tableau.com/current/online/en-us/permissions_capabilities.htm\";\n break;\n case '404934':\n errorDetail.condition = 'Unknown field';\n errorDetail.details = \"The requested field doesn't exist.\";\n break;\n case '404950':\n errorDetail.condition = 'API endpoint not found';\n errorDetail.details = \"The request endpoint doesn't exist.\";\n break;\n case '408000':\n errorDetail.condition = 'Request timeout';\n errorDetail.details = 'The request timed out.';\n break;\n case '409000':\n errorDetail.condition = 'User already on site';\n errorDetail.details = 'HTTP status conflict.';\n break;\n case '429000':\n errorDetail.condition = 'Too many requests';\n errorDetail.details =\n 'Too many requests in the allotted amount of time. For help, see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_limitations.html#licensing-and-data-transfer';\n break;\n case '500000':\n errorDetail.condition = 'Internal server error';\n errorDetail.details = 'The request could not be completed.';\n break;\n case '500810':\n errorDetail.condition = 'VDS empty table response';\n errorDetail.details = 'The underlying data engine returned empty data value response.';\n break;\n case '500811':\n errorDetail.condition = 'VDS missing table';\n errorDetail.details =\n 'The underlying data engine returned empty metadata associated with response.';\n break;\n case '500812':\n errorDetail.condition = 'Error while processing an error';\n errorDetail.details = 'Internal processing error.';\n break;\n case '501000':\n errorDetail.condition = 'Not implemented';\n errorDetail.details = \"Can't find response from upstream server.\";\n break;\n case '503800':\n errorDetail.condition = 'VDS unavailable';\n errorDetail.details = 'The underlying data engine is unavailable.';\n break;\n case '503801':\n errorDetail.condition = 'VDS discovery error';\n errorDetail.details = \"The upstream service can't be found.\";\n break;\n case '504000':\n errorDetail.condition = 'Gateway timeout';\n errorDetail.details = 'The upstream service response timed out.';\n break;\n }\n\n return errorDetail;\n}\n/* v8 ignore stop */\n", "import { FilterField, Query } from '../queryDatasourceValidator.js';\n\ntype Fields = Query['fields'];\ntype Field = Fields[number];\n\nexport function validateFields(fields: Fields): void {\n {\n // You must query at least one field.\n if (fields.length === 0) {\n throw new Error(\n 'The query must include at least one field. The fields property cannot be an empty array.',\n );\n }\n }\n\n {\n // Field caption must be a non-empty string.\n if (fields.some(hasEmptyFieldCaption)) {\n throw new Error(`The query must not include any fields with an empty fieldCaption.`);\n }\n }\n\n {\n // You can't query the same field twice.\n const fieldCounts = fields.reduce<Record<string, number>>((acc, field) => {\n if (!acc[field.fieldCaption]) {\n acc[field.fieldCaption] = 0;\n }\n\n acc[field.fieldCaption]++;\n return acc;\n }, {});\n\n const duplicateFields = Object.entries(fieldCounts).filter(([_, count]) => count > 1);\n if (duplicateFields.length > 0) {\n throw new Error(\n `The query must not include duplicate fields. The following fields are duplicated: ${duplicateFields.map(([field]) => field).join(', ')}.`,\n );\n }\n }\n\n {\n // You can't have duplicate sort priorities.\n const sortPriorities = fields.reduce<Record<number, Array<string>>>((acc, field) => {\n if (field.sortPriority === undefined) {\n return acc;\n }\n\n if (!acc[field.sortPriority]) {\n acc[field.sortPriority] = [];\n }\n\n acc[field.sortPriority].push(field.fieldCaption);\n return acc;\n }, {});\n\n const duplicateSortPriorities = Object.entries(sortPriorities).filter(\n ([_, fields]) => fields.length > 1,\n );\n\n if (duplicateSortPriorities.length > 0) {\n const duplicateSortPrioritiesArr = duplicateSortPriorities.reduce<Array<string>>(\n (acc, [priority, fields]) => {\n acc.push(\n `${fields.map((field) => `\"${field}\"`).join(', ')} with a sort priority of ${priority}`,\n );\n return acc;\n },\n [],\n );\n\n throw new Error(\n `The query must not include duplicate sort priorities. The following fields have sort priorities that are duplicated: ${duplicateSortPrioritiesArr.join('. ')}.`,\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n const fieldsWithBothFunctionAndCalculation = fields\n .filter(hasFunctionAndCalculation)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithBothFunctionAndCalculation.length > 0) {\n throw new Error(\n `The query must not include fields that contain both a function and a calculation. The following fields contain both a function and a calculation: ${fieldsWithBothFunctionAndCalculation.join(', ')}.`,\n );\n }\n }\n\n {\n // The maxDecimalPlaces value must be greater or equal to 0.\n const fieldsWithNegativeMaxDecimalPlace = fields\n .filter(hasNegativeMaxDecimalPlace)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithNegativeMaxDecimalPlace.length > 0) {\n throw new Error(\n `The query must not include fields that have a maxDecimalPlaces value that is less than 0. The following fields have a maxDecimalPlaces value that is less than 0: ${fieldsWithNegativeMaxDecimalPlace.join(', ')}.`,\n );\n }\n }\n}\n\nfunction hasEmptyFieldCaption(field: Field): boolean {\n return !field.fieldCaption;\n}\n\nexport function hasFunctionAndCalculation(field: Field | FilterField): boolean {\n return !!('function' in field && field.function && 'calculation' in field && field.calculation);\n}\n\nexport function hasFieldCaptionAndCalculation(field: Field | FilterField): boolean {\n return !!(\n 'fieldCaption' in field &&\n field.fieldCaption &&\n 'calculation' in field &&\n field.calculation\n );\n}\n\nfunction hasNegativeMaxDecimalPlace(field: Field): boolean {\n return field.maxDecimalPlaces !== undefined && field.maxDecimalPlaces < 0;\n}\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport { FilterField, Query } from '../queryDatasourceValidator.js';\nimport { hasFieldCaptionAndCalculation, hasFunctionAndCalculation } from './validateFields.js';\n\nexport function validateFilters(filters: Query['filters']): void {\n if (!filters) {\n return;\n }\n\n if (filters.some((filter) => !('field' in filter))) {\n throw new Error(\n `The query must not include filters with invalid fields. The following field errors occurred: The filter must include a field property.`,\n );\n }\n\n {\n // You can't have multiple filters for a single field.\n const fieldCounts = filters.reduce<Record<string, number>>((acc, filter) => {\n if (!('fieldCaption' in filter.field)) {\n return acc;\n }\n\n if (!acc[filter.field.fieldCaption]) {\n acc[filter.field.fieldCaption] = 0;\n }\n\n acc[filter.field.fieldCaption]++;\n return acc;\n }, {});\n\n const fieldsWithMultipleFilters = Object.entries(fieldCounts).filter(([_, count]) => count > 1);\n\n if (fieldsWithMultipleFilters.length > 0) {\n throw new Error(\n `The query must not include multiple filters for the following fields: ${fieldsWithMultipleFilters.map(([field]) => field).join(', ')}.`,\n );\n }\n }\n\n {\n // Fields must be valid.\n const filtersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (!('field' in filter)) {\n return acc;\n }\n\n const result = validateFilterField(filter.field);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (filtersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include filters with invalid fields. The following field errors occurred: ${filtersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n\n {\n // Set, Match, and Relative Date filters can't have functions or calculations.\n const setFiltersWithFunctionsOrCalculations = filters.filter((filter) => {\n return (\n ['SET', 'MATCH', 'DATE'].includes(filter.filterType) &&\n (('function' in filter.field && filter.field.function) ||\n ('calculation' in filter.field && filter.field.calculation))\n );\n });\n\n if (setFiltersWithFunctionsOrCalculations.length > 0) {\n throw new Error(\n `The query must not include Set Filters, Match Filters, or Relative Date Filters with functions or calculations.`,\n );\n }\n }\n\n {\n // Set filters\n {\n // Values array can't be empty.\n const setFiltersWithEmptyValues = filters.filter((filter) => {\n return filter.filterType === 'SET' && filter.values.length === 0;\n });\n\n if (setFiltersWithEmptyValues.length > 0) {\n throw new Error(`The query must not include Set Filters with an empty values array.`);\n }\n }\n }\n\n {\n // Quantitative filters\n {\n // Dates must be valid RFC 3339.\n const quantitativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n if (filter.filterType !== 'QUANTITATIVE_DATE') {\n return false;\n }\n\n switch (filter.quantitativeFilterType) {\n case 'RANGE':\n return isNaN(Date.parse(filter.minDate)) || isNaN(Date.parse(filter.maxDate));\n case 'MIN':\n return isNaN(Date.parse(filter.minDate));\n case 'MAX':\n return isNaN(Date.parse(filter.maxDate));\n }\n });\n\n if (quantitativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n `The query must not include Quantitative Date Filters with invalid dates. Dates must use the RFC 3339 standard. Example: 2025-03-14`,\n );\n }\n }\n }\n\n {\n // Relative Date Filters\n {\n // Dates must be valid RFC 3339.\n const relativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n return (\n filter.filterType === 'DATE' && filter.anchorDate && isNaN(Date.parse(filter.anchorDate))\n );\n });\n\n if (relativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n `The query must not include Relative Date Filters with invalid anchor dates. Anchor dates must use the RFC 3339 standard. Example: 2025-03-14`,\n );\n }\n }\n }\n\n {\n // Top N Filters\n {\n // Field to measure must be valid.\n const topNFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'TOP') {\n return acc;\n }\n\n const result = validateFilterField(filter.fieldToMeasure);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (topNFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Top N filters with invalid fields. The following field errors occurred: ${topNFiltersWithInvalidFields.join(', ')}`,\n );\n }\n }\n }\n\n {\n // Match Filters\n {\n // You must have at least one of startsWith, endsWith, or contains.\n const matchFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'MATCH') {\n return acc;\n }\n\n if (!filter.startsWith && !filter.endsWith && !filter.contains) {\n acc.push(\n `The match filter for field \"${filter.field.fieldCaption}\" must include at least one of the following properties: startsWith, endsWith, or contains`,\n );\n }\n\n return acc;\n }, []);\n\n if (matchFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Match Filters with invalid fields. The following field errors occurred: ${matchFiltersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n }\n}\n\nfunction validateFilterField(field: FilterField): Result<void, string> {\n {\n // Field caption must be a non-empty string.\n if (hasEmptyFieldCaption(field)) {\n return new Err(`The fieldCaption property must be a non-empty string.`);\n }\n }\n\n {\n // Field cannot have a fieldCaption and a Calculation.\n if (hasFieldCaptionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a fieldCaption and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n if (hasFunctionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a function and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n return Ok.EMPTY;\n}\n\nfunction hasEmptyFieldCaption(field: FilterField): boolean {\n return 'fieldCaption' in field && !field.fieldCaption;\n}\n", "import { z } from 'zod';\n\nimport { FilterField, Query } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport { validateFields } from './validators/validateFields.js';\nimport { validateFilters } from './validators/validateFilters.js';\n\nexport type Query = z.infer<typeof Query>;\nexport type FilterField = z.infer<typeof FilterField>;\n\nexport function validateQuery({\n datasourceLuid,\n query,\n}: {\n datasourceLuid: string;\n query: Query;\n}): void {\n validateDatasourceLuid({ datasourceLuid });\n\n const { fields, filters } = query;\n validateFields(fields);\n validateFilters(filters);\n\n const result = Query.safeParse(query);\n if (!result.success) {\n throw new Error(`The query does not match the expected schema.`);\n }\n}\n", "export const queryDatasourceToolDescription = `# Query Tableau Data Source Tool\n\nExecutes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.\n\n## Prerequisites\nBefore using this tool, you should:\n1. Understand available fields and their types\n3. Understand the data structure and field relationships\n\n## Best Practices\n\n### Data Volume Management\n- **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size\n- **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale:\n \\`\\`\\`json\n {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n }\n \\`\\`\\`\n- **Use TOP filters for rankings** - When users ask for \"top N\" results, use TOP filter type to limit results at the database level\n- **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing\n- **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear\n\n### Field Usage Guidelines\n- **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations\n- **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations\n- **Validate field availability** - Always check field metadata before constructing queries\n\n### Query Construction\n- **Group by meaningful dimensions** - Ensure grouping supports the business question being asked\n- **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way\n- **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants)\n- **Leverage filter capabilities** - Use the extensive filter options to narrow results\n\n## Data Profiling Strategy\n\nWhen a query might return large amounts of data, follow this profiling approach:\n\n**Step 1: Count total records**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Primary_Key_Field\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 2: Count by key dimensions**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Category\",\n \"fieldAlias\": \"Category\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Record Count\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 3: Apply appropriate aggregation or filtering based on counts**\n\n## Filter Types and Usage\n\n### SET Filters\nFilter by specific values:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Region\"},\n \"filterType\": \"SET\",\n \"values\": [\"North\", \"South\", \"East\"],\n \"exclude\": false\n}\n\\`\\`\\`\n\n### TOP Filters \nGet top/bottom N records by a measure:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n}\n\\`\\`\\`\n\n### QUANTITATIVE Filters\nFilter numeric ranges:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"RANGE\",\n \"min\": 1000,\n \"max\": 50000,\n \"includeNulls\": false\n}\n\\`\\`\\`\n\n### DATE Filters\nFilter relative date periods:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"MONTHS\",\n \"dateRangeType\": \"LAST\"\n}\n\\`\\`\\`\n\n## Example Queries\n\n### Example 1: Data Profiling Before Large Query\n**Question:** \"Show me all customer orders this year\"\n\n**Step 1 - Profile the data volume:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Orders This Year\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n**If count is manageable (< 10,000), proceed with detail query. If large, suggest aggregation:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 2: Top Customers Query (Using TOP Filter)\n**Question:** \"Who are our top 10 customers by revenue?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Revenue\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 3: Time Series with Aggregation\n**Question:** \"What are our monthly sales trends?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"fieldAlias\": \"Month\",\n \"sortDirection\": \"ASC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 4: Filtered Category Analysis\n**Question:** \"What's the performance by product category for high-value orders?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Category\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"AVG\",\n \"fieldAlias\": \"Average Order Value\",\n \"maxDecimalPlaces\": 2\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"MIN\",\n \"min\": 500\n }\n ]\n }\n}\n\\`\\`\\`\n\n## Error Prevention and Data Management\n\n**When to profile data first:**\n- User asks for \"all records\" or similar broad requests\n- Query involves high-cardinality fields without filters\n- Request could potentially return row-level data for large tables\n\n**Suggest aggregation when:**\n- Profile queries return very high counts (> 10,000 records)\n- User asks questions that can be answered with summaries\n- Performance or response size might be an issue\n\n**Don't call this tool if:**\n- The requested fields are not available in the data source\n- The question requires data not present in the current data source\n- Field validation shows incompatible field types for the requested operation\n\n**Instead:**\n- Use metadata tools to understand available fields\n- Suggest alternative questions that can be answered with available data\n- Recommend appropriate aggregation levels for the business question`;\n", "import levenshtein from 'fast-levenshtein';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { log } from '../../../logging/log.js';\nimport {\n Datasource,\n MatchFilter,\n Query as QueryType,\n QueryRequest,\n SetFilter,\n} from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport VizqlDataServiceMethods from '../../../sdks/tableau/methods/vizqlDataServiceMethods.js';\nimport { Server } from '../../../server.js';\nimport { Query } from '../queryDatasourceValidator.js';\n\ntype MatchFilter = z.infer<typeof MatchFilter>;\ntype SetFilter = z.infer<typeof SetFilter>;\n\ninterface FilterValidationError {\n field: string;\n invalidValues: string[];\n sampleValues: string[];\n message: string;\n}\n\n/**\n * Validates SET and MATCH filter values by querying the VDS to check if they exist in the target field.\n * Returns fuzzy matched sample values from the field if validation fails.\n */\nexport async function validateFilterValues(\n server: Server,\n query: Query,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError[]>> {\n if (!query.filters) {\n return Ok.EMPTY;\n }\n\n const validationErrors: FilterValidationError[] = [];\n\n // Filter for SET and MATCH filters that need validation\n const filtersToValidate = query.filters.filter(\n (filter) =>\n (filter.filterType === 'SET' || filter.filterType === 'MATCH') &&\n 'fieldCaption' in filter.field &&\n filter.field.fieldCaption,\n ) as Array<MatchFilter | SetFilter>;\n\n if (filtersToValidate.length === 0) {\n return Ok.EMPTY;\n }\n\n // Validate each filter\n for (const filter of filtersToValidate) {\n const fieldCaption = filter.field.fieldCaption;\n\n try {\n if (filter.filterType === 'SET') {\n const result = await validateSetFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n } else if (filter.filterType === 'MATCH') {\n const result = await validateMatchFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n }\n } catch (error) {\n log.warning(server, `Filter value validation failed for field ${fieldCaption}: ${error}`);\n }\n }\n\n if (validationErrors.length > 0) {\n return new Err(validationErrors);\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a SET filter by checking if all values exist in the target field\n */\nasync function validateSetFilter(\n filter: SetFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n const filterValues = filter.values.map((v) => String(v));\n\n // Query to get distinct values from the field\n const distinctValuesQuery: z.infer<typeof QueryType> = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'DistinctValues',\n },\n ],\n };\n\n const queryRequest: z.infer<typeof QueryRequest> = {\n datasource,\n query: distinctValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const existingValues = new Set(\n (data as Record<string, unknown>[]).map((row) =>\n String(row.DistinctValues || row[fieldCaption] || ''),\n ),\n );\n\n // Check which filter values don't exist in the field\n const invalidValues = filterValues.filter((value) => !existingValues.has(value));\n\n if (invalidValues.length > 0) {\n // Use fuzzy matching to find similar values\n const suggestedValues = getFuzzyMatches(\n invalidValues,\n Array.from(existingValues),\n 3, // max edit distance\n 5, // max suggestions\n );\n\n let message = `Filter validation failed for field \"${fieldCaption}\". The following values were not found: ${invalidValues.join(', ')}.`;\n if (suggestedValues.length > 0) {\n message += ` Did you mean: ${suggestedValues.join(', ')}?`;\n }\n message +=\n ' Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.';\n\n return new Err({\n field: fieldCaption,\n invalidValues,\n sampleValues: suggestedValues,\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a MATCH filter by checking if the pattern matches any values in the target field\n */\nasync function validateMatchFilter(\n filter: MatchFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n\n // Query to get a sample of values from the field\n const sampleValuesQuery: z.infer<typeof QueryType> = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'SampleValues',\n },\n ],\n };\n\n const queryRequest: z.infer<typeof QueryRequest> = {\n datasource,\n query: sampleValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const fieldValues = (data as Record<string, unknown>[]).map((row: any) =>\n String(row.SampleValues || row[fieldCaption] || ''),\n );\n\n // Check if any values match the pattern\n const hasMatch = fieldValues.some((value) => {\n if (filter.startsWith && !value.startsWith(filter.startsWith)) return false;\n if (filter.endsWith && !value.endsWith(filter.endsWith)) return false;\n if (filter.contains && !value.includes(filter.contains)) return false;\n return true;\n });\n\n if (!hasMatch) {\n const similarValues = new Set<string>();\n\n // Find up to 5 similar values to avoid processing all field values\n for (const value of fieldValues) {\n if (similarValues.size >= 5) break;\n\n const lowerValue = value.toLowerCase();\n\n const fuzzyStartMatch = filter.startsWith\n ? (() => {\n const pattern = filter.startsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const startSlice = lowerValue.slice(0, len);\n return levenshtein.get(pattern, startSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyEndMatch = filter.endsWith\n ? (() => {\n const pattern = filter.endsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const endSlice = lowerValue.slice(-len);\n return levenshtein.get(pattern, endSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyContainsMatch = filter.contains\n ? (() => {\n const pattern = filter.contains!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n if (lowerValue.length >= len) {\n return Array.from({ length: lowerValue.length - len + 1 }, (_, i) =>\n levenshtein.get(pattern, lowerValue.slice(i, i + len)),\n ).some((dist) => dist <= dynamicDistance);\n } else {\n return levenshtein.get(pattern, lowerValue) <= dynamicDistance;\n }\n })()\n : true;\n\n if (fuzzyStartMatch && fuzzyEndMatch && fuzzyContainsMatch) {\n similarValues.add(value);\n }\n }\n\n const patternDescriptions: Array<string> = [];\n if (filter.startsWith) patternDescriptions.push(`starts with \"${filter.startsWith}\"`);\n if (filter.endsWith) patternDescriptions.push(`ends with \"${filter.endsWith}\"`);\n if (filter.contains) patternDescriptions.push(`contains \"${filter.contains}\"`);\n const similarValuesString =\n similarValues.size > 0\n ? `Similar values in this field: ${Array.from(similarValues).join(', ')}.`\n : '';\n\n const message =\n `Filter validation failed for field \"${fieldCaption}\". ` +\n `No values found that ${patternDescriptions.join(' and ')}. ` +\n `${similarValuesString} ` +\n `Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.`;\n\n return new Err({\n field: fieldCaption,\n invalidValues: patternDescriptions,\n sampleValues: Array.from(similarValues),\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Finds the closest matches to invalid filter values using fuzzy matching\n */\nexport function getFuzzyMatches(\n invalidValues: string[],\n existingValues: string[],\n maxDistance: number = 3,\n maxSuggestions: number = 5,\n): string[] {\n const suggestions: Array<{\n invalidValue: string;\n suggestionForInvalidValue: string;\n distance: number;\n }> = [];\n\n for (const existingValue of existingValues) {\n const matches = invalidValues\n .map((invalidValue) => ({\n value: invalidValue,\n distance: levenshtein.get(invalidValue.toLowerCase(), existingValue.toLowerCase()),\n }))\n .filter((match) => match.distance <= maxDistance)\n .sort((a, b) => a.distance - b.distance);\n if (matches.length > 0) {\n const bestMatch = matches[0];\n suggestions.push({\n invalidValue: bestMatch.value,\n suggestionForInvalidValue: existingValue,\n distance: bestMatch.distance,\n });\n }\n }\n\n // now that we have all the suggestions, sort them by distance.\n suggestions.sort((a, b) => a.distance - b.distance);\n\n // pick the best suggestions, but prevent having too many suggestions for the same invalid value.\n const toReturn: Array<string> = [];\n const suggestionLimitPerInvalidValue = Math.ceil(maxSuggestions / invalidValues.length);\n // create and initialize a suggestion counter for each invalid value.\n const invalidValueSuggestionCounter: Map<string, number> = new Map();\n for (const invalidValue of invalidValues) {\n invalidValueSuggestionCounter.set(invalidValue, 0);\n }\n\n for (const { invalidValue, suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n }\n\n if (invalidValueSuggestionCounter.get(invalidValue) === suggestionLimitPerInvalidValue) {\n continue;\n }\n\n toReturn.push(suggestionForInvalidValue);\n invalidValueSuggestionCounter.set(\n invalidValue,\n invalidValueSuggestionCounter.get(invalidValue)! + 1,\n );\n }\n\n // If we don't have enough suggestions, include more suggestions (ignoring the suggestion limit per invalid value).\n for (const { suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n } else if (toReturn.includes(suggestionForInvalidValue)) {\n continue;\n }\n toReturn.push(suggestionForInvalidValue);\n }\n\n return toReturn;\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n};\n\nexport const getGetViewDataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewDataTool = new Tool({\n server,\n name: 'get-view-data',\n description: `Retrieves data in comma separated value (CSV) format for the specified view in a Tableau workbook.`,\n paramsSchema,\n annotations: {\n title: 'Get View Data',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ viewId }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewDataTool.logAndExecute({\n requestId,\n args: { viewId },\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewData({\n viewId,\n siteId: restApi.siteId,\n });\n },\n }),\n );\n },\n });\n },\n });\n\n return getViewDataTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { convertPngDataToToolResult } from '../convertPngDataToToolResult.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n width: z.number().gt(0).optional(),\n height: z.number().gt(0).optional(),\n};\n\nexport const getGetViewImageTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewImageTool = new Tool({\n server,\n name: 'get-view-image',\n description: `Retrieves an image of the specified view in a Tableau workbook. The width and height in pixels can be provided. The default width and height are both 800 pixels.`,\n paramsSchema,\n annotations: {\n title: 'Get View Image',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ viewId, width, height }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewImageTool.logAndExecute({\n requestId,\n args: { viewId },\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewImage({\n viewId,\n siteId: restApi.siteId,\n width,\n height,\n resolution: 'high',\n });\n },\n }),\n );\n },\n getSuccessResult: convertPngDataToToolResult,\n });\n },\n });\n\n return getViewImageTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport function convertPngDataToToolResult(pngData: string): CallToolResult {\n const base64Data = Buffer.from(pngData).toString('base64');\n\n return {\n isError: false,\n content: [\n {\n type: 'image',\n data: base64Data,\n mimeType: 'image/png',\n },\n ],\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { Tool } from '../tool.js';\nimport { parseAndValidateViewsFilterString } from './viewsFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListViewsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listViewsTool = new Tool({\n server,\n name: 'list-views',\n description: `\n Retrieves a list of views on a Tableau site including their metadata such as name, owner, and the workbook they are found in. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Overview) for precise and flexible view discovery. Use this tool when a user requests to list, search, or filter Tableau views on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |---------------------|----------------------|\n | caption | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | fields | eq, in |\n | hitsTotal | eq, gt, gte, lt, lte |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetNumber | eq, gt, gte, lt, lte |\n | sheetType | eq, in |\n | tags | eq, in |\n | title | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n | viewUrlname | eq, in |\n | workbookDescription | eq, in |\n | workbookName | eq, in |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all views on a site\n - List views with the name \"Overview\":\n filter: \"name:eq:Overview\"\n - List views in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List views created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List views with the name \"Overview\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Views',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ filter, pageSize, limit }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateViewsFilterString(filter) : undefined;\n\n return await listViewsTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbooks = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, views: data } =\n await restApi.viewsMethods.queryViewsForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n includeUsageStatistics: true,\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return workbooks;\n },\n }),\n );\n },\n });\n },\n });\n\n return listViewsTool;\n};\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'caption',\n 'contentUrl',\n 'createdAt',\n 'favoritesTotal',\n 'fields',\n 'hitsTotal',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetNumber',\n 'sheetType',\n 'tags',\n 'title',\n 'updatedAt',\n 'viewUrlname',\n 'workbookDescription',\n 'workbookName',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n caption: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n fields: ['eq', 'in'],\n hitsTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetNumber: ['eq', 'gt', 'gte', 'lt', 'lte'],\n sheetType: ['eq', 'in'],\n tags: ['eq', 'in'],\n title: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n viewUrlname: ['eq', 'in'],\n workbookDescription: ['eq', 'in'],\n workbookName: ['eq', 'in'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateViewsFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n workbookId: z.string(),\n};\n\nexport const getGetWorkbookTool = (server: Server): Tool<typeof paramsSchema> => {\n const getWorkbookTool = new Tool({\n server,\n name: 'get-workbook',\n description: `Retrieves information about the specified workbook, including information about the views contained in the workbook.`,\n paramsSchema,\n annotations: {\n title: 'Get Workbook',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ workbookId }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getWorkbookTool.logAndExecute({\n requestId,\n args: { workbookId },\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbook = await restApi.workbooksMethods.getWorkbook({\n workbookId,\n siteId: restApi.siteId,\n });\n\n // The views returned by the getWorkbook API do not include usage statistics.\n // Query the views for the workbook to get each view's usage statistics.\n if (workbook.views) {\n const views = await restApi.viewsMethods.queryViewsForWorkbook({\n workbookId,\n siteId: restApi.siteId,\n includeUsageStatistics: true,\n });\n\n workbook.views.view = views;\n }\n\n return workbook;\n },\n }),\n );\n },\n });\n },\n });\n\n return getWorkbookTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { Tool } from '../tool.js';\nimport { parseAndValidateWorkbooksFilterString } from './workbooksFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListWorkbooksTool = (server: Server): Tool<typeof paramsSchema> => {\n const listWorkbooksTool = new Tool({\n server,\n name: 'list-workbooks',\n description: `\n Retrieves a list of workbooks on a Tableau site including their metadata such as name, description, and information about the views contained in the workbook. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Superstore) for precise and flexible workbook discovery. Use this tool when a user requests to list, search, or filter Tableau workbooks on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |-------------------|----------------------|\n | createdAt | eq, gt, gte, lt, lte |\n | contentUrl | eq, in |\n | displayTabs | eq |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlerts | eq |\n | hasExtracts | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetCount | eq, gt, gte, lt, lte |\n | size | eq, gt, gte, lt, lte |\n | subscriptionTotal | eq, gt, gte, lt, lte |\n | tags | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all workbooks on a site\n - List workbooks with the name \"Superstore\":\n filter: \"name:eq:Superstore\"\n - List workbooks in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List workbooks created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List workbooks with the name \"Superstore\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Workbooks',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ filter, pageSize, limit }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateWorkbooksFilterString(filter) : undefined;\n\n return await listWorkbooksTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbooks = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, workbooks: data } =\n await restApi.workbooksMethods.queryWorkbooksForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return workbooks;\n },\n }),\n );\n },\n });\n },\n });\n\n return listWorkbooksTool;\n};\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'createdAt',\n 'contentUrl',\n 'displayTabs',\n 'favoritesTotal',\n 'hasAlerts',\n 'hasExtracts',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetCount',\n 'size',\n 'subscriptionTotal',\n 'tags',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n contentUrl: ['eq', 'in'],\n displayTabs: ['eq'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlerts: ['eq'],\n hasExtracts: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetCount: ['eq', 'gt', 'gte', 'lt', 'lte'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n subscriptionTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tags: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateWorkbooksFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { getSearchContentTool } from './contentExploration/searchContent.js';\nimport { getGetDatasourceMetadataTool } from './getDatasourceMetadata/getDatasourceMetadata.js';\nimport { getListDatasourcesTool } from './listDatasources/listDatasources.js';\nimport { getGeneratePulseMetricValueInsightBundleTool } from './pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.js';\nimport { getListAllPulseMetricDefinitionsTool } from './pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.js';\nimport { getListPulseMetricDefinitionsFromDefinitionIdsTool } from './pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.js';\nimport { getListPulseMetricsFromMetricDefinitionIdTool } from './pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.js';\nimport { getListPulseMetricsFromMetricIdsTool } from './pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.js';\nimport { getListPulseMetricSubscriptionsTool } from './pulse/listMetricSubscriptions/listPulseMetricSubscriptions.js';\nimport { getQueryDatasourceTool } from './queryDatasource/queryDatasource.js';\nimport { getGetViewDataTool } from './views/getViewData.js';\nimport { getGetViewImageTool } from './views/getViewImage.js';\nimport { getListViewsTool } from './views/listViews.js';\nimport { getGetWorkbookTool } from './workbooks/getWorkbook.js';\nimport { getListWorkbooksTool } from './workbooks/listWorkbooks.js';\n\nexport const toolFactories = [\n getGetDatasourceMetadataTool,\n getListDatasourcesTool,\n getQueryDatasourceTool,\n getListAllPulseMetricDefinitionsTool,\n getListPulseMetricDefinitionsFromDefinitionIdsTool,\n getListPulseMetricsFromMetricDefinitionIdTool,\n getListPulseMetricsFromMetricIdsTool,\n getListPulseMetricSubscriptionsTool,\n getGeneratePulseMetricValueInsightBundleTool,\n getGetWorkbookTool,\n getGetViewDataTool,\n getGetViewImageTool,\n getListWorkbooksTool,\n getListViewsTool,\n getSearchContentTool,\n];\n", "import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\nimport cors from 'cors';\nimport express, { Request, Response } from 'express';\nimport fs, { existsSync } from 'fs';\nimport http from 'http';\nimport https from 'https';\n\nimport { Config } from '../config.js';\nimport { setLogLevel } from '../logging/log.js';\nimport { Server } from '../server.js';\n\nexport async function startExpressServer({\n basePath,\n config,\n logLevel,\n}: {\n basePath: string;\n config: Config;\n logLevel: LoggingLevel;\n}): Promise<{ url: string }> {\n const app = express();\n\n app.use(express.json());\n app.use(express.urlencoded());\n\n app.use(\n cors({\n origin: config.corsOriginConfig,\n credentials: true,\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'Cache-Control',\n 'Accept',\n 'MCP-Protocol-Version',\n ],\n exposedHeaders: ['mcp-session-id', 'x-session-id'],\n }),\n );\n\n const path = `/${basePath}`;\n app.post(path, createMcpServer);\n app.get(path, methodNotAllowed);\n app.delete(path, methodNotAllowed);\n\n const useSsl = !!(config.sslKey && config.sslCert);\n if (!useSsl) {\n return new Promise((resolve) => {\n http\n .createServer(app)\n .listen(config.httpPort, () =>\n resolve({ url: `http://localhost:${config.httpPort}/${basePath}` }),\n );\n });\n }\n\n if (!existsSync(config.sslKey)) {\n throw new Error('SSL key file does not exist');\n }\n\n if (!existsSync(config.sslCert)) {\n throw new Error('SSL cert file does not exist');\n }\n\n const options = {\n key: fs.readFileSync(config.sslKey),\n cert: fs.readFileSync(config.sslCert),\n };\n\n return new Promise((resolve) => {\n https\n .createServer(options, app)\n .listen(config.httpPort, () =>\n resolve({ url: `https://localhost:${config.httpPort}/${basePath}` }),\n );\n });\n\n async function createMcpServer(req: Request, res: Response): Promise<void> {\n try {\n const server = new Server();\n const transport: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n res.on('close', () => {\n transport.close();\n server.close();\n });\n\n server.registerTools();\n server.registerRequestHandlers();\n\n await server.connect(transport);\n setLogLevel(server, logLevel);\n\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n // eslint-disable-next-line no-console -- console.error is intentional here since the transport is not stdio.\n console.error('Error handling MCP request:', error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n }\n }\n}\n\nasync function methodNotAllowed(_req: Request, res: Response): Promise<void> {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n }),\n );\n}\n"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport dotenv from 'dotenv';\n\nimport { getConfig } from './config.js';\nimport { isLoggingLevel, log, setLogLevel, setServerLogger, writeToStderr } from './logging/log.js';\nimport { ServerLogger } from './logging/serverLogger.js';\nimport { Server, serverName, serverVersion } from './server.js';\nimport { startExpressServer } from './server/express.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\n\nasync function startServer(): Promise<void> {\n dotenv.config();\n const config = getConfig();\n\n const logLevel = isLoggingLevel(config.defaultLogLevel) ? config.defaultLogLevel : 'debug';\n if (config.enableServerLogging) {\n setServerLogger(new ServerLogger({ logDirectory: config.serverLogDirectory }));\n }\n\n switch (config.transport) {\n case 'stdio': {\n const server = new Server();\n server.registerTools();\n server.registerRequestHandlers();\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n setLogLevel(server, logLevel);\n log.info(server, `${server.name} v${server.version} running on stdio`);\n break;\n }\n case 'http': {\n const { url } = await startExpressServer({ basePath: serverName, config, logLevel });\n\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(\n `${serverName} v${serverVersion} stateless streamable HTTP server available at ${url}`,\n );\n break;\n }\n }\n\n if (config.disableLogMasking) {\n writeToStderr('Log masking is disabled!');\n }\n}\n\ntry {\n await startServer();\n} catch (error) {\n writeToStderr(`Fatal error when starting the server: ${getExceptionMessage(error)}`);\n process.exit(1);\n}\n", "import { CorsOptions } from 'cors';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { isToolGroupName, isToolName, toolGroups, ToolName } from './tools/toolName.js';\nimport { isTransport, TransportName } from './transports.js';\nimport invariant from './utils/invariant.js';\n\nconst __dirname = fileURLToPath(new URL('.', import.meta.url));\n\nconst authTypes = ['pat', 'direct-trust'] as const;\ntype AuthType = (typeof authTypes)[number];\n\nexport class Config {\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n siteName: string;\n patName: string;\n patValue: string;\n jwtSubClaim: string;\n connectedAppClientId: string;\n connectedAppSecretId: string;\n connectedAppSecretValue: string;\n jwtAdditionalPayload: string;\n datasourceCredentials: string;\n defaultLogLevel: string;\n disableLogMasking: boolean;\n includeTools: Array<ToolName>;\n excludeTools: Array<ToolName>;\n maxResultLimit: number | null;\n disableQueryDatasourceFilterValidation: boolean;\n disableMetadataApiRequests: boolean;\n enableServerLogging: boolean;\n serverLogDirectory: string;\n\n constructor() {\n const cleansedVars = removeClaudeMcpBundleUserConfigTemplates(process.env);\n const {\n AUTH: auth,\n SERVER: server,\n SITE_NAME: siteName,\n TRANSPORT: transport,\n SSL_KEY: sslKey,\n SSL_CERT: sslCert,\n HTTP_PORT_ENV_VAR_NAME: httpPortEnvVarName,\n CORS_ORIGIN_CONFIG: corsOriginConfig,\n PAT_NAME: patName,\n PAT_VALUE: patValue,\n JWT_SUB_CLAIM: jwtSubClaim,\n CONNECTED_APP_CLIENT_ID: clientId,\n CONNECTED_APP_SECRET_ID: secretId,\n CONNECTED_APP_SECRET_VALUE: secretValue,\n JWT_ADDITIONAL_PAYLOAD: jwtAdditionalPayload,\n DATASOURCE_CREDENTIALS: datasourceCredentials,\n DEFAULT_LOG_LEVEL: defaultLogLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n INCLUDE_TOOLS: includeTools,\n EXCLUDE_TOOLS: excludeTools,\n MAX_RESULT_LIMIT: maxResultLimit,\n DISABLE_QUERY_DATASOURCE_FILTER_VALIDATION: disableQueryDatasourceFilterValidation,\n DISABLE_METADATA_API_REQUESTS: disableMetadataApiRequests,\n ENABLE_SERVER_LOGGING: enableServerLogging,\n SERVER_LOG_DIRECTORY: serverLogDirectory,\n } = cleansedVars;\n\n const defaultPort = 3927;\n const httpPort = cleansedVars[httpPortEnvVarName?.trim() || 'PORT'] || defaultPort.toString();\n const httpPortNumber = parseInt(httpPort, 10);\n\n this.siteName = siteName ?? '';\n this.auth = authTypes.find((type) => type === auth) ?? 'pat';\n this.transport = isTransport(transport) ? transport : 'stdio';\n this.sslKey = sslKey?.trim() ?? '';\n this.sslCert = sslCert?.trim() ?? '';\n this.httpPort = isNaN(httpPortNumber) ? defaultPort : httpPortNumber;\n this.corsOriginConfig = getCorsOriginConfig(corsOriginConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultLogLevel = defaultLogLevel ?? 'debug';\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableQueryDatasourceFilterValidation = disableQueryDatasourceFilterValidation === 'true';\n this.disableMetadataApiRequests = disableMetadataApiRequests === 'true';\n this.enableServerLogging = enableServerLogging === 'true';\n this.serverLogDirectory = serverLogDirectory || join(__dirname, 'logs');\n\n const maxResultLimitNumber = maxResultLimit ? parseInt(maxResultLimit) : NaN;\n this.maxResultLimit =\n isNaN(maxResultLimitNumber) || maxResultLimitNumber <= 0 ? null : maxResultLimitNumber;\n\n this.includeTools = includeTools\n ? includeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n this.excludeTools = excludeTools\n ? excludeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n if (this.includeTools.length > 0 && this.excludeTools.length > 0) {\n throw new Error('Cannot include and exclude tools simultaneously');\n }\n\n invariant(server, 'The environment variable SERVER is not set');\n validateServer(server);\n\n if (this.auth === 'pat') {\n invariant(patName, 'The environment variable PAT_NAME is not set');\n invariant(patValue, 'The environment variable PAT_VALUE is not set');\n } else if (this.auth === 'direct-trust') {\n invariant(jwtSubClaim, 'The environment variable JWT_SUB_CLAIM is not set');\n invariant(clientId, 'The environment variable CONNECTED_APP_CLIENT_ID is not set');\n invariant(secretId, 'The environment variable CONNECTED_APP_SECRET_ID is not set');\n invariant(secretValue, 'The environment variable CONNECTED_APP_SECRET_VALUE is not set');\n }\n\n this.server = server;\n this.patName = patName ?? '';\n this.patValue = patValue ?? '';\n this.jwtSubClaim = jwtSubClaim ?? '';\n this.connectedAppClientId = clientId ?? '';\n this.connectedAppSecretId = secretId ?? '';\n this.connectedAppSecretValue = secretValue ?? '';\n this.jwtAdditionalPayload = jwtAdditionalPayload || '{}';\n }\n}\n\nfunction validateServer(server: string): void {\n if (!server.startsWith('https://')) {\n throw new Error(`The environment variable SERVER must start with \"https://\": ${server}`);\n }\n\n try {\n const _ = new URL(server);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `The environment variable SERVER is not a valid URL: ${server} -- ${errorMessage}`,\n );\n }\n}\n\nfunction getCorsOriginConfig(corsOriginConfig: string): CorsOptions['origin'] {\n if (!corsOriginConfig) {\n return true;\n }\n\n if (corsOriginConfig.match(/^true|false$/i)) {\n return corsOriginConfig.toLowerCase() === 'true';\n }\n\n if (corsOriginConfig === '*') {\n return '*';\n }\n\n if (corsOriginConfig.startsWith('[') && corsOriginConfig.endsWith(']')) {\n try {\n const origins = JSON.parse(corsOriginConfig) as Array<string>;\n return origins.map((origin) => new URL(origin).origin);\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${corsOriginConfig}`,\n );\n }\n }\n\n try {\n return new URL(corsOriginConfig).origin;\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${corsOriginConfig}`,\n );\n }\n}\n\n// When the user does not provide a site name in the Claude MCP Bundle configuration,\n// Claude doesn't replace its value and sets the site name to \"${user_config.site_name}\".\nfunction removeClaudeMcpBundleUserConfigTemplates(\n envVars: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n return Object.entries(envVars).reduce<Record<string, string | undefined>>((acc, [key, value]) => {\n if (value?.startsWith('${user_config.')) {\n acc[key] = '';\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n};\n", "export const toolNames = [\n 'list-datasources',\n 'list-workbooks',\n 'list-views',\n 'query-datasource',\n 'get-datasource-metadata',\n 'get-workbook',\n 'get-view-data',\n 'get-view-image',\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n 'search-content',\n] as const;\nexport type ToolName = (typeof toolNames)[number];\n\nexport const toolGroupNames = [\n 'datasource',\n 'workbook',\n 'view',\n 'pulse',\n 'content-exploration',\n] as const;\nexport type ToolGroupName = (typeof toolGroupNames)[number];\n\nexport const toolGroups = {\n datasource: ['list-datasources', 'get-datasource-metadata', 'query-datasource'],\n workbook: ['list-workbooks', 'get-workbook'],\n view: ['list-views', 'get-view-data', 'get-view-image'],\n pulse: [\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n ],\n 'content-exploration': ['search-content'],\n} as const satisfies Record<ToolGroupName, Array<ToolName>>;\n\nexport function isToolName(value: unknown): value is ToolName {\n return !!toolNames.find((name) => name === value);\n}\n\nexport function isToolGroupName(value: unknown): value is ToolGroupName {\n return !!toolGroupNames.find((name) => name === value);\n}\n", "const transports = ['stdio', 'http'] as const;\nexport type TransportName = (typeof transports)[number];\nexport function isTransport(transport: unknown): transport is TransportName {\n return !!transports.find((t) => t === transport);\n}\n", "export default function invariant(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ? message : 'Invariant Violation');\n }\n}\n", "import { LoggingLevel, RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Server } from '../server.js';\nimport { ToolName } from '../tools/toolName.js';\nimport { ServerLogger } from './serverLogger.js';\ntype Logger = 'rest-api' | (string & {});\ntype LogType = LoggingLevel | 'request' | 'response' | 'tool';\ntype LogMessage = {\n type: LogType;\n [key: string]: any;\n};\n\nexport const loggingLevels = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'critical',\n 'alert',\n 'emergency',\n] as const;\n\nlet currentLogLevel: LoggingLevel = 'debug';\nlet serverLogger: ServerLogger | undefined;\n\nexport function isLoggingLevel(level: unknown): level is LoggingLevel {\n return !!loggingLevels.find((l) => l === level);\n}\n\nexport const setLogLevel = (\n server: Server,\n level: LoggingLevel,\n { silent = false }: { silent?: boolean } = {},\n): void => {\n if (currentLogLevel === level) {\n return;\n }\n\n currentLogLevel = level;\n\n if (!silent) {\n log.notice(server, `Logging level set to: ${level}`);\n }\n};\n\nexport const setServerLogger = (logger: ServerLogger): void => {\n serverLogger = logger;\n};\n\ntype LogMethodOptions = Partial<{ logger: Logger; requestId: RequestId }>;\n\nexport const log = {\n debug: getSendLoggingMessageFn('debug'),\n info: getSendLoggingMessageFn('info'),\n notice: getSendLoggingMessageFn('notice'),\n warning: getSendLoggingMessageFn('warning'),\n error: getSendLoggingMessageFn('error'),\n critical: getSendLoggingMessageFn('critical'),\n alert: getSendLoggingMessageFn('alert'),\n emergency: getSendLoggingMessageFn('emergency'),\n} satisfies {\n [level in LoggingLevel]: (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions,\n ) => Promise<void>;\n};\n\nexport const shouldLogWhenLevelIsAtLeast = (level = currentLogLevel): boolean => {\n return loggingLevels.indexOf(level) >= loggingLevels.indexOf(currentLogLevel);\n};\n\nexport const writeToStderr = (message: string): void => {\n if (process.env.TABLEAU_MCP_TEST === 'true') {\n // Silence logging when running in test mode\n return;\n }\n\n message = message.endsWith('\\n') ? message : `${message}\\n`;\n process.stderr.write(message);\n};\n\nexport const getToolLogMessage = ({\n requestId,\n toolName,\n args,\n}: {\n requestId: RequestId;\n toolName: ToolName;\n args: unknown;\n}): LogMessage => {\n return {\n type: 'tool',\n requestId,\n tool: {\n name: toolName,\n ...(args !== undefined ? { args } : {}),\n },\n };\n};\n\nfunction getSendLoggingMessageFn(level: LoggingLevel) {\n return async (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions = {\n logger: server.name,\n },\n ) => {\n serverLogger?.log({ message, level, logger });\n\n if (!shouldLogWhenLevelIsAtLeast(level)) {\n return;\n }\n\n // server.sendNotification doesn't provide a way to provide the relatedRequestId\n // so we're using server.notification directly.\n return server.server.notification(\n {\n method: 'notifications/message',\n params: {\n level,\n logger,\n data: JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n currentLogLevel,\n message,\n },\n null,\n 2,\n ),\n },\n },\n {\n relatedRequestId: requestId,\n },\n );\n };\n}\n", "import { appendFile } from 'node:fs/promises';\n\nimport { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { writeToStderr } from './log.js';\n\nexport class ServerLogger {\n private readonly _logDirectory: string;\n private readonly _fileMutexes = new Map<string, Promise<void>>();\n\n constructor({ logDirectory }: { logDirectory: string }) {\n this._logDirectory = logDirectory;\n\n if (!existsSync(this._logDirectory)) {\n mkdirSync(this._logDirectory, { recursive: true });\n }\n }\n\n async log(obj: Record<string, unknown>): Promise<void> {\n // Create a new log file each hour e.g. 2025-10-15T21-00-00-000Z.log\n const timestamp = new Date().toISOString();\n const filename = `${new Date(new Date().setMinutes(0, 0, 0)).toISOString().replace(/[:.]/g, '-')}.log`;\n const logFilePath = join(this._logDirectory, filename);\n\n // Get or create a mutex for this specific log file\n const mutexKey = logFilePath;\n const currentMutex = this._fileMutexes.get(mutexKey) ?? Promise.resolve();\n\n // Chain the file write operation after the current mutex\n const newMutex = currentMutex.then(async () => {\n try {\n // appendFile will create the file if it doesn't exist\n await appendFile(logFilePath, JSON.stringify({ timestamp, ...obj }) + '\\n');\n } catch (error) {\n writeToStderr(`Failed to write to log file ${logFilePath}: ${getExceptionMessage(error)}`);\n }\n });\n\n this._fileMutexes.set(mutexKey, newMutex);\n\n // Clean up completed mutexes to prevent memory leaks\n newMutex.finally(() => {\n if (this._fileMutexes.get(mutexKey) === newMutex) {\n this._fileMutexes.delete(mutexKey);\n }\n });\n\n // Wait for the file write operation to complete\n await newMutex;\n }\n}\n", "export function getExceptionMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error) ?? 'undefined';\n } catch {\n return `${error}`;\n }\n}\n", "import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nimport pkg from '../package.json' with { type: 'json' };\nimport { getConfig } from './config.js';\nimport { setLogLevel } from './logging/log.js';\nimport { Tool } from './tools/tool.js';\nimport { toolNames } from './tools/toolName.js';\nimport { toolFactories } from './tools/tools.js';\n\nexport const serverName = 'tableau-mcp';\nexport const serverVersion = pkg.version;\n\nexport class Server extends McpServer {\n readonly name: string;\n readonly version: string;\n\n constructor() {\n super(\n {\n name: serverName,\n version: serverVersion,\n },\n {\n capabilities: {\n logging: {},\n tools: {},\n },\n },\n );\n\n this.name = serverName;\n this.version = serverVersion;\n }\n\n registerTools = (): void => {\n for (const {\n name,\n description,\n paramsSchema,\n annotations,\n callback,\n } of this._getToolsToRegister()) {\n this.tool(name, description, paramsSchema, annotations, callback);\n }\n };\n\n registerRequestHandlers = (): void => {\n this.server.setRequestHandler(SetLevelRequestSchema, async (request) => {\n setLogLevel(this, request.params.level);\n return {};\n });\n };\n\n private _getToolsToRegister = (): Array<Tool<any>> => {\n const { includeTools, excludeTools } = getConfig();\n\n const tools = toolFactories.map((tool) => tool(this));\n const toolsToRegister = tools.filter((tool) => {\n if (includeTools.length > 0) {\n return includeTools.includes(tool.name);\n }\n\n if (excludeTools.length > 0) {\n return !excludeTools.includes(tool.name);\n }\n\n return true;\n });\n\n if (toolsToRegister.length === 0) {\n throw new Error(`\n No tools to register.\n Tools available = [${toolNames.join(', ')}].\n EXCLUDE_TOOLS = [${excludeTools.join(', ')}].\n INCLUDE_TOOLS = [${includeTools.join(', ')}]\n `);\n }\n\n return toolsToRegister;\n };\n}\n\nexport const exportedForTesting = {\n Server,\n};\n", "{\n \"name\": \"@tableau/mcp-server\",\n \"description\": \"An MCP server for Tableau, providing a suite of tools that will make it easier for developers to build AI applications that integrate with Tableau.\",\n \"version\": \"1.10.3\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/tableau/tableau-mcp.git\"\n },\n \"homepage\": \"https://github.com/tableau/tableau-mcp\",\n \"bugs\": \"https://github.com/tableau/tableau-mcp/issues\",\n \"author\": \"Tableau\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"keywords\": [\n \"tableau\",\n \"mcp\"\n ],\n \"bin\": {\n \"tableau-mcp-server\": \"./build/index.js\"\n },\n \"scripts\": {\n \":build\": \"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --minify --outdir=build --sourcemap\",\n \"build\": \"run-s :build exec-perms\",\n \"build:watch\": \"npm run :build -- --watch\",\n \"build:docker\": \"docker build -t tableau-mcp .\",\n \":build:mcpb\": \"npx -y @anthropic-ai/mcpb pack . tableau-mcp.mcpb\",\n \"build:mcpb\": \"run-s build:manifest:script build:manifest :build:mcpb\",\n \"build:manifest\": \"node build/scripts/createClaudeMcpBundleManifest.mjs\",\n \"build:manifest:script\": \"esbuild src/scripts/createClaudeMcpBundleManifest.ts --bundle --platform=node --format=esm --outdir=build/scripts --sourcemap=inline --out-extension:.js=.mjs\",\n \"start:http\": \"node build/index.js\",\n \"start:http:docker\": \"docker run -p 3927:3927 -i --rm --env-file env.list tableau-mcp\",\n \"lint\": \"npm exec eslint\",\n \"inspect\": \"npx @modelcontextprotocol/inspector --config config.json --server tableau\",\n \":inspect:http\": \"npx @modelcontextprotocol/inspector --config config.http.json --server tableau\",\n \"inspect:http\": \"run-p start:http :inspect:http\",\n \"inspect:docker\": \"npx @modelcontextprotocol/inspector --config config.docker.json --server tableau\",\n \"inspect:docker:http\": \"run-p start:http:docker :inspect:http\",\n \"build:inspect\": \"run-s build inspect\",\n \"build:inspect:docker\": \"run-s build:docker inspect:docker\",\n \"build:inspect:docker:http\": \"run-s build:docker inspect:docker:http\",\n \"exec-perms\": \"shx chmod +x build/*.js\",\n \"test\": \"vitest --config ./vitest.config.ts\",\n \"test:e2e\": \"vitest --config ./vitest.config.e2e.ts\",\n \"test:eval\": \"vitest --config ./vitest.config.eval.ts\",\n \"coverage\": \"vitest run --config ./vitest.config.ts --coverage\",\n \"version:major\": \"npm version major --no-git-tag-version\",\n \"version:minor\": \"npm version minor --no-git-tag-version\",\n \"version:patch\": \"npm version patch --no-git-tag-version\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.12.1\",\n \"@zodios/core\": \"^10.9.6\",\n \"cors\": \"^2.8.5\",\n \"dotenv\": \"^16.5.0\",\n \"express\": \"^5.1.0\",\n \"fast-levenshtein\": \"^3.0.0\",\n \"jose\": \"^6.0.12\",\n \"ts-results-es\": \"^5.0.1\",\n \"zod\": \"^3.24.3\",\n \"zod-validation-error\": \"^4.0.1\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/mcpb\": \"^1.0.0\",\n \"@eslint/eslintrc\": \"^3.3.1\",\n \"@eslint/js\": \"^9.25.1\",\n \"@modelcontextprotocol/inspector\": \"^0.16.6\",\n \"@openai/agents\": \"^0.1.9\",\n \"@types/cors\": \"^2.8.19\",\n \"@types/eslint__js\": \"^8.42.3\",\n \"@types/express\": \"^5.0.3\",\n \"@types/fast-levenshtein\": \"^0.0.1\",\n \"@types/node\": \"^22.15.3\",\n \"@typescript-eslint/eslint-plugin\": \"^8.31.1\",\n \"@typescript-eslint/parser\": \"^8.31.1\",\n \"@vitest/coverage-v8\": \"^3.1.3\",\n \"esbuild\": \"^0.25.5\",\n \"eslint\": \"^9.25.1\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"eslint-plugin-prettier\": \"^5.2.6\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"npm-run-all\": \"^4.1.5\",\n \"openai\": \"^5.23.2\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"shx\": \"^0.4.0\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.31.1\",\n \"vitest\": \"^3.1.3\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n orderBySchema,\n searchContentFilterSchema,\n} from '../../sdks/tableau/types/contentExploration.js';\nimport { Server } from '../../server.js';\nimport { Tool } from '../tool.js';\nimport {\n buildFilterString,\n buildOrderByString,\n reduceSearchContentResponse,\n} from './searchContentUtils.js';\n\nconst paramsSchema = {\n terms: z.string().trim().nonempty().optional(),\n limit: z.number().int().min(1).max(2000).default(100).optional(),\n orderBy: orderBySchema.optional(),\n filter: searchContentFilterSchema.optional(),\n};\n\nexport const getSearchContentTool = (server: Server): Tool<typeof paramsSchema> => {\n const searchContentTool = new Tool({\n server,\n name: 'search-content',\n description: `\nThis tool searches across all supported content types for objects relevant to the search expression specified by search terms and filters.\n\n**Parameters:**\n\n- \\`terms\\` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. If the terms parameter is not provided, it searches for everything bound by the specified filters.\n\n- \\`filter\\` (optional): Allows you to limit search results based on:\n - \\`contentTypes\\`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook'\n - \\`ownerIds\\`: Filter by specific owner IDs (array of integers)\n - \\`modifiedTime\\`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include\n\n- \\`limit\\` (optional): The number of items to return in the search response (default: 100, max: 2000)\n\n- \\`orderBy\\` (optional): Determines the sorting method for returned items. Available sorting methods:\n - \\`hitsTotal\\`: Number of times a content item has been viewed since it was created\n - \\`hitsSmallSpanTotal\\`: Number of times a content item was viewed in the last month\n - \\`hitsMediumSpanTotal\\`: Number of times a content item was viewed in the last 3 months\n - \\`hitsLargeSpanTotal\\`: Number of times a content item was viewed in the last year\n - \\`downstreamWorkbookCount\\`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table'\n \n For each sort method, you can specify a sort direction: 'asc' for ascending or 'desc' for descending (default: 'asc'). The orderBy parameter is an array of objects containing the sorting method and direction. The first element determines primary sorting, with subsequent elements used as tiebreakers.\n\n**Important Notes:**\n- If \\`orderBy\\` is omitted, the search will sort items by their \"relevance score\" in descending order, which is Tableau's internal algorithm for providing the most relevant results`,\n paramsSchema,\n annotations: {\n title: 'Search Content',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ terms, limit, orderBy, filter }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const orderByString = orderBy ? buildOrderByString(orderBy) : undefined;\n const filterString = filter ? buildFilterString(filter) : undefined;\n return await searchContentTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const response = await restApi.contentExplorationMethods.searchContent({\n terms,\n page: 0,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? 100)\n : (limit ?? 100),\n orderBy: orderByString,\n filter: filterString,\n });\n return reduceSearchContentResponse(response);\n },\n }),\n );\n },\n });\n },\n });\n\n return searchContentTool;\n};\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport {\n RequestInterceptorConfig,\n ResponseInterceptorConfig,\n} from '../sdks/tableau/interceptors.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { shouldLogWhenLevelIsAtLeast, writeToStderr } from './log.js';\n\ntype MaskedKeys = 'data' | 'headers';\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\ntype MaskedRequest = Optional<RequestInterceptorConfig, MaskedKeys>;\ntype MaskedResponse = Optional<ResponseInterceptorConfig, MaskedKeys>;\n\nexport const maskRequest = (config: RequestInterceptorConfig): MaskedRequest => {\n const result = clone<MaskedRequest>(config);\n if (result.isErr()) {\n return config;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n\n if (Array.isArray(maskedData?.data?.datasource?.connections)) {\n const connections = maskedData.data.datasource.connections as Array<{\n connectionLuid: string;\n connectionUsername: string;\n connectionPassword: string;\n }>;\n\n connections.forEach((connection) => {\n connection.connectionUsername = '<redacted>';\n connection.connectionPassword = '<redacted>';\n });\n }\n\n if (maskedData.headers?.['X-Tableau-Auth']) {\n maskedData.headers['X-Tableau-Auth'] = '<redacted>';\n }\n\n if (maskedData.params?.['user_id']) {\n maskedData.params['user_id'] = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n delete maskedData.params;\n }\n\n return maskedData;\n};\n\nexport const maskResponse = (response: ResponseInterceptorConfig): MaskedResponse => {\n const result = clone<MaskedResponse>(response);\n if (result.isErr()) {\n return response;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n }\n\n return maskedData;\n};\n\nfunction clone<T>(obj: T): Result<T, Error> {\n try {\n return Ok(structuredClone(obj));\n } catch (error) {\n if (error instanceof Error) {\n return Err(error);\n }\n\n const message = getExceptionMessage(error);\n writeToStderr(`Could not clone object, notification may not be sanitized! Error: ${message}`);\n return Err(new Error(message));\n }\n}\n", "import { ZodiosClass } from '@zodios/core';\n\nexport type RequestInterceptor = (config: RequestInterceptorConfig) => void;\nexport type ResponseInterceptor = (response: ResponseInterceptorConfig) => void;\nexport type ErrorInterceptor = (error: unknown, baseUrl: string) => void;\n\nexport type AxiosInterceptor = ZodiosClass<any>['axios']['interceptors'];\nexport type AxiosRequestInterceptor = Parameters<AxiosInterceptor['request']['use']>[0];\nexport type AxiosRequestInterceptorConfig = Parameters<NonNullable<AxiosRequestInterceptor>>[0];\nexport type RequestInterceptorConfig = {\n baseUrl: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosRequestInterceptorConfig, 'headers'>;\n\nexport type AxiosResponseInterceptor = Parameters<AxiosInterceptor['response']['use']>[0];\nexport type AxiosResponseInterceptorConfig = Parameters<NonNullable<AxiosResponseInterceptor>>[0];\nexport type ResponseInterceptorConfig = {\n baseUrl: string;\n url: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosResponseInterceptorConfig, 'headers' | 'statusText' | 'config'>;\n\nexport function getRequestInterceptorConfig(\n config: AxiosRequestInterceptorConfig,\n): Omit<RequestInterceptorConfig, 'baseUrl'> {\n return {\n method: config.method ?? 'UNKNOWN METHOD',\n url: config.url ?? 'UNKNOWN URL',\n headers: config.headers,\n data: config.data,\n params: config.params,\n };\n}\n\nexport function getResponseInterceptorConfig(\n response: AxiosResponseInterceptorConfig,\n): Omit<ResponseInterceptorConfig, 'baseUrl'> {\n return {\n url: response.config.url ?? 'UNKNOWN URL',\n status: response.status,\n headers: response.headers,\n data: response.data,\n };\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { getJwt } from '../../../utils/getJwt.js';\nimport { authenticationApis } from '../apis/authenticationApi.js';\nimport { AuthConfig } from '../authConfig.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\nimport Methods from './methods.js';\n\n/**\n * Authentication methods of the Tableau Server REST API\n *\n * @export\n * @class AuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport default class AuthenticationMethods extends Methods<typeof authenticationApis> {\n constructor(baseUrl: string) {\n super(new Zodios(baseUrl, authenticationApis));\n }\n\n /**\n * Signs you in as a user on the specified site on Tableau Server or Tableau Cloud.\n *\n * @param {AuthConfig} authConfig - The authentication configuration\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_in\n */\n signIn = async (authConfig: AuthConfig): Promise<Credentials> => {\n return (\n await this._apiClient.signIn({\n credentials: {\n site: {\n contentUrl: authConfig.siteName,\n },\n ...(await (async () => {\n switch (authConfig.type) {\n case 'pat':\n return {\n personalAccessTokenName: authConfig.patName,\n personalAccessTokenSecret: authConfig.patValue,\n };\n case 'direct-trust':\n return {\n jwt: await getJwt({\n username: authConfig.username,\n connectedApp: {\n clientId: authConfig.clientId,\n secretId: authConfig.secretId,\n secretValue: authConfig.secretValue,\n },\n scopes: authConfig.scopes,\n additionalPayload: authConfig.additionalPayload,\n }),\n };\n }\n })()),\n },\n })\n ).credentials;\n };\n}\n\n/**\n * Authentication methods of the Tableau Server REST API that assume the user is already authenticated\n *\n * @export\n * @class AuthenticatedAuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport class AuthenticatedAuthenticationMethods extends AuthenticatedMethods<\n typeof authenticationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, authenticationApis), creds);\n }\n\n /**\n * Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_out\n *\n * Required scopes: none\n *\n */\n signOut = async (): Promise<void> => {\n await this._apiClient.signOut(undefined, {\n ...this.authHeader,\n });\n };\n}\n", "import { randomUUID } from 'node:crypto';\n\nimport { JWTHeaderParameters, JWTPayload, SignJWT } from 'jose';\n\nexport async function getJwt({\n username,\n connectedApp,\n scopes,\n additionalPayload,\n}: {\n username: string;\n connectedApp: {\n clientId: string;\n secretId: string;\n secretValue: string;\n };\n scopes: Set<string>;\n additionalPayload?: Record<string, unknown>;\n}): Promise<string> {\n const header: JWTHeaderParameters = {\n alg: 'HS256',\n typ: 'JWT',\n kid: connectedApp.secretId,\n };\n\n const payload: JWTPayload = {\n jti: randomUUID(),\n iss: connectedApp.clientId,\n aud: 'tableau',\n sub: username,\n scp: [...scopes],\n iat: Math.floor(Date.now() / 1000) - 5,\n exp: Math.floor(Date.now() / 1000) + 5 * 60,\n ...additionalPayload,\n };\n\n const token = await new SignJWT(payload)\n .setProtectedHeader(header)\n .sign(new TextEncoder().encode(connectedApp.secretValue));\n\n return token;\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { credentialsSchema } from '../types/credentials.js';\n\nconst signInRequestSchema = z.object({\n credentials: z\n .object({\n site: z.object({\n contentUrl: z.string(),\n }),\n })\n .and(\n z\n .object({\n personalAccessTokenName: z.string(),\n personalAccessTokenSecret: z.string(),\n })\n .or(\n z.object({\n jwt: z.string(),\n }),\n ),\n ),\n});\n\nconst signInEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signin',\n alias: 'signIn',\n description: 'Signs in with Tableau credentials.',\n response: credentialsSchema,\n parameters: [\n {\n name: 'credentials',\n type: 'Body',\n schema: signInRequestSchema,\n },\n ],\n});\n\nconst signOutEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signout',\n alias: 'signOut',\n description:\n 'Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.',\n response: z.void(),\n});\n\nconst authenticationApi = makeApi([signInEndpoint, signOutEndpoint]);\nexport const authenticationApis = [\n ...authenticationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const credentialsSchema = z.object({\n credentials: z.object({\n site: z.object({\n id: z.string(),\n }),\n user: z.object({\n id: z.string(),\n }),\n token: z.string(),\n }),\n});\n\nexport type Credentials = z.infer<typeof credentialsSchema>['credentials'];\n", "import { ZodiosClass, ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nexport default class Methods<T extends ZodiosEndpointDefinitions> {\n protected _apiClient: ZodiosInstance<T>;\n\n constructor(apiClient: ZodiosInstance<T>) {\n this._apiClient = apiClient;\n }\n\n get interceptors(): ZodiosClass<T>['axios']['interceptors'] {\n return this._apiClient.axios.interceptors;\n }\n}\n", "import { ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nimport { Credentials } from '../types/credentials.js';\nimport Methods from './methods.js';\n\ntype AuthHeaders = {\n headers: {\n 'X-Tableau-Auth': string;\n };\n};\n\n/**\n * Base abstract class for any methods classes that require authentication.\n *\n * @export\n * @abstract\n * @class AuthenticatedMethods\n */\nexport default abstract class AuthenticatedMethods<\n T extends ZodiosEndpointDefinitions,\n> extends Methods<T> {\n private _creds: Credentials;\n\n protected get authHeader(): AuthHeaders {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n\n return {\n headers: {\n 'X-Tableau-Auth': this._creds.token,\n },\n };\n }\n\n protected get userId(): string {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n return this._creds.user.id;\n }\n\n constructor(apiClient: ZodiosInstance<T>, creds: Credentials) {\n super(apiClient);\n this._creds = creds;\n }\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { contentExplorationApis } from '../apis/contentExplorationApi.js';\nimport { SearchContentResponse } from '../types/contentExploration.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Content Exploration methods of the Tableau Server REST API\n *\n * @export\n * @class ContentExplorationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm\n */\nexport default class ContentExplorationMethods extends AuthenticatedMethods<\n typeof contentExplorationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, contentExplorationApis), creds);\n }\n\n /**\n * Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param terms - The search terms\n * @param page - The number of the page in the list reponse pages to return. Maximum number of items is 2000.\n * @param limit - The number of items to return on each page. The default is 10.\n * @param orderBy - The sorting method for items returned.\n * @param filter - An expression to filter the response\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm#ContentExplorationService_getSearch\n */\n searchContent = async (queries: {\n terms?: string;\n page?: number;\n limit?: number;\n orderBy?: string;\n filter?: string;\n }): Promise<SearchContentResponse> => {\n Object.entries(queries).forEach(([key, value]) => {\n if (value === undefined) {\n delete queries[key as keyof typeof queries];\n }\n });\n const response = await this._apiClient.searchContent({ queries, ...this.authHeader });\n return response.hits;\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { searchContentResponseSchema } from '../types/contentExploration.js';\n\nconst searchContentEndpoint = makeEndpoint({\n method: 'get',\n path: '/search',\n alias: 'searchContent',\n description:\n 'Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.',\n parameters: [\n {\n name: 'terms',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'page',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'limit',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'order_by',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n },\n ],\n response: z.object({\n hits: searchContentResponseSchema,\n }),\n});\n\nconst contentExplorationApi = makeApi([searchContentEndpoint]);\n\nexport const contentExplorationApis = [\n ...contentExplorationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst orderingMethods = z.enum([\n 'hitsTotal',\n 'hitsSmallSpanTotal',\n 'hitsMediumSpanTotal',\n 'hitsLargeSpanTotal',\n 'downstreamWorkbookCount',\n]);\n\nexport const orderBySchema = z\n .array(\n z.object({\n method: orderingMethods,\n sortDirection: z.enum(['asc', 'desc']).default('asc').optional(),\n }),\n )\n .nonempty();\n\nexport type OrderBy = z.infer<typeof orderBySchema>;\n\nconst contentTypes = z.enum([\n 'lens',\n 'datasource',\n 'virtualconnection',\n 'collection',\n 'project',\n 'flow',\n 'datarole',\n 'table',\n 'database',\n 'view',\n 'workbook',\n]);\n\nconst modifiedTimeSchema = z.union([\n z.array(z.string().datetime()).nonempty(),\n z\n .object({\n startDate: z.string().datetime(),\n endDate: z.string().datetime().optional(),\n })\n .strict(),\n z\n .object({\n startDate: z.string().datetime().optional(),\n endDate: z.string().datetime(),\n })\n .strict(),\n]);\n\nexport const searchContentFilterBase = z\n .object({\n contentTypes: z.array(contentTypes).nonempty(),\n ownerIds: z.array(z.number().int()).nonempty(),\n modifiedTime: modifiedTimeSchema,\n })\n .partial();\n\nexport const searchContentFilterSchema = z.union([\n searchContentFilterBase.extend({ contentTypes: z.array(contentTypes).nonempty() }).strict(),\n searchContentFilterBase.extend({ ownerIds: z.array(z.number().int()).nonempty() }).strict(),\n searchContentFilterBase.extend({ modifiedTime: modifiedTimeSchema }).strict(),\n]);\n\nexport type SearchContentFilter = z.infer<typeof searchContentFilterSchema>;\n\nconst searchContentItemSchema = z.object({\n uri: z.string(),\n content: z.record(z.string(), z.unknown()),\n});\n\nexport const searchContentResponseSchema = z\n .object({\n next: z.string(),\n prev: z.string(),\n pageIndex: z.number().int(),\n startIndex: z.number().int(),\n total: z.number().int(),\n limit: z.number().int(),\n items: z.array(searchContentItemSchema),\n })\n .partial();\n\nexport type SearchContentItem = z.infer<typeof searchContentItemSchema>;\n\nexport type SearchContentResponse = z.infer<typeof searchContentResponseSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { datasourcesApis } from '../apis/datasourcesApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { DataSource } from '../types/dataSource.js';\nimport { Pagination } from '../types/pagination.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Data Sources methods of the Tableau Server REST API\n *\n * @export\n * @class DatasourcesMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm\n */\nexport default class DatasourcesMethods extends AuthenticatedMethods<typeof datasourcesApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, datasourcesApis), creds);\n }\n\n /**\n * Returns a list of published data sources on the specified site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter datasources by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm#query_data_sources\n */\n listDatasources = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; datasources: DataSource[] }> => {\n const response = await this._apiClient.listDatasources({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n datasources: response.datasources.datasource ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { dataSourceSchema } from '../types/dataSource.js';\nimport { paginationSchema } from '../types/pagination.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst listDatasourcesRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/datasources',\n alias: 'listDatasources',\n description:\n 'Returns a list of published data sources on the specified site. Supports a filter string as a query parameter in the format field:operator:value.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description: 'Filter string in the format field:operator:value (e.g., name:eq:Project Views)',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n datasources: z.object({\n datasource: z.optional(z.array(dataSourceSchema)),\n }),\n }),\n});\n\nconst datasourcesApi = makeApi([listDatasourcesRestEndpoint]);\nexport const datasourcesApis = [...datasourcesApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\n\nexport const dataSourceSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n project: projectSchema,\n});\n\nexport type DataSource = z.infer<typeof dataSourceSchema>;\n", "import { z } from 'zod';\n\nexport const projectSchema = z.object({\n name: z.string(),\n id: z.string(),\n});\n", "import { z } from 'zod';\n\nexport const paginationSchema = z.object({\n pageNumber: z.coerce.number(),\n pageSize: z.coerce.number(),\n totalAvailable: z.coerce.number(),\n});\n\nexport type Pagination = z.infer<typeof paginationSchema>;\n", "import { ZodiosEndpointParameter } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const paginationParameters = [\n {\n name: 'pageSize',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.',\n },\n {\n name: 'pageNumber',\n type: 'Query',\n schema: z.number().optional(),\n description: 'The offset for paging. The default is 1.',\n },\n] as const satisfies Array<ZodiosEndpointParameter>;\n", "import { Zodios } from '@zodios/core';\n\nimport { GraphQLResponse, metadataApis } from '../apis/metadataApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Metadata methods of the Tableau Server REST API\n *\n * @export\n * @class MetadataMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_metadata.htm\n */\nexport default class MetadataMethods extends AuthenticatedMethods<typeof metadataApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, metadataApis), creds);\n }\n\n /**\n * Executes a GraphQL query against the Tableau Server.\n *\n * Required scopes: `tableau:content:read`\n *\n * @link https://help.tableau.com/current/api/metadata_api/en-us/index.html\n *\n * @param {string} query\n */\n graphql = async (query: string): Promise<GraphQLResponse> => {\n return await this._apiClient.graphql({ query }, { ...this.authHeader });\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const graphqlResponse = z.object({\n data: z.object({\n publishedDatasources: z.array(\n z.object({\n name: z.string().nullable(),\n description: z.string().nullable(),\n owner: z.object({\n name: z.string().nullable(),\n }),\n fields: z.array(\n z.object({\n name: z.string(),\n isHidden: z.boolean().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(\n z\n .object({\n attribute: z.string(),\n value: z.string().nullable(),\n })\n .nullable(),\n )\n .nullable(),\n fullyQualifiedName: z.string(),\n __typename: z.string(),\n // Common field properties (optional since they depend on field type)\n dataCategory: z.string().nullish(),\n role: z.string().nullish(),\n dataType: z.string().nullish(),\n defaultFormat: z.string().nullish(),\n semanticRole: z.string().nullish(),\n aggregation: z.string().nullish(),\n aggregationParam: z.string().nullish(),\n // CalculatedField specific properties\n formula: z.string().nullish(),\n isAutoGenerated: z.boolean().nullish(),\n hasUserReference: z.boolean().nullish(),\n // BinField specific properties\n binSize: z.number().nullish(),\n // GroupField specific properties\n hasOther: z.boolean().nullish(),\n // CombinedSetField specific properties\n delimiter: z.string().nullish(),\n combinationType: z.string().nullish(),\n }),\n ),\n }),\n ),\n }),\n});\n\nexport type GraphQLResponse = z.infer<typeof graphqlResponse>;\n\nconst graphqlEndpoint = makeEndpoint({\n method: 'post',\n path: '/graphql',\n alias: 'graphql',\n response: graphqlResponse,\n parameters: [\n {\n name: 'query',\n type: 'Body',\n schema: z.object({\n query: z.string(),\n }),\n },\n ],\n});\n\nconst metadataApi = makeApi([graphqlEndpoint]);\nexport const metadataApis = [...metadataApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport z from 'zod';\n\nimport { isAxiosError } from '../../../utils/isAxiosError.js';\nimport { pulseApis } from '../apis/pulseApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport {\n pulseBundleRequestSchema,\n pulseBundleResponseSchema,\n PulseInsightBundleType,\n PulseMetric,\n PulseMetricDefinition,\n PulseMetricDefinitionView,\n PulseMetricSubscription,\n} from '../types/pulse.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Pulse methods of the Tableau Server REST API\n *\n * @export\n * @class PulseMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm\n */\nexport default class PulseMethods extends AuthenticatedMethods<typeof pulseApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, pulseApis), creds);\n }\n\n /**\n * Returns a list of all published Pulse Metric Definitions.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param view - The view of the definition to return. If not specified, the default view is returned.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListDefinitions\n */\n listAllPulseMetricDefinitions = async (\n view?: PulseMetricDefinitionView,\n ): Promise<PulseResult<PulseMetricDefinition[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listAllPulseMetricDefinitions({\n queries: { view },\n ...this.authHeader,\n });\n return response.definitions ?? [];\n });\n };\n\n /**\n * Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param metricDefinitionIds - The list of metric definition IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetDefinitionsByPost\n */\n listPulseMetricDefinitionsFromMetricDefinitionIds = async (\n metricDefinitionIds: string[],\n view?: PulseMetricDefinitionView,\n ): Promise<PulseResult<PulseMetricDefinition[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricDefinitionsFromMetricDefinitionIds(\n { definition_ids: metricDefinitionIds },\n { queries: { view }, ...this.authHeader },\n );\n return response.definitions ?? [];\n });\n };\n\n /**\n * Returns a list of published Pulse Metrics.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param pulseMetricDefinitionID - The ID of the Pulse Metric Definition to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListMetrics\n */\n listPulseMetricsFromMetricDefinitionId = async (\n pulseMetricDefinitionID: string,\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricDefinitionId({\n params: { pulseMetricDefinitionID },\n ...this.authHeader,\n });\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metrics for a list of metric IDs.\n *\n * Required scopes: `tableau:insight_metrics:read`\n *\n * @param metricIds - The list of metric IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetMetrics\n */\n listPulseMetricsFromMetricIds = async (\n metricIds: string[],\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricIds(\n { metric_ids: metricIds },\n { ...this.authHeader },\n );\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metric Subscriptions for the current user.\n *\n * Required scopes: `tableau:metric_subscriptions:read`\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseSubscriptionService_ListSubscriptions\n */\n listPulseMetricSubscriptionsForCurrentUser = async (): Promise<\n PulseResult<PulseMetricSubscription[]>\n > => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricSubscriptionsForCurrentUser({\n queries: { user_id: this.userId },\n ...this.authHeader,\n });\n return response.subscriptions ?? [];\n });\n };\n\n /**\n * Returns the generated bundle of the current aggregate value for the Pulse metric.\n *\n * Required scopes: `tableau:insights:read`\n *\n * @param bundleRequest - The request to generate a bundle for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseInsightsService_GenerateInsightBundleBasic\n */\n generatePulseMetricValueInsightBundle = async (\n bundleRequest: z.infer<typeof pulseBundleRequestSchema>,\n bundleType: PulseInsightBundleType,\n ): Promise<PulseResult<z.infer<typeof pulseBundleResponseSchema>>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.generatePulseMetricValueInsightBundle(\n { bundle_request: bundleRequest.bundle_request },\n { params: { bundle_type: bundleType }, ...this.authHeader },\n );\n return response ?? {};\n });\n };\n}\n\ntype PulseResult<T> = Result<T, 'tableau-server' | 'pulse-disabled'>;\nasync function guardAgainstPulseDisabled<T>(callback: () => Promise<T>): Promise<PulseResult<T>> {\n try {\n return new Ok(await callback());\n } catch (error) {\n if (isAxiosError(error)) {\n if (error.response?.status === 404) {\n return new Err('tableau-server');\n }\n\n if (\n error.response?.status === 400 &&\n error.response.headers.tableau_error_code === '0xd3408984' &&\n error.response.headers.validation_code === '400999'\n ) {\n // ntbue-service-chassis/-/blob/main/server/interceptors/site_settings.go\n return new Err('pulse-disabled');\n }\n }\n\n throw error;\n }\n}\n", "'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n", "'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n", "import FormData from 'form-data';\n\nexport default FormData;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n", "'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n", "'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n", "import crypto from 'crypto';\nimport URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n const randomValues = new Uint32Array(size);\n crypto.randomFillSync(randomValues);\n for (let i = 0; i < size; i++) {\n str += alphabet[randomValues[i] % length];\n }\n\n return str;\n}\n\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n ALPHABET,\n generateString,\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n", "'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n", "const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n", "import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n", "'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n", "'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n", "'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n", "'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n", "'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n", "'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n", "'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n", "'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport proxyFromEnv from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport {EventEmitter} from 'events';\nimport formDataToStream from \"../helpers/formDataToStream.js\";\nimport readBlob from \"../helpers/readBlob.js\";\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from \"../helpers/callbackify.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n}\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n\nconst flushOnFinish = (stream, [throttled, flush]) => {\n stream\n .on('end', flush)\n .on('error', flush);\n\n return throttled;\n}\n\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n }\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n }\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n })\n};\n\nconst resolveFamily = ({address, family}) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return ({\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4)\n });\n}\n\nconst buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family});\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let {data, lookup, family} = config;\n const {responseType, responseEncoding} = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n if (err) {\n return cb(err);\n }\n\n const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n }\n }\n\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new EventEmitter();\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n emitter.removeAllListeners();\n }\n\n onDone((value, isRejected) => {\n isDone = true;\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n });\n\n function abort(reason) {\n emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n\n emitter.once('abort', reject);\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n // Apply the same semantics as HTTP: only enforce if a finite, non-negative cap is set.\n if (config.maxContentLength > -1) {\n // Use the exact string passed to fromDataURI (config.url); fall back to fullPath if needed.\n const dataUrl = String(config.url || fullPath || '');\n const estimated = estimateDataURLDecodedBytes(dataUrl);\n\n if (estimated > config.maxContentLength) {\n return reject(new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config\n ));\n }\n }\n\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const {onUploadProgress, onDownloadProgress} = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(data, (formHeaders) => {\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {\n }\n }\n } else if (utils.isBlob(data) || utils.isFile(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', flushOnFinish(\n data,\n progressEventDecorator(\n contentLength,\n progressEventReducer(asyncDecorator(onUploadProgress), false, 3)\n )\n ));\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname.startsWith(\"[\") ? parsed.hostname.slice(1, -1) : parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = +res.headers['content-length'];\n\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', flushOnFinish(\n transformStream,\n progressEventDecorator(\n responseLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)\n )\n ));\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const offListeners = stream.finished(responseStream, () => {\n offListeners();\n onFinished();\n });\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'stream has been aborted',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n emitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n emitter.once('abort', err => {\n reject(err);\n req.destroy(err);\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n reject(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n abort();\n });\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n}\n\nexport const __setProxy = setProxy;\n", "export const VERSION = \"1.12.1\";", "'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n", "'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const internals = this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n const pushChunk = (_chunk, _callback) => {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n internals.isCaptured && this.emit('progress', internals.bytesSeen);\n\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\n\nexport default AxiosTransformStream;\n", "import util from 'util';\nimport {Readable} from 'stream';\nimport utils from \"../utils.js\";\nimport readBlob from \"./readBlob.js\";\nimport platform from \"../platform/index.js\";\n\nconst BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const {escapeName} = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode(){\n yield this.headers;\n\n const {value} = this;\n\n if(utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match) => ({\n '\\r' : '%0D',\n '\\n' : '%0A',\n '\"' : '%22',\n }[match]));\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)\n } = options || {};\n\n if(!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long')\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`\n }\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from((async function *() {\n for(const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })());\n};\n\nexport default formDataToStream;\n", "const {asyncIterator} = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream()\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer()\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n}\n\nexport default readBlob;\n", "\"use strict\";\n\nimport stream from \"stream\";\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) { // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n", "import utils from \"../utils.js\";\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn) ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n}\n\nexport default callbackify;\n", "'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n", "/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n", "import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n", "/**\n * Estimate decoded byte length of a data:// URL *without* allocating large buffers.\n * - For base64: compute exact decoded size using length and padding;\n * handle %XX at the character-count level (no string allocation).\n * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.\n *\n * @param {string} url\n * @returns {number}\n */\nexport default function estimateDataURLDecodedBytes(url) {\n if (!url || typeof url !== 'string') return 0;\n if (!url.startsWith('data:')) return 0;\n\n const comma = url.indexOf(',');\n if (comma < 0) return 0;\n\n const meta = url.slice(5, comma);\n const body = url.slice(comma + 1);\n const isBase64 = /;base64/i.test(meta);\n\n if (isBase64) {\n let effectiveLen = body.length;\n const len = body.length; // cache length\n\n for (let i = 0; i < len; i++) {\n if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {\n const a = body.charCodeAt(i + 1);\n const b = body.charCodeAt(i + 2);\n const isHex =\n ((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&\n ((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));\n\n if (isHex) {\n effectiveLen -= 2;\n i += 2;\n }\n }\n }\n\n let pad = 0;\n let idx = len - 1;\n\n const tailIsPct3D = (j) =>\n j >= 2 &&\n body.charCodeAt(j - 2) === 37 && // '%'\n body.charCodeAt(j - 1) === 51 && // '3'\n (body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'\n\n if (idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n idx--;\n } else if (tailIsPct3D(idx)) {\n pad++;\n idx -= 3;\n }\n }\n\n if (pad === 1 && idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n } else if (tailIsPct3D(idx)) {\n pad++;\n }\n }\n\n const groups = Math.floor(effectiveLen / 4);\n const bytes = groups * 3 - (pad || 0);\n return bytes > 0 ? bytes : 0;\n }\n\n return Buffer.byteLength(body, 'utf8');\n}\n", "import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n", "import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n", "import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n", "import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n", "\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({fetch, Request, Response}) => ({\n fetch, Request, Response\n }))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n const {fetch, Request, Response} = Object.assign({}, globalFetchAPI, env);\n const isFetchSupported = isFunction(fetch);\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? fetch(request, fetchOptions) : fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, config ? config.env : null);\n\n const {fetch, Request, Response} = env;\n\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n", "import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n", "'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n", "'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n", "'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n", "'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n", "'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n", "const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n", "'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n", "import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport {\n pulseBundleRequestSchema,\n pulseBundleResponseSchema,\n pulseInsightBundleTypeEnum,\n pulseMetricDefinitionSchema,\n pulseMetricDefinitionViewEnum,\n pulseMetricSchema,\n pulseMetricSubscriptionSchema,\n} from '../types/pulse.js';\n\nconst listAllPulseMetricDefinitionsRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions',\n alias: 'listAllPulseMetricDefinitions',\n description: 'Returns a list of all published Pulse Metric Definitions on the specified site.',\n parameters: [\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n }),\n});\n\nconst listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/definitions%3AbatchGet',\n alias: 'listPulseMetricDefinitionsFromMetricDefinitionIds',\n description:\n 'Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.',\n parameters: [\n {\n name: 'definition_ids',\n type: 'Body',\n schema: z.object({ definition_ids: z.array(z.string().nonempty()).min(1) }),\n description: 'A list of metric definition IDs to retrieve.',\n },\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n }),\n});\n\nconst listPulseMetricsFromMetricDefinitionIdRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions/:pulseMetricDefinitionID/metrics',\n alias: 'listPulseMetricsFromMetricDefinitionId',\n description: 'Returns a list of published Pulse Metrics for a specific Pulse Metric Definition.',\n parameters: [\n {\n name: 'pulseMetricDefinitionID',\n type: 'Path',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n total_available: z.number(),\n }),\n});\n\nconst listPulseMetricsFromMetricIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/metrics%3AbatchGet',\n alias: 'listPulseMetricsFromMetricIds',\n description: 'Returns a list of Pulse Metrics for a list of metric IDs.',\n parameters: [\n {\n name: 'metric_ids',\n type: 'Body',\n schema: z.object({ metric_ids: z.array(z.string().nonempty()) }),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n }),\n});\n\nconst listPulseMetricSubscriptionsForCurrentUserRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/subscriptions',\n alias: 'listPulseMetricSubscriptionsForCurrentUser',\n description: 'Returns a list of Pulse Subscriptions for the current user.',\n parameters: [\n {\n name: 'user_id',\n type: 'Query',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n subscriptions: z.array(pulseMetricSubscriptionSchema),\n }),\n});\n\nconst generatePulseMetricValueInsightBundleRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/insights/:bundle_type',\n alias: 'generatePulseMetricValueInsightBundle',\n description: 'Generates a bundle for the current aggregated value for the Pulse metric.',\n parameters: [\n {\n name: 'bundle_request',\n type: 'Body',\n schema: pulseBundleRequestSchema,\n },\n {\n name: 'bundle_type',\n type: 'Path',\n schema: z.enum(pulseInsightBundleTypeEnum),\n },\n ],\n response: pulseBundleResponseSchema,\n});\n\nconst pulseApi = makeApi([\n generatePulseMetricValueInsightBundleRestEndpoint,\n listAllPulseMetricDefinitionsRestEndpoint,\n listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint,\n listPulseMetricsFromMetricDefinitionIdRestEndpoint,\n listPulseMetricSubscriptionsForCurrentUserRestEndpoint,\n listPulseMetricsFromMetricIdsRestEndpoint,\n]);\nexport const pulseApis = [...pulseApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst pulseMetadataSchema = z.object({\n name: z.string(),\n description: z.string(),\n id: z.string(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n definition_version: z.coerce.number(),\n last_updated_user: z.object({ id: z.string() }).optional(),\n});\n\nconst pulseDatasourceSchema = z.object({\n id: z.string(),\n});\n\nconst pulseFilterSchema = z.object({\n field: z.string(),\n operator: z.string(),\n categorical_values: z.array(\n z.object({\n string_value: z.string().optional(),\n bool_value: z.boolean().optional(),\n null_value: z.string().optional(),\n }),\n ),\n});\n\nconst pulseBasicSpecificationSchema = z.object({\n measure: z.object({ field: z.string(), aggregation: z.string() }),\n time_dimension: z.object({ field: z.string() }),\n filters: z.array(pulseFilterSchema),\n});\n\nconst pulseSpecificationSchema = z.object({\n datasource: pulseDatasourceSchema,\n basic_specification: pulseBasicSpecificationSchema,\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n is_running_total: z.boolean(),\n});\n\nexport const pulseExtensionOptionsSchema = z.object({\n allowed_dimensions: z.array(z.string()),\n allowed_granularities: z.array(z.string()),\n offset_from_today: z.number(),\n});\n\nexport const pulseMetricSpecificationSchema = z.object({\n filters: z.array(pulseFilterSchema),\n measurement_period: z.object({\n granularity: z.string(),\n range: z.string(),\n }),\n comparison: z.object({ comparison: z.string() }),\n});\n\nexport const pulseGoalsSchema = z.object({\n target: z.object({ value: z.number() }).optional(),\n});\n\nexport const pulseMetricSchema = z.object({\n id: z.string(),\n specification: pulseMetricSpecificationSchema,\n definition_id: z.string(),\n is_default: z.boolean(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n goals: pulseGoalsSchema.optional(),\n is_followed: z.boolean(),\n});\n\nexport const pulseRepresentationOptionsSchema = z.object({\n type: z.string(),\n number_units: z.object({\n singular_noun: z.string(),\n plural_noun: z.string(),\n }),\n sentiment_type: z.string(),\n row_level_id_field: z.object({ identifier_col: z.string() }),\n row_level_entity_names: z.object({\n entity_name_singular: z.string().optional(),\n entity_name_plural: z.string().optional(),\n }),\n row_level_name_field: z.object({ name_col: z.string() }),\n currency_code: z.string(),\n});\n\nexport const insightOptionsSchema = z.object({\n settings: z.array(z.object({ type: z.string(), disabled: z.boolean() })),\n});\n\nexport const comparisonSchema = z.object({\n comparisons: z.array(\n z.object({\n compare_config: z.object({ comparison: z.string() }),\n index: z.coerce.number(),\n }),\n ),\n});\n\nexport const datasourceGoalsSchema = z.array(\n z.object({\n basic_specification: pulseBasicSpecificationSchema,\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n minimum_granularity: z.string(),\n }),\n);\n\nexport const pulseMetricDefinitionSchema = z.object({\n metadata: pulseMetadataSchema,\n specification: pulseSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n metrics: z.array(pulseMetricSchema),\n total_metrics: z.coerce.number(),\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n comparisons: comparisonSchema,\n datasource_goals: datasourceGoalsSchema,\n});\n\nexport const pulseMetricSubscriptionSchema = z.object({\n id: z.string(),\n metric_id: z.string(),\n});\n\nexport const languageEnumSchema = z.enum([\n 'LANGUAGE_UNSPECIFIED',\n 'LANGUAGE_DE_DE',\n 'LANGUAGE_EN_US',\n 'LANGUAGE_EN_GB',\n 'LANGUAGE_ES_ES',\n 'LANGUAGE_FR_FR',\n 'LANGUAGE_FR_CA',\n 'LANGUAGE_GA_IE',\n 'LANGUAGE_IT_IT',\n 'LANGUAGE_JA_JP',\n 'LANGUAGE_KO_KR',\n 'LANGUAGE_NL_NL',\n 'LANGUAGE_PT_BR',\n 'LANGUAGE_SV_SE',\n 'LANGUAGE_TH_TH',\n 'LANGUAGE_ZH_CN',\n 'LANGUAGE_ZH_TW',\n]);\nexport type LanguageEnumType = z.infer<typeof languageEnumSchema>;\n\nexport const localeEnumSchema = z.enum([\n 'LOCALE_UNSPECIFIED',\n 'LOCALE_AR_AE',\n 'LOCALE_AR_BH',\n 'LOCALE_AR_DZ',\n 'LOCALE_AR_EG',\n 'LOCALE_AR_IQ',\n 'LOCALE_AR_JO',\n 'LOCALE_AR_KW',\n 'LOCALE_AR_LB',\n 'LOCALE_AR_LY',\n 'LOCALE_AR_MA',\n 'LOCALE_AR_OM',\n 'LOCALE_AR_QA',\n 'LOCALE_AR_SA',\n 'LOCALE_AR_SD',\n 'LOCALE_AR_SY',\n 'LOCALE_AR_TN',\n 'LOCALE_AR_YE',\n 'LOCALE_BE_BY',\n 'LOCALE_BG_BG',\n 'LOCALE_CA_ES',\n 'LOCALE_CS_CZ',\n 'LOCALE_DA_DK',\n 'LOCALE_DE_AT',\n 'LOCALE_DE_CH',\n 'LOCALE_DE_DE',\n 'LOCALE_DE_LU',\n 'LOCALE_EL_CY',\n 'LOCALE_EL_GR',\n 'LOCALE_EN_AU',\n 'LOCALE_EN_CA',\n 'LOCALE_EN_GB',\n 'LOCALE_EN_IE',\n 'LOCALE_EN_IN',\n 'LOCALE_EN_MT',\n 'LOCALE_EN_NZ',\n 'LOCALE_EN_PH',\n 'LOCALE_EN_SG',\n 'LOCALE_EN_US',\n 'LOCALE_EN_ZA',\n 'LOCALE_ES_AR',\n 'LOCALE_ES_BO',\n 'LOCALE_ES_CL',\n 'LOCALE_ES_CO',\n 'LOCALE_ES_CR',\n 'LOCALE_ES_DO',\n 'LOCALE_ES_EC',\n 'LOCALE_ES_ES',\n 'LOCALE_ES_GT',\n 'LOCALE_ES_HN',\n 'LOCALE_ES_MX',\n 'LOCALE_ES_NI',\n 'LOCALE_ES_PA',\n 'LOCALE_ES_PE',\n 'LOCALE_ES_PR',\n 'LOCALE_ES_PY',\n 'LOCALE_ES_SV',\n 'LOCALE_ES_US',\n 'LOCALE_ES_UY',\n 'LOCALE_ES_VE',\n 'LOCALE_ET_EE',\n 'LOCALE_FI_FI',\n 'LOCALE_FR_BE',\n 'LOCALE_FR_CA',\n 'LOCALE_FR_CH',\n 'LOCALE_FR_FR',\n 'LOCALE_FR_LU',\n 'LOCALE_GA_IE',\n 'LOCALE_HE_IL',\n 'LOCALE_HI_IN',\n 'LOCALE_HR_HR',\n 'LOCALE_HU_HU',\n 'LOCALE_ID_ID',\n 'LOCALE_IN_ID',\n 'LOCALE_IS_IS',\n 'LOCALE_IT_CH',\n 'LOCALE_IT_IT',\n 'LOCALE_IW_IL',\n 'LOCALE_JA_JP',\n 'LOCALE_KO_KR',\n 'LOCALE_LT_LT',\n 'LOCALE_LV_LV',\n 'LOCALE_MK_MK',\n 'LOCALE_MS_MY',\n 'LOCALE_MT_MT',\n 'LOCALE_NL_BE',\n 'LOCALE_NL_NL',\n 'LOCALE_NB_NO',\n 'LOCALE_NO_NO',\n 'LOCALE_PL_PL',\n 'LOCALE_PT_BR',\n 'LOCALE_PT_PT',\n 'LOCALE_RO_RO',\n 'LOCALE_RU_RU',\n 'LOCALE_SK_SK',\n 'LOCALE_SL_SI',\n 'LOCALE_SQ_AL',\n 'LOCALE_SR_BA',\n 'LOCALE_SR_ME',\n 'LOCALE_SR_RS',\n 'LOCALE_SV_SE',\n 'LOCALE_TH_TH',\n 'LOCALE_TR_TR',\n 'LOCALE_UK_UA',\n 'LOCALE_VI_VN',\n 'LOCALE_ZH_CN',\n 'LOCALE_ZH_HK',\n 'LOCALE_ZH_SG',\n 'LOCALE_ZH_TW',\n]);\nexport type LocaleEnumType = z.infer<typeof localeEnumSchema>;\n\nexport const outputFormatEnumSchema = z.enum([\n 'OUTPUT_FORMAT_UNSPECIFIED',\n 'OUTPUT_FORMAT_HTML',\n 'OUTPUT_FORMAT_TEXT',\n]);\nexport type OutputFormatEnumType = z.infer<typeof outputFormatEnumSchema>;\n\nexport const pulseBundleRequestSchema = z.object({\n bundle_request: z.object({\n version: z.number(),\n options: z.object({\n output_format: outputFormatEnumSchema,\n time_zone: z.string(),\n language: languageEnumSchema,\n locale: localeEnumSchema,\n }),\n input: z.object({\n metadata: z.object({\n name: z.string().nonempty(),\n metric_id: z.string().nonempty(),\n definition_id: z.string().nonempty(),\n }),\n metric: z.object({\n definition: z.object({\n datasource: z.object({\n id: z.string(),\n }),\n basic_specification: pulseBasicSpecificationSchema,\n is_running_total: z.boolean(),\n }),\n metric_specification: pulseMetricSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n goals: pulseGoalsSchema.optional(),\n }),\n }),\n }),\n});\n\nexport const popcBanInsightGroupSchema = z.object({\n type: z.string(),\n insights: z.array(\n z.object({\n result: z.object({\n type: z.string(),\n version: z.number(),\n content: z.string().optional(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n facts: z.any().optional(),\n characterization: z.string().optional(),\n question: z.string(),\n score: z.number(),\n }),\n insight_type: z.string(),\n }),\n ),\n summaries: z.array(\n z.object({\n result: z.object({\n id: z.string(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n generation_id: z.string(),\n timestamp: z.string().optional(),\n last_attempted_timestamp: z.string().optional(),\n }),\n }),\n ),\n});\n\nexport const pulseBundleResponseSchema = z.object({\n bundle_response: z.object({\n result: z.object({\n insight_groups: z.array(popcBanInsightGroupSchema),\n has_errors: z.boolean(),\n characterization: z.string(),\n }),\n }),\n});\n\nexport const pulseInsightBundleTypeEnum = ['ban', 'springboard', 'basic', 'detail'] as const;\nexport type PulseInsightBundleType = (typeof pulseInsightBundleTypeEnum)[number];\n\nexport const pulseMetricDefinitionViewEnum = [\n 'DEFINITION_VIEW_BASIC',\n 'DEFINITION_VIEW_FULL',\n 'DEFINITION_VIEW_DEFAULT',\n] as const;\nexport type PulseMetricDefinitionView = (typeof pulseMetricDefinitionViewEnum)[number];\n\nexport type PulseMetricDefinition = z.infer<typeof pulseMetricDefinitionSchema>;\nexport type PulseMetric = z.infer<typeof pulseMetricSchema>;\nexport type PulseMetricSubscription = z.infer<typeof pulseMetricSubscriptionSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { viewsApis } from '../apis/viewsApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { View } from '../types/view.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Views methods of the Tableau Server REST API\n *\n * @export\n * @class ViewsMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class ViewsMethods extends AuthenticatedMethods<typeof viewsApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, viewsApis), creds);\n }\n\n /**\n * Returns a specified view rendered as data in comma separated value (CSV) format.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_data\n */\n queryViewData = async ({\n viewId,\n siteId,\n }: {\n viewId: string;\n siteId: string;\n }): Promise<string> => {\n return await this._apiClient.queryViewData({\n params: { siteId, viewId },\n ...this.authHeader,\n });\n };\n\n /**\n * Returns an image of the specified view.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @param {number} width - (Optional) The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.\n * @param {number} height - (Optional) The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.\n * @param {string} resolution - (Optional) The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_image\n */\n queryViewImage = async ({\n viewId,\n siteId,\n width,\n height,\n resolution,\n }: {\n viewId: string;\n siteId: string;\n width?: number;\n height?: number;\n resolution?: 'high';\n }): Promise<string> => {\n return await this._apiClient.queryViewImage({\n params: { siteId, viewId },\n queries: { vizWidth: width, vizHeight: height, resolution },\n ...this.authHeader,\n responseType: 'arraybuffer',\n });\n };\n\n /**\n * Returns all the views for the specified workbook, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return views for.\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_workbook\n */\n queryViewsForWorkbook = async ({\n workbookId,\n siteId,\n includeUsageStatistics,\n }: {\n workbookId: string;\n siteId: string;\n includeUsageStatistics?: boolean;\n }): Promise<View[]> => {\n return (\n await this._apiClient.queryViewsForWorkbook({\n params: { siteId, workbookId },\n queries: { includeUsageStatistics },\n ...this.authHeader,\n })\n ).views.view;\n };\n\n /**\n * Returns all the views for the specified site, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @param {string} filter - (Optional) Fields and operators that you can use to filter results\n * @param {number} pageSize - (Optional) The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param {number} pageNumber - (Optional) The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_site\n */\n queryViewsForSite = async ({\n siteId,\n includeUsageStatistics,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n includeUsageStatistics?: boolean;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; views: View[] }> => {\n const response = await this._apiClient.queryViewsForSite({\n params: { siteId },\n queries: { includeUsageStatistics, filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n views: response.views.view ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { viewSchema } from '../types/view.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst queryViewDataEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/views/:viewId/data`,\n alias: 'queryViewData',\n description: 'Returns a specified view rendered as data in comma separated value (CSV) format.',\n response: z.string(),\n});\n\nconst queryViewImageEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/views/:viewId/image`,\n alias: 'queryViewImage',\n description: 'Returns an image of the specified view.',\n parameters: [\n {\n name: 'vizWidth',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.',\n },\n {\n name: 'vizHeight',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.',\n },\n {\n name: 'resolution',\n type: 'Query',\n schema: z.literal('high').optional(),\n description:\n 'The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.',\n },\n ],\n response: z.string(),\n});\n\nconst queryViewsForWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/workbooks/:workbookId/views`,\n alias: 'queryViewsForWorkbook',\n description:\n 'Returns all the views for the specified workbook, optionally including usage statistics.',\n parameters: [\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n ],\n response: z.object({ views: z.object({ view: z.array(viewSchema) }) }),\n});\n\nconst queryViewsForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/views`,\n alias: 'queryViewsForSite',\n description:\n 'Returns all the views for the specified site, optionally including usage statistics.',\n parameters: [\n ...paginationParameters,\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of views to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n views: z.object({ view: z.array(viewSchema).optional() }),\n }),\n});\n\nconst viewsApi = makeApi([\n queryViewDataEndpoint,\n queryViewImageEndpoint,\n queryViewsForWorkbookEndpoint,\n queryViewsForSiteEndpoint,\n]);\n\nexport const viewsApis = [...viewsApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const viewSchema = z.object({\n id: z.string(),\n name: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n workbook: z\n .object({\n id: z.string(),\n })\n .optional(),\n owner: z\n .object({\n id: z.string(),\n })\n .optional(),\n project: z\n .object({\n id: z.string(),\n })\n .optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n usage: z\n .object({\n totalViewCount: z.coerce.number(),\n })\n .optional(),\n});\n\nexport type View = z.infer<typeof viewSchema>;\n", "import { isErrorFromAlias, Zodios, ZodiosError } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport {\n MetadataResponse,\n QueryOutput,\n QueryRequest,\n ReadMetadataRequest,\n TableauError,\n vizqlDataServiceApis,\n} from '../apis/vizqlDataServiceApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * The VizQL Data Service (VDS) provides a programmatic way for you to access your published data outside of a Tableau visualization.\n *\n * @export\n * @class VizqlDataServiceMethods\n * @extends {AuthenticatedMethods<typeof vizqlDataServiceApis>}\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/index.html\n */\nexport default class VizqlDataServiceMethods extends AuthenticatedMethods<\n typeof vizqlDataServiceApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, vizqlDataServiceApis), creds);\n }\n\n /**\n * Queries a specific data source and returns the resulting data.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {z.infer<typeof QueryRequest>} queryRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/QueryDatasource\n */\n queryDatasource = async (\n queryRequest: z.infer<typeof QueryRequest>,\n ): Promise<Result<QueryOutput, 'feature-disabled' | TableauError | ZodiosError>> => {\n try {\n return Ok(await this._apiClient.queryDatasource(queryRequest, { ...this.authHeader }));\n } catch (error) {\n if (isErrorFromAlias(this._apiClient.api, 'queryDatasource', error)) {\n if (error.response.status === 404) {\n return Err('feature-disabled');\n }\n\n return Err(error.response.data);\n }\n\n if (error instanceof ZodiosError) {\n return Err(error);\n }\n\n throw error;\n }\n };\n\n /**\n * Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {z.infer<typeof ReadMetadataRequest>} readMetadataRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/ReadMetadata\n */\n readMetadata = async (\n readMetadataRequest: z.infer<typeof ReadMetadataRequest>,\n ): Promise<Result<MetadataResponse, 'feature-disabled'>> => {\n try {\n return Ok(await this._apiClient.readMetadata(readMetadataRequest, { ...this.authHeader }));\n } catch (error) {\n if (\n isErrorFromAlias(this._apiClient.api, 'readMetadata', error) &&\n error.response.status === 404\n ) {\n return Err('feature-disabled');\n }\n\n throw error;\n }\n };\n}\n", "import { makeApi, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nconst Connection = z.object({\n connectionLuid: z.string().optional(),\n connectionUsername: z.string(),\n connectionPassword: z.string(),\n});\n\nexport const Datasource = z.object({\n datasourceLuid: z.string().nonempty(),\n connections: z.array(Connection).optional(),\n});\n\nconst ReturnFormat = z.enum(['OBJECTS', 'ARRAYS']);\n\nconst QueryOptions = z\n .object({\n returnFormat: ReturnFormat,\n debug: z.boolean().default(false),\n })\n .partial()\n .passthrough();\n\nexport const ReadMetadataRequest = z\n .object({\n datasource: Datasource,\n options: QueryOptions.optional(),\n })\n .passthrough();\n\nexport const Function = z.enum([\n 'SUM',\n 'AVG',\n 'MEDIAN',\n 'COUNT',\n 'COUNTD',\n 'MIN',\n 'MAX',\n 'STDEV',\n 'VAR',\n 'COLLECT',\n 'YEAR',\n 'QUARTER',\n 'MONTH',\n 'WEEK',\n 'DAY',\n 'TRUNC_YEAR',\n 'TRUNC_QUARTER',\n 'TRUNC_MONTH',\n 'TRUNC_WEEK',\n 'TRUNC_DAY',\n 'AGG',\n 'NONE',\n 'UNSPECIFIED',\n]);\n\nconst DataType = z.enum([\n 'INTEGER',\n 'REAL',\n 'STRING',\n 'DATETIME',\n 'BOOLEAN',\n 'DATE',\n 'SPATIAL',\n 'UNKNOWN',\n]);\n\nconst PeriodType = z.enum(['MINUTES', 'HOURS', 'DAYS', 'WEEKS', 'MONTHS', 'QUARTERS', 'YEARS']);\n\nconst FieldMetadata = z\n .object({\n fieldName: z.string(),\n fieldCaption: z.string(),\n dataType: DataType,\n defaultAggregation: Function,\n columnClass: z.enum(['COLUMN', 'BIN', 'GROUP', 'CALCULATION', 'TABLE_CALCULATION']),\n formula: z.string(),\n logicalTableId: z.string(),\n })\n .partial()\n .passthrough();\n\nconst ParameterValue = z.union([z.number(), z.string(), z.boolean(), z.null()]);\n\nconst ParameterBase = z.object({\n parameterCaption: z.string(),\n dataType: DataType.exclude(['DATETIME', 'SPATIAL', 'UNKNOWN']),\n parameterName: z.string().optional(),\n value: ParameterValue,\n});\n\nconst Parameter = z.discriminatedUnion('parameterType', [\n ParameterBase.extend({ parameterType: z.literal('ANY_VALUE') }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('LIST'),\n members: z.array(ParameterValue),\n }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('QUANTITATIVE_DATE'),\n value: z.string().nullable(),\n minDate: z.string().nullish(),\n maxDate: z.string().nullish(),\n periodValue: z.number().nullish(),\n periodType: PeriodType.nullish(),\n }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('QUANTITATIVE_RANGE'),\n value: z.number().nullable(),\n min: z.number().nullish(),\n max: z.number().nullish(),\n step: z.number().nullish(),\n }).strict(),\n]);\n\nexport const MetadataOutput = z\n .object({\n data: z.array(FieldMetadata),\n extraData: z.object({\n parameters: z.array(Parameter),\n }),\n })\n .partial()\n .passthrough();\n\nexport type FieldMetadata = z.infer<typeof FieldMetadata>;\nexport type MetadataResponse = z.infer<typeof MetadataOutput>;\n\nexport const TableauError = z\n .object({\n errorCode: z.string(),\n message: z.string(),\n datetime: z.string().datetime({ offset: true }),\n debug: z.object({}).partial().passthrough(),\n 'tab-error-code': z.string(),\n })\n .partial()\n .passthrough();\n\nexport type TableauError = z.infer<typeof TableauError>;\n\nconst SortDirection = z.enum(['ASC', 'DESC']);\n\nconst FieldBase = z.object({\n fieldCaption: z.string(),\n fieldAlias: z.string().optional(),\n maxDecimalPlaces: z.number().int().optional(),\n sortDirection: SortDirection.optional(),\n sortPriority: z.number().int().optional(),\n});\n\nexport const Field = z.union([\n FieldBase.strict(),\n FieldBase.extend({ function: Function }).strict(),\n FieldBase.extend({ calculation: z.string() }).strict(),\n]);\n\nexport const FilterField = z.union([\n z.object({ fieldCaption: z.string() }).strict(),\n z.object({ fieldCaption: z.string(), function: Function }).strict(),\n z.object({ calculation: z.string() }).strict(),\n]);\n\nconst FilterBase = z.object({\n field: FilterField,\n context: z.boolean().optional(),\n});\n\nconst SimpleFilterBase = z.object({\n field: z.object({ fieldCaption: z.string() }).strict(),\n context: z.boolean().optional(),\n});\n\nexport const SetFilter = SimpleFilterBase.extend({\n filterType: z.literal('SET'),\n values: z.union([z.array(z.string()), z.array(z.number()), z.array(z.boolean())]),\n exclude: z.boolean().optional(),\n});\n\nconst RelativeDateFilterBase = SimpleFilterBase.extend({\n filterType: z.literal('DATE'),\n periodType: PeriodType,\n anchorDate: z.string().optional(),\n includeNulls: z.boolean().optional(),\n});\n\nconst RelativeDateFilter = z.discriminatedUnion('dateRangeType', [\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('CURRENT') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('LAST') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('NEXT') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('TODATE') }).strict(),\n RelativeDateFilterBase.extend({\n dateRangeType: z.literal('LASTN'),\n rangeN: z.number().int(),\n }).strict(),\n RelativeDateFilterBase.extend({\n dateRangeType: z.literal('NEXTN'),\n rangeN: z.number().int(),\n }).strict(),\n]);\n\nconst MatchFilterBase = SimpleFilterBase.extend({\n filterType: z.literal('MATCH'),\n startsWith: z.string().optional(),\n endsWith: z.string().optional(),\n contains: z.string().optional(),\n exclude: z.boolean().optional(),\n});\n\nexport const MatchFilter = z.union([\n MatchFilterBase.extend({ startsWith: z.string() }).strict(),\n MatchFilterBase.extend({ endsWith: z.string() }).strict(),\n MatchFilterBase.extend({ contains: z.string() }).strict(),\n]);\n\nconst QuantitativeNumericalFilterBase = FilterBase.extend({\n filterType: z.literal('QUANTITATIVE_NUMERICAL'),\n});\n\nconst QuantitativeNumericalFilter = z.discriminatedUnion('quantitativeFilterType', [\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('RANGE'),\n min: z.number(),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('MIN'),\n min: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('MAX'),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n }).strict(),\n]);\n\nconst QuantitativeDateFilterBase = FilterBase.extend({\n filterType: z.literal('QUANTITATIVE_DATE'),\n});\n\nconst QuantitativeDateFilter = z.discriminatedUnion('quantitativeFilterType', [\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('RANGE'),\n minDate: z.string(),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('MIN'),\n minDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('MAX'),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n }).strict(),\n]);\n\nexport const TopNFilter = FilterBase.extend({\n filterType: z.literal('TOP'),\n howMany: z.number().int(),\n fieldToMeasure: FilterField,\n direction: z.enum(['TOP', 'BOTTOM']).optional().default('TOP'),\n});\n\nexport const Filter = z.union([\n SetFilter.strict(),\n TopNFilter.strict(),\n ...MatchFilter.options,\n ...QuantitativeNumericalFilter.options,\n ...QuantitativeDateFilter.options,\n ...RelativeDateFilter.options,\n]);\n\nexport const Query = z.strictObject({\n fields: z.array(Field),\n filters: z.array(Filter).optional(),\n});\n\nconst QueryDatasourceOptions = QueryOptions.and(\n z\n .object({\n disaggregate: z.boolean(),\n })\n .partial()\n .passthrough(),\n);\n\nexport const QueryRequest = z\n .object({\n datasource: Datasource,\n query: Query,\n options: QueryDatasourceOptions.optional(),\n })\n .passthrough();\n\nexport const QueryOutput = z\n .object({\n data: z.array(z.unknown()),\n })\n .partial()\n .passthrough();\n\nexport type QueryOutput = z.infer<typeof QueryOutput>;\n\nconst vizqlDataServiceApi = makeApi([\n {\n method: 'post',\n path: '/query-datasource',\n alias: 'queryDatasource',\n description: `Queries a specific data source and returns the resulting data.`,\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: QueryRequest,\n },\n ],\n response: QueryOutput,\n errors: [\n {\n status: 'default',\n schema: TableauError,\n },\n {\n status: 404,\n schema: z.any(),\n },\n ],\n },\n {\n method: 'post',\n path: '/read-metadata',\n alias: 'readMetadata',\n description: `Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.`,\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: ReadMetadataRequest,\n },\n ],\n response: MetadataOutput,\n errors: [\n {\n status: 404,\n schema: z.any(),\n },\n ],\n },\n {\n method: 'get',\n path: '/simple-request',\n alias: 'simpleRequest',\n description: `Sends a request that can be used for testing or doing a health check.`,\n requestFormat: 'json',\n response: z.string(),\n },\n]);\n\nexport const vizqlDataServiceApis = [\n ...vizqlDataServiceApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\n\nimport { workbooksApis } from '../apis/workbooksApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { Workbook } from '../types/workbook.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Workbooks methods of the Tableau Server REST API\n *\n * @export\n * @class WorkbooksMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class WorkbooksMethods extends AuthenticatedMethods<typeof workbooksApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, workbooksApis), creds);\n }\n\n /**\n * Returns information about the specified workbook, including information about views and tags.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return information for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbook\n */\n getWorkbook = async ({\n workbookId,\n siteId,\n }: {\n workbookId: string;\n siteId: string;\n }): Promise<Workbook> => {\n return (\n await this._apiClient.getWorkbook({\n params: { siteId, workbookId },\n ...this.authHeader,\n })\n ).workbook;\n };\n\n /**\n * Returns the workbooks on a site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter workbooks by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbooks_for_site\n */\n queryWorkbooksForSite = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; workbooks: Workbook[] }> => {\n const response = await this._apiClient.queryWorkbooksForSite({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n workbooks: response.workbooks.workbook ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { workbookSchema } from '../types/workbook.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst getWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/workbooks/:workbookId`,\n alias: 'getWorkbook',\n description:\n 'Returns information about the specified workbook, including information about views and tags.',\n response: z.object({ workbook: workbookSchema }),\n});\n\nconst queryWorkbooksForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: `/sites/:siteId/workbooks`,\n alias: 'queryWorkbooksForSite',\n description: 'Returns the workbooks on a site.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of workbooks to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n workbooks: z.object({\n workbook: z.optional(z.array(workbookSchema)),\n }),\n }),\n});\n\nconst workbooksApi = makeApi([queryWorkbooksForSiteEndpoint, getWorkbookEndpoint]);\n\nexport const workbooksApis = [...workbooksApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\nimport { viewSchema } from './view.js';\n\nexport const workbookSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n webpageUrl: z.string().optional(),\n contentUrl: z.string(),\n project: projectSchema.optional(),\n showTabs: z.coerce.boolean(),\n defaultViewId: z.string().optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n views: z.optional(\n z.object({\n view: z.array(viewSchema),\n }),\n ),\n});\n\nexport type Workbook = z.infer<typeof workbookSchema>;\n", "import { AuthConfig } from './authConfig.js';\nimport {\n AxiosInterceptor,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n ResponseInterceptor,\n} from './interceptors.js';\nimport AuthenticationMethods, {\n AuthenticatedAuthenticationMethods,\n} from './methods/authenticationMethods.js';\nimport ContentExplorationMethods from './methods/contentExplorationMethods.js';\nimport DatasourcesMethods from './methods/datasourcesMethods.js';\nimport MetadataMethods from './methods/metadataMethods.js';\nimport PulseMethods from './methods/pulseMethods.js';\nimport ViewsMethods from './methods/viewsMethods.js';\nimport VizqlDataServiceMethods from './methods/vizqlDataServiceMethods.js';\nimport WorkbooksMethods from './methods/workbooksMethods.js';\nimport { Credentials } from './types/credentials.js';\n\n/**\n * Interface for the Tableau REST APIs\n *\n * @export\n * @class RestApi\n */\nexport default class RestApi {\n private _creds?: Credentials;\n private readonly _host: string;\n private readonly _baseUrl: string;\n private readonly _baseUrlWithoutVersion: string;\n\n private _authenticationMethods?: AuthenticationMethods;\n private _authenticatedAuthenticationMethods?: AuthenticatedAuthenticationMethods;\n private _contentExplorationMethods?: ContentExplorationMethods;\n private _datasourcesMethods?: DatasourcesMethods;\n private _metadataMethods?: MetadataMethods;\n private _pulseMethods?: PulseMethods;\n private _vizqlDataServiceMethods?: VizqlDataServiceMethods;\n private _viewsMethods?: ViewsMethods;\n private _workbooksMethods?: WorkbooksMethods;\n private static _version = '3.24';\n\n private _requestInterceptor?: [RequestInterceptor, ErrorInterceptor?];\n private _responseInterceptor?: [ResponseInterceptor, ErrorInterceptor?];\n\n constructor(\n host: string,\n options?: Partial<{\n requestInterceptor: [RequestInterceptor, ErrorInterceptor?];\n responseInterceptor: [ResponseInterceptor, ErrorInterceptor?];\n }>,\n ) {\n this._host = host;\n this._baseUrl = `${this._host}/api/${RestApi._version}`;\n this._baseUrlWithoutVersion = `${this._host}/api/-`;\n this._requestInterceptor = options?.requestInterceptor;\n this._responseInterceptor = options?.responseInterceptor;\n }\n\n private get creds(): Credentials {\n if (!this._creds) {\n throw new Error('No credentials found. Authenticate by calling signIn() first.');\n }\n\n return this._creds;\n }\n\n get siteId(): string {\n return this.creds.site.id;\n }\n\n private get authenticationMethods(): AuthenticationMethods {\n if (!this._authenticationMethods) {\n this._authenticationMethods = new AuthenticationMethods(this._baseUrl);\n this._addInterceptors(this._baseUrl, this._authenticationMethods.interceptors);\n }\n return this._authenticationMethods;\n }\n\n private get authenticatedAuthenticationMethods(): AuthenticatedAuthenticationMethods {\n if (!this._authenticatedAuthenticationMethods) {\n this._authenticatedAuthenticationMethods = new AuthenticatedAuthenticationMethods(\n this._baseUrl,\n this.creds,\n );\n this._addInterceptors(this._baseUrl, this._authenticatedAuthenticationMethods.interceptors);\n }\n return this._authenticatedAuthenticationMethods;\n }\n\n get contentExplorationMethods(): ContentExplorationMethods {\n if (!this._contentExplorationMethods) {\n this._contentExplorationMethods = new ContentExplorationMethods(\n this._baseUrlWithoutVersion,\n this.creds,\n );\n this._addInterceptors(\n this._baseUrlWithoutVersion,\n this._contentExplorationMethods.interceptors,\n );\n }\n\n return this._contentExplorationMethods;\n }\n\n get datasourcesMethods(): DatasourcesMethods {\n if (!this._datasourcesMethods) {\n this._datasourcesMethods = new DatasourcesMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._datasourcesMethods.interceptors);\n }\n\n return this._datasourcesMethods;\n }\n\n get metadataMethods(): MetadataMethods {\n if (!this._metadataMethods) {\n const baseUrl = `${this._host}/api/metadata`;\n this._metadataMethods = new MetadataMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._metadataMethods.interceptors);\n }\n\n return this._metadataMethods;\n }\n\n get pulseMethods(): PulseMethods {\n if (!this._pulseMethods) {\n this._pulseMethods = new PulseMethods(this._baseUrlWithoutVersion, this.creds);\n this._addInterceptors(this._baseUrlWithoutVersion, this._pulseMethods.interceptors);\n }\n\n return this._pulseMethods;\n }\n\n get vizqlDataServiceMethods(): VizqlDataServiceMethods {\n if (!this._vizqlDataServiceMethods) {\n const baseUrl = `${this._host}/api/v1/vizql-data-service`;\n this._vizqlDataServiceMethods = new VizqlDataServiceMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._vizqlDataServiceMethods.interceptors);\n }\n\n return this._vizqlDataServiceMethods;\n }\n\n get viewsMethods(): ViewsMethods {\n if (!this._viewsMethods) {\n this._viewsMethods = new ViewsMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._viewsMethods.interceptors);\n }\n\n return this._viewsMethods;\n }\n\n get workbooksMethods(): WorkbooksMethods {\n if (!this._workbooksMethods) {\n this._workbooksMethods = new WorkbooksMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._workbooksMethods.interceptors);\n }\n\n return this._workbooksMethods;\n }\n\n signIn = async (authConfig: AuthConfig): Promise<void> => {\n this._creds = await this.authenticationMethods.signIn(authConfig);\n };\n\n signOut = async (): Promise<void> => {\n await this.authenticatedAuthenticationMethods.signOut();\n this._creds = undefined;\n };\n\n private _addInterceptors = (baseUrl: string, interceptors: AxiosInterceptor): void => {\n interceptors.request.use(\n (config) => {\n this._requestInterceptor?.[0]({\n baseUrl,\n ...getRequestInterceptorConfig(config),\n });\n return config;\n },\n (error) => {\n this._requestInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n\n interceptors.response.use(\n (response) => {\n this._responseInterceptor?.[0]({\n baseUrl,\n ...getResponseInterceptorConfig(response),\n });\n return response;\n },\n (error) => {\n this._responseInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n };\n}\n", "import { RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Config, getConfig } from './config.js';\nimport { log, shouldLogWhenLevelIsAtLeast } from './logging/log.js';\nimport { maskRequest, maskResponse } from './logging/secretMask.js';\nimport {\n AxiosResponseInterceptorConfig,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n RequestInterceptorConfig,\n ResponseInterceptor,\n ResponseInterceptorConfig,\n} from './sdks/tableau/interceptors.js';\nimport RestApi from './sdks/tableau/restApi.js';\nimport { Server } from './server.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\nimport { isAxiosError } from './utils/isAxiosError.js';\n\ntype JwtScopes =\n | 'tableau:viz_data_service:read'\n | 'tableau:content:read'\n | 'tableau:insight_definitions_metrics:read'\n | 'tableau:insight_metrics:read'\n | 'tableau:metric_subscriptions:read'\n | 'tableau:insights:read'\n | 'tableau:views:download';\n\nconst getNewRestApiInstanceAsync = async (\n config: Config,\n requestId: RequestId,\n server: Server,\n jwtScopes: Set<JwtScopes>,\n): Promise<RestApi> => {\n const restApi = new RestApi(config.server, {\n requestInterceptor: [\n getRequestInterceptor(server, requestId),\n getRequestErrorInterceptor(server, requestId),\n ],\n responseInterceptor: [\n getResponseInterceptor(server, requestId),\n getResponseErrorInterceptor(server, requestId),\n ],\n });\n\n if (config.auth === 'pat') {\n await restApi.signIn({\n type: 'pat',\n patName: config.patName,\n patValue: config.patValue,\n siteName: config.siteName,\n });\n } else if (config.auth === 'direct-trust') {\n await restApi.signIn({\n type: 'direct-trust',\n siteName: config.siteName,\n username: getJwtSubClaim(config),\n clientId: config.connectedAppClientId,\n secretId: config.connectedAppSecretId,\n secretValue: config.connectedAppSecretValue,\n scopes: jwtScopes,\n additionalPayload: getJwtAdditionalPayload(config),\n });\n }\n\n return restApi;\n};\n\nexport const useRestApi = async <T>({\n config,\n requestId,\n server,\n callback,\n jwtScopes,\n}: {\n config: Config;\n requestId: RequestId;\n server: Server;\n jwtScopes: Array<JwtScopes>;\n callback: (restApi: RestApi) => Promise<T>;\n}): Promise<T> => {\n const restApi = await getNewRestApiInstanceAsync(config, requestId, server, new Set(jwtScopes));\n try {\n return await callback(restApi);\n } finally {\n await restApi.signOut();\n }\n};\n\nexport const getRequestInterceptor =\n (server: Server, requestId: RequestId): RequestInterceptor =>\n (request) => {\n request.headers['User-Agent'] = `${server.name}/${server.version}`;\n logRequest(server, request, requestId);\n return request;\n };\n\nexport const getRequestErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.request) {\n log.error(server, `Request ${requestId} failed with error: ${getExceptionMessage(error)}`, {\n logger: 'rest-api',\n requestId,\n });\n return;\n }\n\n const { request } = error;\n logRequest(\n server,\n {\n baseUrl,\n ...getRequestInterceptorConfig(request),\n },\n requestId,\n );\n };\n\nexport const getResponseInterceptor =\n (server: Server, requestId: RequestId): ResponseInterceptor =>\n (response) => {\n logResponse(server, response, requestId);\n return response;\n };\n\nexport const getResponseErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.response) {\n log.error(\n server,\n `Response from request ${requestId} failed with error: ${getExceptionMessage(error)}`,\n { logger: 'rest-api', requestId },\n );\n return;\n }\n\n // The type for the AxiosResponse headers is complex and not directly assignable to that of the Axios response interceptor's.\n const { response } = error as { response: AxiosResponseInterceptorConfig };\n logResponse(\n server,\n {\n baseUrl,\n ...getResponseInterceptorConfig(response),\n },\n requestId,\n );\n };\n\nfunction logRequest(server: Server, request: RequestInterceptorConfig, requestId: RequestId): void {\n const config = getConfig();\n const maskedRequest = config.disableLogMasking ? request : maskRequest(request);\n const url = new URL(maskedRequest.url ?? '', maskedRequest.baseUrl);\n if (request.params && Object.keys(request.params).length > 0) {\n url.search = new URLSearchParams(request.params).toString();\n }\n\n const messageObj = {\n type: 'request',\n requestId,\n method: maskedRequest.method,\n url: url.toString(),\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedRequest.headers,\n data: maskedRequest.data,\n params: maskedRequest.params,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction logResponse(\n server: Server,\n response: ResponseInterceptorConfig,\n requestId: RequestId,\n): void {\n const config = getConfig();\n const maskedResponse = config.disableLogMasking ? response : maskResponse(response);\n const url = new URL(maskedResponse.url ?? '', maskedResponse.baseUrl);\n if (response.request?.params && Object.keys(response.request.params).length > 0) {\n url.search = new URLSearchParams(response.request.params).toString();\n }\n const messageObj = {\n type: 'response',\n requestId,\n url: url.toString(),\n status: maskedResponse.status,\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedResponse.headers,\n data: maskedResponse.data,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction getJwtSubClaim(config: Config): string {\n return config.jwtSubClaim;\n}\n\nfunction getJwtAdditionalPayload(config: Config): Record<string, unknown> {\n const json = config.jwtAdditionalPayload;\n return JSON.parse(json || '{}');\n}\n", "import { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { CallToolResult, RequestId, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Result } from 'ts-results-es';\nimport { z, ZodRawShape, ZodTypeAny } from 'zod';\nimport { fromError, isZodErrorLike } from 'zod-validation-error';\n\nimport { getToolLogMessage, log } from '../logging/log.js';\nimport { Server } from '../server.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { ToolName } from './toolName.js';\n\ntype ArgsValidator<Args extends ZodRawShape | undefined = undefined> = Args extends ZodRawShape\n ? (args: z.objectOutputType<Args, ZodTypeAny>) => void\n : never;\n\n/**\n * The parameters for creating a tool instance\n *\n * @typeParam Args - The schema of the tool's parameters\n */\nexport type ToolParams<Args extends ZodRawShape | undefined = undefined> = {\n // The MCP server instance\n server: Server;\n\n // The name of the tool\n name: ToolName;\n\n // The description of the tool\n description: string;\n\n // The schema of the tool's parameters\n paramsSchema: Args;\n\n // The annotations of the tool\n annotations: ToolAnnotations;\n\n // A function that validates the tool's arguments provided by the client\n argsValidator?: ArgsValidator<Args>;\n\n // The implementation of the tool itself\n callback: ToolCallback<Args>;\n};\n\n/**\n * The parameters the logAndExecute method\n *\n * @typeParam T - The type of the result the tool's implementation returns\n * @typeParam E - The type of the error the tool's implementation can return\n * @typeParam Args - The schema of the tool's parameters\n */\ntype LogAndExecuteParams<T, E, Args extends ZodRawShape | undefined = undefined> = {\n // The request ID of the tool call\n requestId: RequestId;\n\n // The arguments of the tool call\n args: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;\n\n // A function that contains the business logic of the tool to be logged and executed\n callback: () => Promise<Result<T, E | ZodiosError>>;\n\n // A function that can transform a successful result of the callback into a CallToolResult\n getSuccessResult?: (result: T) => CallToolResult;\n\n // A function that can transform an error result of the callback into a string.\n // Required if the callback can return an error result.\n getErrorText?: (error: E) => string;\n};\n\n/**\n * Represents an MCP tool\n *\n * @template Args - The schema of the tool's parameters or undefined if the tool has no parameters\n */\nexport class Tool<Args extends ZodRawShape | undefined = undefined> {\n server: Server;\n name: ToolName;\n description: string;\n paramsSchema: Args;\n annotations: ToolAnnotations;\n argsValidator?: ArgsValidator<Args>;\n callback: ToolCallback<Args>;\n\n constructor({\n server,\n name,\n description,\n paramsSchema,\n annotations,\n argsValidator,\n callback,\n }: ToolParams<Args>) {\n this.server = server;\n this.name = name;\n this.description = description;\n this.paramsSchema = paramsSchema;\n this.annotations = annotations;\n this.argsValidator = argsValidator;\n this.callback = callback;\n }\n\n logInvocation({ requestId, args }: { requestId: RequestId; args: unknown }): void {\n log.debug(this.server, getToolLogMessage({ requestId, toolName: this.name, args }));\n }\n\n // Overload for E = undefined (getErrorText omitted)\n async logAndExecute<T>(\n params: Omit<LogAndExecuteParams<T, undefined, Args>, 'getErrorText'>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getSuccessResult omitted)\n async logAndExecute<T, E>(\n params: Required<Omit<LogAndExecuteParams<T, E, Args>, 'getSuccessResult'>>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getErrorText required)\n async logAndExecute<T, E>(\n params: Required<LogAndExecuteParams<T, E, Args>>,\n ): Promise<CallToolResult>;\n\n // Implementation\n async logAndExecute<T, E>({\n requestId,\n args,\n callback,\n getSuccessResult,\n getErrorText,\n }: LogAndExecuteParams<T, E, Args>): Promise<CallToolResult> {\n this.logInvocation({ requestId, args });\n\n if (args) {\n try {\n this.argsValidator?.(args);\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n\n try {\n const result = await callback();\n\n if (result.isOk()) {\n if (getSuccessResult) {\n return getSuccessResult(result.value);\n }\n\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify(result.value),\n },\n ],\n };\n }\n\n if (result.error instanceof ZodiosError) {\n return getErrorResult(requestId, result.error);\n }\n\n if (getErrorText) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: getErrorText(result.error),\n },\n ],\n };\n } else {\n return getErrorResult(requestId, result.error);\n }\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n}\n\nfunction getErrorResult(requestId: RequestId, error: unknown): CallToolResult {\n if (error instanceof ZodiosError && isZodErrorLike(error.cause)) {\n // Schema validation errors on otherwise successful API calls will not return an \"error\" result to the MCP client.\n // We instead return the full response from the API with a data quality warning message\n // that mentions why the schema validation failed.\n // This should make it so users don't get \"stuck\" when our schemas are too strict or wrong.\n // The only con is that the full response from the API might be larger than normal\n // since a successful schema validation \"trims\" the response down to the shape of the schema.\n const validationError = fromError(error.cause);\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n data: error.data,\n warning: validationError.toString(),\n }),\n },\n ],\n };\n }\n\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `requestId: ${requestId}, error: ${getExceptionMessage(error)}`,\n },\n ],\n };\n}\n", "import {\n OrderBy,\n SearchContentFilter,\n SearchContentResponse,\n} from '../../sdks/tableau/types/contentExploration.js';\n\nexport function buildOrderByString(orderBy: OrderBy): string {\n const methodsUsed = new Set<string>();\n return orderBy\n .flatMap((ordering) => {\n if (methodsUsed.has(ordering.method)) {\n return []; // skip duplicate methods\n }\n methodsUsed.add(ordering.method);\n return ordering.method + (ordering.sortDirection ? `:${ordering.sortDirection}` : '');\n })\n .join(',');\n}\n\nexport function buildFilterString(filter: SearchContentFilter): string {\n const filterExpressions: Array<string> = [];\n if (filter.contentTypes) {\n if (filter.contentTypes.length === 1) {\n filterExpressions.push(`type:eq:${filter.contentTypes[0]}`);\n } else {\n const typesUsed = new Set<string>();\n for (const type of filter.contentTypes) {\n typesUsed.add(type);\n }\n filterExpressions.push(`type:in:[${Array.from(typesUsed).join(',')}]`);\n }\n }\n if (filter.ownerIds) {\n if (filter.ownerIds.length === 1) {\n filterExpressions.push(`ownerId:eq:${filter.ownerIds[0]}`);\n } else {\n const idsUsed = new Set<number>();\n for (const id of filter.ownerIds) {\n idsUsed.add(id);\n }\n filterExpressions.push(`ownerId:in:[${Array.from(idsUsed).join(',')}]`);\n }\n }\n if (filter.modifiedTime) {\n if (Array.isArray(filter.modifiedTime)) {\n if (filter.modifiedTime.length === 1) {\n filterExpressions.push(`modifiedTime:eq:${filter.modifiedTime[0]}`);\n } else {\n const modifiedTimesUsed = new Set<string>();\n for (const modifiedTime of filter.modifiedTime) {\n modifiedTimesUsed.add(modifiedTime);\n }\n filterExpressions.push(`modifiedTime:in:[${Array.from(modifiedTimesUsed).join(',')}]`);\n }\n } else if (filter.modifiedTime.startDate && filter.modifiedTime.endDate) {\n let startDate = filter.modifiedTime.startDate;\n let endDate = filter.modifiedTime.endDate;\n // if the client provides startDate and endDate in the wrong order, we swap them\n if (startDate > endDate) {\n startDate = filter.modifiedTime.endDate;\n endDate = filter.modifiedTime.startDate;\n }\n filterExpressions.push(`modifiedTime:gte:${startDate}`);\n filterExpressions.push(`modifiedTime:lte:${endDate}`);\n } else if (filter.modifiedTime.startDate) {\n filterExpressions.push(`modifiedTime:gte:${filter.modifiedTime.startDate}`);\n } else if (filter.modifiedTime.endDate) {\n filterExpressions.push(`modifiedTime:lte:${filter.modifiedTime.endDate}`);\n }\n }\n\n return filterExpressions.join(',');\n}\n\nexport function reduceSearchContentResponse(\n response: SearchContentResponse,\n): Array<Record<string, unknown>> {\n const searchResults: Array<Record<string, unknown>> = [];\n if (response.items) {\n for (const item of response.items) {\n searchResults.push(getReducedSearchItemContent(item.content));\n }\n }\n return searchResults;\n}\n\nfunction getReducedSearchItemContent(content: Record<string, any>): Record<string, unknown> {\n const reducedContent: Record<string, unknown> = {};\n if (content.modifiedTime) {\n reducedContent.modifiedTime = content.modifiedTime;\n }\n if (content.sheetType) {\n reducedContent.sheetType = content.sheetType;\n }\n if (content.caption) {\n reducedContent.caption = content.caption;\n }\n if (content.workbookDescription) {\n reducedContent.workbookDescription = content.workbookDescription;\n }\n if (content.type) {\n reducedContent.type = content.type;\n }\n if (content.ownerId) {\n reducedContent.ownerId = content.ownerId;\n }\n if (content.title) {\n reducedContent.title = content.title;\n }\n if (content.ownerName) {\n reducedContent.ownerName = content.ownerName;\n }\n if (content.containerName) {\n if (content.type === 'view') {\n reducedContent.parentWorkbookName = content.containerName;\n } else {\n reducedContent.containerName = content.containerName;\n }\n }\n if (content.luid) {\n reducedContent.luid = content.luid;\n }\n if (content.locationName) {\n reducedContent.locationName = content.locationName;\n }\n if (content.comments?.length) {\n reducedContent.comments = content.comments;\n }\n if (content.hitsTotal != undefined) {\n reducedContent.totalViewCount = content.hitsTotal;\n }\n if (content.favoritesTotal != undefined) {\n reducedContent.favoritesTotal = content.favoritesTotal;\n }\n if (content.tags?.length) {\n reducedContent.tags = content.tags;\n }\n if (content.projectName) {\n reducedContent.projectName = content.projectName;\n }\n if (content.hitsSmallSpanTotal != undefined) {\n reducedContent.viewCountLastMonth = content.hitsSmallSpanTotal;\n }\n if (content.downstreamWorkbookCount != undefined) {\n reducedContent.downstreamWorkbookCount = content.downstreamWorkbookCount;\n }\n if (content.isConnectable != undefined) {\n reducedContent.isConnectable = content.isConnectable;\n }\n if (content.datasourceIsPublished != undefined) {\n reducedContent.datasourceIsPublished = content.datasourceIsPublished;\n }\n if (content.connectionType) {\n reducedContent.connectionType = content.connectionType;\n }\n if (content.isCertified != undefined) {\n reducedContent.isCertified = content.isCertified;\n }\n if (content.hasExtracts != undefined) {\n reducedContent.hasExtracts = content.hasExtracts;\n }\n if (content.extractRefreshedAt) {\n reducedContent.extractRefreshedAt = content.extractRefreshedAt;\n }\n if (content.extractUpdatedAt) {\n reducedContent.extractUpdatedAt = content.extractUpdatedAt;\n }\n if (content.connectedWorkbooksCount != undefined) {\n reducedContent.connectedWorkbooksCount = content.connectedWorkbooksCount;\n }\n if (content.extractCreationPending != undefined) {\n reducedContent.extractCreationPending = content.extractCreationPending;\n }\n if (content.hasSevereDataQualityWarning != undefined) {\n reducedContent.hasSevereDataQualityWarning = content.hasSevereDataQualityWarning;\n }\n if (content.datasourceLuid) {\n reducedContent.datasourceLuid = content.datasourceLuid;\n }\n if (content.hasActiveDataQualityWarning != undefined) {\n reducedContent.hasActiveDataQualityWarning = content.hasActiveDataQualityWarning;\n }\n return reducedContent;\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { Server } from '../../server.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { Tool } from '../tool.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport {\n combineFields,\n FieldsResult,\n simplifyReadMetadataResult,\n} from './datasourceMetadataUtils.js';\n\nexport const getGraphqlQuery = (datasourceLuid: string): string => `\n query datasourceFieldInfo {\n publishedDatasources(filter: { luid: \"${datasourceLuid}\" }) {\n name\n description\n owner {\n name\n }\n fields {\n name\n isHidden\n description\n descriptionInherited {\n attribute\n value\n }\n fullyQualifiedName\n __typename\n ... on AnalyticsField {\n __typename\n }\n ... on ColumnField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n }\n ... on CalculatedField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n formula\n isAutoGenerated\n hasUserReference\n }\n ... on BinField {\n dataCategory\n role\n dataType\n formula\n binSize\n }\n ... on GroupField {\n dataCategory\n role\n dataType\n hasOther\n }\n ... on CombinedSetField {\n delimiter\n combinationType\n }\n }\n }\n }`;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n};\n\nexport type GetDatasourceMetadataError = {\n type: 'feature-disabled';\n};\n\nexport const getGetDatasourceMetadataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getDatasourceMetadataTool = new Tool({\n server,\n name: 'get-datasource-metadata',\n description: `\n This tool retrieves field metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API.\n The fields provided by this tool will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc.\n This tool should be used for getting the metadata to ground the use of a tool that queries Tableau published data sources.\n `,\n paramsSchema,\n annotations: {\n title: 'Get Datasource Metadata',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateDatasourceLuid,\n callback: async ({ datasourceLuid }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const query = getGraphqlQuery(datasourceLuid);\n\n return await getDatasourceMetadataTool.logAndExecute<\n FieldsResult,\n GetDatasourceMetadataError\n >({\n requestId,\n args: { datasourceLuid },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read', 'tableau:viz_data_service:read'],\n callback: async (restApi) => {\n // Fetching metadata from VizQL Data Service API.\n const readMetadataResult = await restApi.vizqlDataServiceMethods.readMetadata({\n datasource: {\n datasourceLuid,\n },\n });\n\n if (readMetadataResult.isErr()) {\n return Err({ type: 'feature-disabled' });\n }\n\n if (config.disableMetadataApiRequests) {\n // Exit early since requests to the Tableau Metadata API are disabled.\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n let listFieldsResult: GraphQLResponse;\n\n try {\n // Fetching metadata from Tableau Metadata API.\n // Using try-catch here since requests could fail if the service is not enabled.\n listFieldsResult = await restApi.metadataMethods.graphql(query);\n } catch {\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n // Combine the results from the VizQL Data Service API and the Tableau Metadata API.\n return Ok(combineFields(readMetadataResult.value, listFieldsResult));\n },\n });\n },\n getErrorText: (error: GetDatasourceMetadataError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n }\n },\n });\n },\n });\n\n return getDatasourceMetadataTool;\n};\n", "export function getVizqlDataServiceDisabledError(): string {\n return [\n 'The VizQL Data Service is disabled on this Tableau Server.',\n 'To enable it, use TSM using the instructions at https://help.tableau.com/current/server-linux/en-us/cli_configuration-set_tsm.htm#featuresvizqldataservicedeploywithtsm.',\n ].join(' ');\n}\n", "export function validateDatasourceLuid({ datasourceLuid }: { datasourceLuid: string }): void {\n if (!datasourceLuid) {\n throw new Error('datasourceLuid must be a non-empty string.');\n }\n}\n", "import { z } from 'zod';\n\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { MetadataResponse } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\nexport const fieldSchema = z\n .object({\n name: z.string(),\n columnClass: z.string(),\n dataType: z.string().nullable(),\n defaultAggregation: z.string().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(z.object({ attribute: z.string(), value: z.string().nullable() }).nullable())\n .nullable(),\n dataCategory: z.string().nullable(),\n role: z.string().nullable(),\n defaultFormat: z.string().nullable(),\n semanticRole: z.string().nullable(),\n aggregation: z.string().nullable(),\n aggregationParam: z.string().nullable(),\n formula: z.string().nullable(),\n isAutoGenerated: z.boolean().nullable(),\n hasUserReference: z.boolean().nullable(),\n binSize: z.number().nullable(),\n })\n .partial();\n\nexport const parameterSchema = z\n .object({\n name: z.string(),\n parameterType: z.string(),\n dataType: z.string().nullable(),\n value: z.union([z.number(), z.string(), z.boolean(), z.null()]),\n members: z.array(z.union([z.number(), z.string(), z.boolean(), z.null()])),\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n minDate: z.string().nullable(),\n maxDate: z.string().nullable(),\n periodValue: z.number().nullable(),\n periodType: z.string().nullable(),\n })\n .partial();\n\nexport const fieldsResultSchema = z.object({\n fields: z.array(fieldSchema),\n parameters: z.array(parameterSchema),\n});\n\ntype Parameter = z.infer<typeof parameterSchema>;\ntype Field = z.infer<typeof fieldSchema>;\nexport type FieldsResult = z.infer<typeof fieldsResultSchema>;\n\nexport function simplifyReadMetadataResult(readMetadataResult: MetadataResponse): FieldsResult {\n const simplifiedResponse: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n return simplifiedResponse;\n }\n\n // This is a simplified response that attempts to reduce tokens by\n // only including essential fields and renaming properties.\n for (const field of readMetadataResult.data) {\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n simplifiedResponse.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n simplifiedResponse.parameters.push(toPush);\n }\n }\n\n return simplifiedResponse;\n}\n\nexport function combineFields(\n readMetadataResult: MetadataResponse,\n listFieldsResult: GraphQLResponse,\n): FieldsResult {\n // Create a response object that combines field data from\n // readMetadata (VizQL Data Service API) and listFields (GraphQL Metadata API) results\n // to optimize for LLM accuracy and reduce tokens in response.\n const combinedFields: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n if (listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n // fallback to returning listFields results if we don't have any fields from readMetadata.\n for (const field of listFieldsResult.data.publishedDatasources[0].fields) {\n const toPush: Field = { name: field.name };\n if (field.dataType) {\n toPush.dataType = field.dataType;\n }\n if (field.aggregation) {\n toPush.defaultAggregation = field.aggregation;\n }\n populateFieldWithAdditionalProperties(field, toPush);\n combinedFields.fields.push(toPush);\n }\n }\n\n return combinedFields;\n }\n\n // Only include fields from readMetadata results in our response object since only those can be used in queries.\n for (const field of readMetadataResult.data) {\n // only keeping essential field properties.\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n combinedFields.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n combinedFields.parameters.push(toPush);\n }\n }\n\n if (!listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n return combinedFields;\n }\n\n // Of the fields in our response object, populate them with additional properties we get from listFields results.\n for (const field of combinedFields.fields) {\n const matchingListField = listFieldsResult.data.publishedDatasources[0].fields.find(\n (f) => f.name === field.name,\n );\n if (matchingListField) {\n populateFieldWithAdditionalProperties(matchingListField, field);\n }\n }\n\n return combinedFields;\n}\n\nfunction populateFieldWithAdditionalProperties(sourceField: Field, targetField: Field): void {\n if (sourceField.description) {\n targetField.description = sourceField.description;\n }\n if (sourceField.descriptionInherited?.length) {\n targetField.descriptionInherited = sourceField.descriptionInherited;\n }\n if (sourceField.dataCategory) {\n targetField.dataCategory = sourceField.dataCategory;\n }\n if (sourceField.role) {\n targetField.role = sourceField.role;\n }\n if (sourceField.defaultFormat) {\n targetField.defaultFormat = sourceField.defaultFormat;\n }\n if (sourceField.formula) {\n targetField.formula = sourceField.formula;\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.isAutoGenerated != undefined) {\n targetField.isAutoGenerated = sourceField.isAutoGenerated;\n }\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.hasUserReference != undefined) {\n targetField.hasUserReference = sourceField.hasUserReference;\n }\n }\n // Possibly null or undefined, only populate if defined.\n if (sourceField.binSize != undefined) {\n targetField.binSize = sourceField.binSize;\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { Tool } from '../tool.js';\nimport { parseAndValidateDatasourcesFilterString } from './datasourcesFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListDatasourcesTool = (server: Server): Tool<typeof paramsSchema> => {\n const listDatasourcesTool = new Tool({\n server,\n name: 'list-datasources',\n description: `\n Retrieves a list of published data sources from a specified Tableau site using the Tableau REST API. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Views) for precise and flexible data source discovery. Use this tool when a user requests to list, search, or filter Tableau data sources on a site.\n \n **Supported Filter Fields and Operators**\n | Field | Operators |\n |------------------------|-------------------------------------------|\n | authenticationType | eq, in |\n | connectedWorkbookType | eq, gt, gte, lt, lte |\n | connectionTo | eq, in |\n | connectionType | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | databaseName | eq, in |\n | databaseUserName | eq, in |\n | description | eq, in |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlert | eq |\n | hasEmbeddedPassword | eq |\n | hasExtracts | eq |\n | isCertified | eq |\n | isConnectable | eq |\n | isDefaultPort | eq |\n | isHierarchical | eq |\n | isPublished | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq |\n | ownerName | eq, in |\n | projectName* | eq, in |\n | serverName | eq, in |\n | serverPort | eq |\n | size | eq, gt, gte, lt, lte |\n | tableName | eq, in |\n | tags | eq, in |\n | type | eq |\n | updatedAt | eq, gt, gte, lt, lte |\n \n ${genericFilterDescription}\n \n **Example Usage:**\n - List all data sources on a site\n - List data sources with the name \"Project Views\":\n filter: \"name:eq:Project Views\"\n - List data sources in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List data sources created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List data sources with the name \"Project Views\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Project Views,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"\n `,\n paramsSchema,\n annotations: {\n title: 'List Datasources',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ filter, pageSize, limit }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateDatasourcesFilterString(filter) : undefined;\n return await listDatasourcesTool.logAndExecute({\n requestId,\n args: { filter, pageSize, limit },\n callback: async () => {\n const datasources = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const datasources = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, datasources: data } =\n await restApi.datasourcesMethods.listDatasources({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return datasources;\n },\n });\n\n return new Ok(datasources);\n },\n });\n },\n });\n\n return listDatasourcesTool;\n};\n", "import { z } from 'zod';\n\nimport { Pagination } from '../sdks/tableau/types/pagination.js';\n\nconst pageConfigSchema = z\n .object({\n pageSize: z.coerce.number().gt(0),\n pageNumber: z.coerce.number().gt(0),\n limit: z.coerce.number().gt(0),\n })\n .partial();\n\ntype PageConfig = z.infer<typeof pageConfigSchema>;\n\ntype PaginateArgs<T> = {\n pageConfig: PageConfig;\n getDataFn: (pagination: PageConfig) => Promise<{ pagination: Pagination; data: Array<T> }>;\n};\n\nexport async function paginate<T>({ pageConfig, getDataFn }: PaginateArgs<T>): Promise<Array<T>> {\n const { pageSize, limit } = pageConfigSchema.parse(pageConfig);\n const { pagination, data } = await getDataFn(pageConfig);\n const result = [...data];\n\n let { totalAvailable, pageNumber } = pagination;\n while (totalAvailable > result.length && (!limit || limit > result.length)) {\n const { pagination: nextPagination, data: nextData } = await getDataFn({\n pageSize,\n pageNumber: pageNumber + 1,\n limit,\n });\n\n if (nextData.length === 0) {\n throw new Error(\n `No more data available. Last fetched page number: ${pageNumber}, Total available: ${totalAvailable}, Total fetched: ${result.length}`,\n );\n }\n\n ({ totalAvailable, pageNumber } = nextPagination);\n result.push(...nextData);\n }\n\n if (limit && limit < result.length) {\n result.length = limit;\n }\n\n return result;\n}\n", "export const genericFilterDescription = `**Supported Operators**\n - \\`eq\\`: equals\n - \\`gt\\`: greater than\n - \\`gte\\`: greater than or equal\n - \\`in\\`: any of [list] (for searching tags)\n - \\`lt\\`: less than\n - \\`lte\\`: less than or equal\n \n **Filter Expression Notes**\n - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded.\n - Operators are delimited with colons (:). For example: \\`filter=name:eq:Project Views\\`\n - Field names, operator names, and values are case-sensitive.\n - To filter on multiple fields, combine expressions using a comma: \\`filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher\\`\n - Multiple expressions are combined using a logical AND.\n - If you include the same field multiple times, only the last reference is used.\n - For date-time values, use ISO 8601 format (e.g., \\`2016-05-04T21:24:49Z\\`).\n - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions:\n - Starts with: \\`?filter=name:eq:mark*\\`\n - Ends with: \\`?filter=name:eq:*-ample\\`\n - Contains: \\`?filter=name:eq:mark*ex*\\``;\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\n// === Field and Operator Definitions ===\n// [Tableau REST API Data Sources filter fields](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_filtering_and_sorting.htm#datasources)\n\nconst FilterFieldSchema = z.enum([\n 'authenticationType',\n 'connectedWorkbookType',\n 'connectionTo',\n 'connectionType',\n 'contentUrl',\n 'createdAt',\n 'databaseName',\n 'databaseUserName',\n 'description',\n 'favoritesTotal',\n 'hasAlert',\n 'hasEmbeddedPassword',\n 'hasExtracts',\n 'isCertified',\n 'isConnectable',\n 'isDefaultPort',\n 'isHierarchical',\n 'isPublished',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'serverName',\n 'serverPort',\n 'size',\n 'tableName',\n 'tags',\n 'type',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n authenticationType: ['eq', 'in'],\n connectedWorkbookType: ['eq', 'gt', 'gte', 'lt', 'lte'],\n connectionTo: ['eq', 'in'],\n connectionType: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n databaseName: ['eq', 'in'],\n databaseUserName: ['eq', 'in'],\n description: ['eq', 'in'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlert: ['eq'],\n hasEmbeddedPassword: ['eq'],\n hasExtracts: ['eq'],\n isCertified: ['eq'],\n isConnectable: ['eq'],\n isDefaultPort: ['eq'],\n isHierarchical: ['eq'],\n isPublished: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n serverName: ['eq', 'in'],\n serverPort: ['eq'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tableName: ['eq', 'in'],\n tags: ['eq', 'in'],\n type: ['eq'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateDatasourcesFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import z from 'zod';\n\nexport const FilterOperatorSchema = z.enum(['eq', 'in', 'gt', 'gte', 'lt', 'lte']);\nexport type FilterOperator = z.infer<typeof FilterOperatorSchema>;\n\nexport function isISO8601DateTime(value: string): boolean {\n // Basic ISO 8601 regex (covers most common cases)\n // Example: 2016-05-04T21:24:49Z\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/.test(value);\n}\n\nconst dateTimeFields = ['createdAt', 'updatedAt'];\n\n/**\n * Parses and validates a Tableau-style filter string\n * @param filterString e.g. 'name:eq:Project Views,type:eq:Workbook'\n * @param allowedOperatorsByField - A map of filter fields to allowed operators\n * @param filterFieldSchema - A schema for the filter field\n * @returns validated filter string\n * @throws ZodError or custom error for invalid operators\n */\nexport function parseAndValidateFilterString<\n TFilterField extends string,\n TFilterExpression extends { field: TFilterField; operator: FilterOperator; value: string } = {\n field: TFilterField;\n operator: FilterOperator;\n value: string;\n },\n>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema,\n}: {\n filterString: string;\n allowedOperatorsByField: Record<TFilterField, FilterOperator[]>;\n filterFieldSchema: z.ZodSchema<TFilterField>;\n}): string {\n function isOperatorAllowed(field: TFilterField, operator: FilterOperator): boolean {\n const allowed = allowedOperatorsByField[field];\n return allowed.includes(operator);\n }\n\n const expressions = filterString\n .split(',')\n .map((f) => f.trim())\n .filter(Boolean);\n\n const parsedFilters: Record<string, TFilterExpression> = {};\n\n for (const expr of expressions) {\n const [fieldRaw, operatorRaw, ...valueParts] = expr.split(':');\n if (!fieldRaw || !operatorRaw || valueParts.length === 0) {\n throw new Error(`Invalid filter expression format: \"${expr}\"`);\n }\n\n const value = valueParts.join(':');\n\n const field = filterFieldSchema.parse(fieldRaw);\n const operator = FilterOperatorSchema.parse(operatorRaw);\n\n if (!isOperatorAllowed(field, operator)) {\n throw new Error(\n `Operator '${operator}' is not allowed for field '${field}'. Allowed operators: ${allowedOperatorsByField[field].join(', ')}`,\n );\n }\n\n // Validate ISO 8601 for date-time fields\n if (dateTimeFields.includes(field) && !isISO8601DateTime(value)) {\n throw new Error(\n `Value for field '${field}' must be a valid ISO 8601 date-time string (e.g., 2016-05-04T21:24:49Z)`,\n );\n }\n\n parsedFilters[field] = { field, operator, value } as TFilterExpression;\n }\n\n // Reconstruct the filter string from validated filters\n return Object.values(parsedFilters)\n .map((f) => `${f.field}:${f.operator}:${f.value}`)\n .join(',');\n}\n\nexport const exportedForTesting = {\n FilterOperatorSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport z from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport {\n pulseBundleRequestSchema,\n pulseInsightBundleTypeEnum,\n} from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n bundleRequest: pulseBundleRequestSchema,\n bundleType: z.optional(z.enum(pulseInsightBundleTypeEnum)),\n};\n\nexport const getGeneratePulseMetricValueInsightBundleTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const generatePulseMetricValueInsightBundleTool = new Tool({\n server,\n name: 'generate-pulse-metric-value-insight-bundle',\n description: `\nGenerate an insight bundle for the current aggregated value for Pulse Metric using Tableau REST API. You need the full information of the Pulse Metric and Pulse Metric Definition to use this tool.\n\n**Parameters:**\n- \\`bundleRequest\\` (required): The request to generate a bundle for. Most of the information comes from data returned from other tools that retrieve Pulse Metric and Pulse Metric Definition information. When creating the bundleRequest, you will need to set options using the following values:\n - output_format: 'OUTPUT_FORMAT_HTML'\n - time_zone: 'UTC'\n - language: 'LANGUAGE_EN_US'\n - locale: 'LOCALE_EN_US'\n- \\`bundleType\\` (optional): The type of bundle to generate. The default is 'ban'.\n - 'ban' - Return a basic insight bundle with the current aggregated value for the Pulse Metric, period over period change, and the highest ranked insight for each filterable dimension of the metric.\n - 'springboard' - Return a springboard insight bundle with the current value, period over period change, and the highest ranked insight for the metric.\n - 'basic' - Similar to a springboard insight, but data is focused on the dimensions of a metric that are low bandwidth because they have small value sets. It shows the current value, period over period change, and the highest ranked insight for the metric for that data.\n - 'detail' - Shows insights on performance over time of the metric, a summary visualization of metric highs and lows and trends, breakdowns of top contributors for each filterable dimension of the metric, and followup insights based on the top ranked insights not already presented.\n\n**Example Usage:**\n- Generate the default insight bundle for the Pulse metric:\n bundleRequest: {\n bundle_request: {\n version: 1,\n options: {\n output_format: 'OUTPUT_FORMAT_HTML',\n time_zone: 'UTC',\n language: 'LANGUAGE_EN_US',\n locale: 'LOCALE_EN_US',\n },\n input: {\n metadata: {\n name: 'Pulse Metric',\n metric_id: 'CF32DDCC-362B-4869-9487-37DA4D152552',\n definition_id: 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3',\n },\n metric: {\n definition: {\n datasource: {\n id: 'A6FC3C9F-4F40-4906-8DB0-AC70C5FB5A11',\n },\n basic_specification: {\n measure: {\n field: 'Sales',\n aggregation: 'AGGREGATION_SUM', \n },\n time_dimension: {\n field: 'Order Date',\n },\n filters: [],\n },\n is_running_total: false,\n },\n metric_specification: {\n filters: [],\n measurement_period: {\n granularity: 'GRANULARITY_BY_QUARTER',\n range: 'RANGE_LAST_COMPLETE',\n },\n comparison: {\n comparison: 'TIME_COMPARISON_PREVIOUS_PERIOD',\n },\n },\n extension_options: {\n allowed_dimensions: [],\n allowed_granularities: [],\n offset_from_today: 0,\n },\n representation_options: {\n type: 'NUMBER_FORMAT_TYPE_NUMBER',\n number_units: {\n singular_noun: 'unit',\n plural_noun: 'units',\n },\n row_level_id_field: {\n identifier_col: 'Order ID',\n identifier_label: '',\n },\n row_level_entity_names: {\n entity_name_singular: 'Order',\n },\n row_level_name_field: {\n name_col: 'Order Name',\n },\n currency_code: 'CURRENCY_CODE_USD',\n },\n insights_options: {\n show_insights: true,\n settings: [],\n },\n goals: {\n target: {\n value: 100,\n },\n },\n },\n },\n },\n },\n- Generate the ban insight bundle for the Pulse metric:\n bundleType: 'ban',\n bundleRequest: (See default example above)\n- Generate the springboard insight bundle for the Pulse metric:\n bundleType: 'springboard',\n bundleRequest: (See default example above)\n- Generate the basic insight bundle for the Pulse metric:\n bundleType: 'basic',\n bundleRequest: (See default example above)\n- Generate the detail insight bundle for the Pulse metric:\n bundleType: 'detail',\n bundleRequest: (See default example above)\n`,\n paramsSchema,\n annotations: {\n title: 'Generate Pulse Metric Value Insight Bundle',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ bundleRequest, bundleType }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await generatePulseMetricValueInsightBundleTool.logAndExecute({\n requestId,\n args: { bundleRequest, bundleType },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insights:read'],\n callback: async (restApi) =>\n await restApi.pulseMethods.generatePulseMetricValueInsightBundle(\n bundleRequest,\n bundleType ?? 'ban',\n ),\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return generatePulseMetricValueInsightBundleTool;\n};\n", "export function getPulseDisabledError(reason: 'tableau-server' | 'pulse-disabled'): string {\n switch (reason) {\n case 'tableau-server':\n return [\n 'Pulse is not available on Tableau Server.',\n 'Consider disabling the Pulse MCP tools in your client or removing them using the EXCLUDE_TOOLS environment variable.',\n 'To enable Pulse on your Tableau Cloud site, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n case 'pulse-disabled':\n return [\n 'Pulse is disabled on this Tableau Cloud site.',\n 'To enable Pulse, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n};\n\nexport const getListAllPulseMetricDefinitionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listAllPulseMetricDefinitionsTool = new Tool({\n server,\n name: 'list-all-pulse-metric-definitions',\n description: `\nRetrieves a list of all published Pulse Metric Definitions using the Tableau REST API. Use this tool when a user requests to list all Tableau Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n\n**Example Usage:**\n- List all Pulse Metric Definitions on the current site\n- List all Pulse Metric Definitions on the current site with the default view:\n view: 'DEFINITION_VIEW_DEFAULT'\n- List all Pulse Metric Definitions on the current site with the full view:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List all Pulse Metric Definitions on the current site with the basic view:\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for my Pulse Metric Definitions:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List All Pulse Metric Definitions',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ view }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listAllPulseMetricDefinitionsTool.logAndExecute({\n requestId,\n args: { view },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listAllPulseMetricDefinitions(view);\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listAllPulseMetricDefinitionsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricDefinitionIds: z.array(z.string().length(36)).min(1),\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n};\n\nexport const getListPulseMetricDefinitionsFromDefinitionIdsTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricDefinitionsFromDefinitionIdsTool = new Tool({\n server,\n name: 'list-pulse-metric-definitions-from-definition-ids',\n description: `\nRetrieves a list of specific Pulse Metric Definitions using the Tableau REST API from a list of metric definition IDs. Use this tool when a user requests information about specific Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`metricDefinitionIds\\` (required): A list of metric definition IDs to retrieve.\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n\n**Example Usage:**\n- Can you show me details about Pulse Metric Definition with id 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3'\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3']\n- List Pulse Metric Definitions from a list of metric definition IDs:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4']\n- List these Pulse Metric Definitions with the default view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_DEFAULT'\n- List these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL',\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List these Pulse Metric Definitions with the basic view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Definitions from Metric Definition IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ view, metricDefinitionIds }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricDefinitionsFromDefinitionIdsTool.logAndExecute({\n requestId,\n args: { metricDefinitionIds, view },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricDefinitionsFromMetricDefinitionIds(\n metricDefinitionIds,\n view,\n );\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricDefinitionsFromDefinitionIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n pulseMetricDefinitionID: z.string().length(36),\n};\n\nexport const getListPulseMetricsFromMetricDefinitionIdTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricDefinitionIdTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-definition-id',\n description: `\nRetrieves a list of published Pulse Metrics from a Pulse Metric Definition using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a specific Pulse Metric Definition on the current site.\n\n**Parameters:**\n- \\`pulseMetricDefinitionID\\` (required): The ID of the Pulse Metric Definition to list metrics for. It should be the ID of the Pulse Metric Definition, not the name. Example: BBC908D8-29ED-48AB-A78E-ACF8A424C8C3\n\n**Example Usage:**\n- List all Pulse Metrics for this Pulse Metric Definition\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric Definition ID',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ pulseMetricDefinitionID }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricDefinitionIdTool.logAndExecute({\n requestId,\n args: { pulseMetricDefinitionID },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricDefinitionId(\n pulseMetricDefinitionID,\n );\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricDefinitionIdTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricIds: z.array(z.string().length(36)),\n};\n\nexport const getListPulseMetricsFromMetricIdsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricIdsTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-ids',\n description: `\nRetrieves a list of published Pulse Metrics from a list of metric IDs using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a list of metric IDs on the current site.\n\n**Parameters:**\n- \\`metricIds\\` (required): The list of Pulse Metric IDs to list metrics for. It should be the list of metric IDs, not the names or metric definition ids. Example: ['CF32DDCC-362B-4869-9487-37DA4D152552', 'CF32DDCC-362B-4869-9487-37DA4D152553']\n - For data in a Pulse Metric Subscription, use the metric_id field.\n\n**Example Usage:**\n- List all Pulse Metrics from a list of Pulse Metric IDs\n\n**Note:**\n- This tool is recommended for use with data in Pulse Metric Subscriptions.\n- 00000000-0000-0000-0000-000000000000 is not a valid datasource id.\n- If you need a valid datasource id, you may need to retrieve the Pulse Metric Definition for the Pulse Metric which should have a valid datasource information.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ metricIds }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricIdsTool.logAndExecute({\n requestId,\n args: { metricIds },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricIds(metricIds);\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {};\n\nexport const getListPulseMetricSubscriptionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricSubscriptionsTool = new Tool({\n server,\n name: 'list-pulse-metric-subscriptions',\n description: `\nRetrieves a list of published Pulse Metric Subscriptions for the current user using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metric Subscriptions for the current user.\n\n**Example Usage:** \n- List all Pulse Metric Subscriptions for the current user on the current site\n- List all of my Pulse Metric Subscriptions\n\n**Note:**\n- This tool does not directly provide information about Pulse Metric Definitions. If you need to know information about Pulse Metric Defintiions associated with your subscriptions you need to:\n 1. Retrieve Pulse Metrics from the metric ids returned in the Pulse Metric Subscriptions.\n 2. Retrieve Pulse Metric Definitions from the metric definition id returned in the Pulse Metrics.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Subscriptions for Current User',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (_, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricSubscriptionsTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:metric_subscriptions:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricSubscriptionsForCurrentUser();\n },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricSubscriptionsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Err } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n Datasource,\n Query,\n QueryOutput,\n TableauError,\n} from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { Server } from '../../server.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { Tool } from '../tool.js';\nimport { getDatasourceCredentials } from './datasourceCredentials.js';\nimport { handleQueryDatasourceError } from './queryDatasourceErrorHandler.js';\nimport { validateQuery } from './queryDatasourceValidator.js';\nimport { queryDatasourceToolDescription } from './queryDescription.js';\nimport { validateFilterValues } from './validators/validateFilterValues.js';\n\ntype Datasource = z.infer<typeof Datasource>;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n query: Query,\n};\n\nexport type QueryDatasourceError =\n | {\n type: 'feature-disabled';\n }\n | {\n type: 'filter-validation';\n message: string;\n }\n | {\n type: 'tableau-error';\n error: z.infer<typeof TableauError>;\n };\n\nexport const getQueryDatasourceTool = (server: Server): Tool<typeof paramsSchema> => {\n const queryDatasourceTool = new Tool({\n server,\n name: 'query-datasource',\n description: queryDatasourceToolDescription,\n paramsSchema,\n annotations: {\n title: 'Query Datasource',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateQuery,\n callback: async ({ datasourceLuid, query }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n return await queryDatasourceTool.logAndExecute<QueryOutput, QueryDatasourceError>({\n requestId,\n args: { datasourceLuid, query },\n callback: async () => {\n const datasource: Datasource = { datasourceLuid };\n const options = {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n } as const;\n\n const credentials = getDatasourceCredentials(datasourceLuid);\n if (credentials) {\n datasource.connections = credentials;\n }\n\n const queryRequest = {\n datasource,\n query,\n options,\n };\n\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:viz_data_service:read'],\n callback: async (restApi) => {\n if (!config.disableQueryDatasourceFilterValidation) {\n // Validate filters values for SET and MATCH filters\n const filterValidationResult = await validateFilterValues(\n server,\n query,\n restApi.vizqlDataServiceMethods,\n datasource,\n );\n\n if (filterValidationResult.isErr()) {\n const errors = filterValidationResult.error;\n const errorMessage = errors.map((error) => error.message).join('\\n\\n');\n return new Err({\n type: 'filter-validation',\n message: errorMessage,\n });\n }\n }\n\n const result = await restApi.vizqlDataServiceMethods.queryDatasource(queryRequest);\n if (result.isErr()) {\n return new Err(\n result.error instanceof ZodiosError\n ? result.error\n : result.error === 'feature-disabled'\n ? { type: 'feature-disabled' }\n : {\n type: 'tableau-error',\n error: result.error,\n },\n );\n }\n return result;\n },\n });\n },\n getErrorText: (error: QueryDatasourceError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n case 'filter-validation':\n return JSON.stringify({\n requestId,\n errorType: 'validation',\n message: error.message,\n });\n case 'tableau-error':\n return JSON.stringify({\n requestId,\n ...handleQueryDatasourceError(error.error),\n });\n }\n },\n });\n },\n });\n\n return queryDatasourceTool;\n};\n", "import { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\n\nconst schema = z.record(\n z.string().nonempty(),\n z.array(\n z\n .object({ luid: z.string().optional(), u: z.string().nonempty(), p: z.string().nonempty() })\n .transform(({ luid, u, p }) => ({\n connectionLuid: luid,\n connectionUsername: u,\n connectionPassword: p,\n })),\n ),\n);\n\ntype Connection = {\n connectionLuid: string | undefined;\n connectionUsername: string;\n connectionPassword: string;\n};\n\nlet credentialMap: Map<string, Array<Connection>> | undefined;\nlet initialized = false;\n\nexport const getDatasourceCredentials = (datasourceLuid: string): Array<Connection> | undefined => {\n if (!initialized) {\n initialized = true;\n\n const { datasourceCredentials } = getConfig();\n if (!datasourceCredentials) {\n return;\n }\n\n let obj: any;\n try {\n obj = JSON.parse(datasourceCredentials);\n } catch (e) {\n throw new Error(\n `Invalid datasource credentials format. Could not parse JSON string: ${datasourceCredentials}`,\n { cause: e },\n );\n }\n\n const parsed = schema.parse(obj);\n credentialMap = new Map(Object.entries(parsed));\n }\n\n return credentialMap?.get(datasourceLuid);\n};\n\nexport const exportedForTesting = {\n resetDatasourceCredentials: () => {\n initialized = false;\n credentialMap = undefined;\n },\n};\n", "/* v8 ignore start -- Exhaustive tests have limited value for this file */\n\nimport { TableauError } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\ntype TableauErrorDetail = TableauError & Partial<{ condition: string; details: string }>;\n\n/**\n * Adds additional context to the VizQl Data Service errors.\n *\n * @param {TableauError} error - The error object\n * @returns {*} {TableauErrorDetail} - The error object with additional context\n * @see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_error_codes.html\n */\nexport function handleQueryDatasourceError(error: TableauError): TableauErrorDetail {\n const errorDetail: TableauErrorDetail = {\n ...error,\n };\n\n switch (error.errorCode) {\n case '400000':\n errorDetail.condition = 'Bad request';\n errorDetail.details =\n 'The content of the request body is invalid. Check for missing or incomplete JSON.';\n break;\n case '400800':\n errorDetail.condition = 'Invalid formula for calculation';\n errorDetail.details =\n 'Invalid custom calculation syntax. For help, see https://help.tableau.com/current/pro/desktop/en-us/functions_operators.htm';\n break;\n case '400802':\n errorDetail.condition = 'Invalid API request';\n errorDetail.details = \"The incoming request isn't valid per the OpenAPI specification.\";\n break;\n case '400803':\n errorDetail.condition = 'Validation failed';\n errorDetail.details = \"The incoming request isn't valid per the validation rules.\";\n break;\n case '400804':\n errorDetail.condition = 'Response too large';\n errorDetail.details =\n 'The response value exceeds the limit. You must apply a filter in your request.';\n break;\n case '401001':\n errorDetail.condition = 'Login error';\n errorDetail.details = 'The login failed for the given user.';\n break;\n case '401002':\n errorDetail.condition = 'Invalid authorization credentials';\n errorDetail.details = 'The provided auth token is formatted incorrectly.';\n break;\n case '403157':\n errorDetail.condition = 'Feature disabled';\n errorDetail.details = 'The feature is disabled.';\n break;\n case '403800':\n errorDetail.condition = 'API access permission denied';\n errorDetail.details =\n \"The user doesn't have API Access granted on the given data source. Set the API Access capability for the given data source to Allowed. For help, see https://help.tableau.com/current/online/en-us/permissions_capabilities.htm\";\n break;\n case '404934':\n errorDetail.condition = 'Unknown field';\n errorDetail.details = \"The requested field doesn't exist.\";\n break;\n case '404950':\n errorDetail.condition = 'API endpoint not found';\n errorDetail.details = \"The request endpoint doesn't exist.\";\n break;\n case '408000':\n errorDetail.condition = 'Request timeout';\n errorDetail.details = 'The request timed out.';\n break;\n case '409000':\n errorDetail.condition = 'User already on site';\n errorDetail.details = 'HTTP status conflict.';\n break;\n case '429000':\n errorDetail.condition = 'Too many requests';\n errorDetail.details =\n 'Too many requests in the allotted amount of time. For help, see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_limitations.html#licensing-and-data-transfer';\n break;\n case '500000':\n errorDetail.condition = 'Internal server error';\n errorDetail.details = 'The request could not be completed.';\n break;\n case '500810':\n errorDetail.condition = 'VDS empty table response';\n errorDetail.details = 'The underlying data engine returned empty data value response.';\n break;\n case '500811':\n errorDetail.condition = 'VDS missing table';\n errorDetail.details =\n 'The underlying data engine returned empty metadata associated with response.';\n break;\n case '500812':\n errorDetail.condition = 'Error while processing an error';\n errorDetail.details = 'Internal processing error.';\n break;\n case '501000':\n errorDetail.condition = 'Not implemented';\n errorDetail.details = \"Can't find response from upstream server.\";\n break;\n case '503800':\n errorDetail.condition = 'VDS unavailable';\n errorDetail.details = 'The underlying data engine is unavailable.';\n break;\n case '503801':\n errorDetail.condition = 'VDS discovery error';\n errorDetail.details = \"The upstream service can't be found.\";\n break;\n case '504000':\n errorDetail.condition = 'Gateway timeout';\n errorDetail.details = 'The upstream service response timed out.';\n break;\n }\n\n return errorDetail;\n}\n/* v8 ignore stop */\n", "import { FilterField, Query } from '../queryDatasourceValidator.js';\n\ntype Fields = Query['fields'];\ntype Field = Fields[number];\n\nexport function validateFields(fields: Fields): void {\n {\n // You must query at least one field.\n if (fields.length === 0) {\n throw new Error(\n 'The query must include at least one field. The fields property cannot be an empty array.',\n );\n }\n }\n\n {\n // Field caption must be a non-empty string.\n if (fields.some(hasEmptyFieldCaption)) {\n throw new Error(`The query must not include any fields with an empty fieldCaption.`);\n }\n }\n\n {\n // You can't query the same field twice.\n const fieldCounts = fields.reduce<Record<string, number>>((acc, field) => {\n if (!acc[field.fieldCaption]) {\n acc[field.fieldCaption] = 0;\n }\n\n acc[field.fieldCaption]++;\n return acc;\n }, {});\n\n const duplicateFields = Object.entries(fieldCounts).filter(([_, count]) => count > 1);\n if (duplicateFields.length > 0) {\n throw new Error(\n `The query must not include duplicate fields. The following fields are duplicated: ${duplicateFields.map(([field]) => field).join(', ')}.`,\n );\n }\n }\n\n {\n // You can't have duplicate sort priorities.\n const sortPriorities = fields.reduce<Record<number, Array<string>>>((acc, field) => {\n if (field.sortPriority === undefined) {\n return acc;\n }\n\n if (!acc[field.sortPriority]) {\n acc[field.sortPriority] = [];\n }\n\n acc[field.sortPriority].push(field.fieldCaption);\n return acc;\n }, {});\n\n const duplicateSortPriorities = Object.entries(sortPriorities).filter(\n ([_, fields]) => fields.length > 1,\n );\n\n if (duplicateSortPriorities.length > 0) {\n const duplicateSortPrioritiesArr = duplicateSortPriorities.reduce<Array<string>>(\n (acc, [priority, fields]) => {\n acc.push(\n `${fields.map((field) => `\"${field}\"`).join(', ')} with a sort priority of ${priority}`,\n );\n return acc;\n },\n [],\n );\n\n throw new Error(\n `The query must not include duplicate sort priorities. The following fields have sort priorities that are duplicated: ${duplicateSortPrioritiesArr.join('. ')}.`,\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n const fieldsWithBothFunctionAndCalculation = fields\n .filter(hasFunctionAndCalculation)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithBothFunctionAndCalculation.length > 0) {\n throw new Error(\n `The query must not include fields that contain both a function and a calculation. The following fields contain both a function and a calculation: ${fieldsWithBothFunctionAndCalculation.join(', ')}.`,\n );\n }\n }\n\n {\n // The maxDecimalPlaces value must be greater or equal to 0.\n const fieldsWithNegativeMaxDecimalPlace = fields\n .filter(hasNegativeMaxDecimalPlace)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithNegativeMaxDecimalPlace.length > 0) {\n throw new Error(\n `The query must not include fields that have a maxDecimalPlaces value that is less than 0. The following fields have a maxDecimalPlaces value that is less than 0: ${fieldsWithNegativeMaxDecimalPlace.join(', ')}.`,\n );\n }\n }\n}\n\nfunction hasEmptyFieldCaption(field: Field): boolean {\n return !field.fieldCaption;\n}\n\nexport function hasFunctionAndCalculation(field: Field | FilterField): boolean {\n return !!('function' in field && field.function && 'calculation' in field && field.calculation);\n}\n\nexport function hasFieldCaptionAndCalculation(field: Field | FilterField): boolean {\n return !!(\n 'fieldCaption' in field &&\n field.fieldCaption &&\n 'calculation' in field &&\n field.calculation\n );\n}\n\nfunction hasNegativeMaxDecimalPlace(field: Field): boolean {\n return field.maxDecimalPlaces !== undefined && field.maxDecimalPlaces < 0;\n}\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport { FilterField, Query } from '../queryDatasourceValidator.js';\nimport { hasFieldCaptionAndCalculation, hasFunctionAndCalculation } from './validateFields.js';\n\nexport function validateFilters(filters: Query['filters']): void {\n if (!filters) {\n return;\n }\n\n if (filters.some((filter) => !('field' in filter))) {\n throw new Error(\n `The query must not include filters with invalid fields. The following field errors occurred: The filter must include a field property.`,\n );\n }\n\n {\n // You can't have multiple filters for a single field.\n const fieldCounts = filters.reduce<Record<string, number>>((acc, filter) => {\n if (!('fieldCaption' in filter.field)) {\n return acc;\n }\n\n if (!acc[filter.field.fieldCaption]) {\n acc[filter.field.fieldCaption] = 0;\n }\n\n acc[filter.field.fieldCaption]++;\n return acc;\n }, {});\n\n const fieldsWithMultipleFilters = Object.entries(fieldCounts).filter(([_, count]) => count > 1);\n\n if (fieldsWithMultipleFilters.length > 0) {\n throw new Error(\n `The query must not include multiple filters for the following fields: ${fieldsWithMultipleFilters.map(([field]) => field).join(', ')}.`,\n );\n }\n }\n\n {\n // Fields must be valid.\n const filtersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (!('field' in filter)) {\n return acc;\n }\n\n const result = validateFilterField(filter.field);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (filtersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include filters with invalid fields. The following field errors occurred: ${filtersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n\n {\n // Set, Match, and Relative Date filters can't have functions or calculations.\n const setFiltersWithFunctionsOrCalculations = filters.filter((filter) => {\n return (\n ['SET', 'MATCH', 'DATE'].includes(filter.filterType) &&\n (('function' in filter.field && filter.field.function) ||\n ('calculation' in filter.field && filter.field.calculation))\n );\n });\n\n if (setFiltersWithFunctionsOrCalculations.length > 0) {\n throw new Error(\n `The query must not include Set Filters, Match Filters, or Relative Date Filters with functions or calculations.`,\n );\n }\n }\n\n {\n // Set filters\n {\n // Values array can't be empty.\n const setFiltersWithEmptyValues = filters.filter((filter) => {\n return filter.filterType === 'SET' && filter.values.length === 0;\n });\n\n if (setFiltersWithEmptyValues.length > 0) {\n throw new Error(`The query must not include Set Filters with an empty values array.`);\n }\n }\n }\n\n {\n // Quantitative filters\n {\n // Dates must be valid RFC 3339.\n const quantitativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n if (filter.filterType !== 'QUANTITATIVE_DATE') {\n return false;\n }\n\n switch (filter.quantitativeFilterType) {\n case 'RANGE':\n return isNaN(Date.parse(filter.minDate)) || isNaN(Date.parse(filter.maxDate));\n case 'MIN':\n return isNaN(Date.parse(filter.minDate));\n case 'MAX':\n return isNaN(Date.parse(filter.maxDate));\n }\n });\n\n if (quantitativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n `The query must not include Quantitative Date Filters with invalid dates. Dates must use the RFC 3339 standard. Example: 2025-03-14`,\n );\n }\n }\n }\n\n {\n // Relative Date Filters\n {\n // Dates must be valid RFC 3339.\n const relativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n return (\n filter.filterType === 'DATE' && filter.anchorDate && isNaN(Date.parse(filter.anchorDate))\n );\n });\n\n if (relativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n `The query must not include Relative Date Filters with invalid anchor dates. Anchor dates must use the RFC 3339 standard. Example: 2025-03-14`,\n );\n }\n }\n }\n\n {\n // Top N Filters\n {\n // Field to measure must be valid.\n const topNFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'TOP') {\n return acc;\n }\n\n const result = validateFilterField(filter.fieldToMeasure);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (topNFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Top N filters with invalid fields. The following field errors occurred: ${topNFiltersWithInvalidFields.join(', ')}`,\n );\n }\n }\n }\n\n {\n // Match Filters\n {\n // You must have at least one of startsWith, endsWith, or contains.\n const matchFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'MATCH') {\n return acc;\n }\n\n if (!filter.startsWith && !filter.endsWith && !filter.contains) {\n acc.push(\n `The match filter for field \"${filter.field.fieldCaption}\" must include at least one of the following properties: startsWith, endsWith, or contains`,\n );\n }\n\n return acc;\n }, []);\n\n if (matchFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Match Filters with invalid fields. The following field errors occurred: ${matchFiltersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n }\n}\n\nfunction validateFilterField(field: FilterField): Result<void, string> {\n {\n // Field caption must be a non-empty string.\n if (hasEmptyFieldCaption(field)) {\n return new Err(`The fieldCaption property must be a non-empty string.`);\n }\n }\n\n {\n // Field cannot have a fieldCaption and a Calculation.\n if (hasFieldCaptionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a fieldCaption and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n if (hasFunctionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a function and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n return Ok.EMPTY;\n}\n\nfunction hasEmptyFieldCaption(field: FilterField): boolean {\n return 'fieldCaption' in field && !field.fieldCaption;\n}\n", "import { z } from 'zod';\n\nimport { FilterField, Query } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport { validateFields } from './validators/validateFields.js';\nimport { validateFilters } from './validators/validateFilters.js';\n\nexport type Query = z.infer<typeof Query>;\nexport type FilterField = z.infer<typeof FilterField>;\n\nexport function validateQuery({\n datasourceLuid,\n query,\n}: {\n datasourceLuid: string;\n query: Query;\n}): void {\n validateDatasourceLuid({ datasourceLuid });\n\n const { fields, filters } = query;\n validateFields(fields);\n validateFilters(filters);\n\n const result = Query.safeParse(query);\n if (!result.success) {\n throw new Error(`The query does not match the expected schema.`);\n }\n}\n", "export const queryDatasourceToolDescription = `# Query Tableau Data Source Tool\n\nExecutes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.\n\n## Prerequisites\nBefore using this tool, you should:\n1. Understand available fields and their types\n3. Understand the data structure and field relationships\n\n## Best Practices\n\n### Data Volume Management\n- **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size\n- **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale:\n \\`\\`\\`json\n {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n }\n \\`\\`\\`\n- **Use TOP filters for rankings** - When users ask for \"top N\" results, use TOP filter type to limit results at the database level\n- **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing\n- **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear\n\n### Field Usage Guidelines\n- **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations\n- **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations\n- **Validate field availability** - Always check field metadata before constructing queries\n\n### Query Construction\n- **Group by meaningful dimensions** - Ensure grouping supports the business question being asked\n- **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way\n- **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants)\n- **Leverage filter capabilities** - Use the extensive filter options to narrow results\n\n## Data Profiling Strategy\n\nWhen a query might return large amounts of data, follow this profiling approach:\n\n**Step 1: Count total records**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Primary_Key_Field\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 2: Count by key dimensions**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Category\",\n \"fieldAlias\": \"Category\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Record Count\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 3: Apply appropriate aggregation or filtering based on counts**\n\n## Filter Types and Usage\n\n### SET Filters\nFilter by specific values:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Region\"},\n \"filterType\": \"SET\",\n \"values\": [\"North\", \"South\", \"East\"],\n \"exclude\": false\n}\n\\`\\`\\`\n\n### TOP Filters \nGet top/bottom N records by a measure:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n}\n\\`\\`\\`\n\n### QUANTITATIVE Filters\nFilter numeric ranges:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"RANGE\",\n \"min\": 1000,\n \"max\": 50000,\n \"includeNulls\": false\n}\n\\`\\`\\`\n\n### DATE Filters\nFilter relative date periods:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"MONTHS\",\n \"dateRangeType\": \"LAST\"\n}\n\\`\\`\\`\n\n## Example Queries\n\n### Example 1: Data Profiling Before Large Query\n**Question:** \"Show me all customer orders this year\"\n\n**Step 1 - Profile the data volume:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Orders This Year\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n**If count is manageable (< 10,000), proceed with detail query. If large, suggest aggregation:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 2: Top Customers Query (Using TOP Filter)\n**Question:** \"Who are our top 10 customers by revenue?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Revenue\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 3: Time Series with Aggregation\n**Question:** \"What are our monthly sales trends?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"fieldAlias\": \"Month\",\n \"sortDirection\": \"ASC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 4: Filtered Category Analysis\n**Question:** \"What's the performance by product category for high-value orders?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Category\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"AVG\",\n \"fieldAlias\": \"Average Order Value\",\n \"maxDecimalPlaces\": 2\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"MIN\",\n \"min\": 500\n }\n ]\n }\n}\n\\`\\`\\`\n\n## Error Prevention and Data Management\n\n**When to profile data first:**\n- User asks for \"all records\" or similar broad requests\n- Query involves high-cardinality fields without filters\n- Request could potentially return row-level data for large tables\n\n**Suggest aggregation when:**\n- Profile queries return very high counts (> 10,000 records)\n- User asks questions that can be answered with summaries\n- Performance or response size might be an issue\n\n**Don't call this tool if:**\n- The requested fields are not available in the data source\n- The question requires data not present in the current data source\n- Field validation shows incompatible field types for the requested operation\n\n**Instead:**\n- Use metadata tools to understand available fields\n- Suggest alternative questions that can be answered with available data\n- Recommend appropriate aggregation levels for the business question`;\n", "import levenshtein from 'fast-levenshtein';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { log } from '../../../logging/log.js';\nimport {\n Datasource,\n MatchFilter,\n Query as QueryType,\n QueryRequest,\n SetFilter,\n} from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport VizqlDataServiceMethods from '../../../sdks/tableau/methods/vizqlDataServiceMethods.js';\nimport { Server } from '../../../server.js';\nimport { Query } from '../queryDatasourceValidator.js';\n\ntype MatchFilter = z.infer<typeof MatchFilter>;\ntype SetFilter = z.infer<typeof SetFilter>;\n\ninterface FilterValidationError {\n field: string;\n invalidValues: string[];\n sampleValues: string[];\n message: string;\n}\n\n/**\n * Validates SET and MATCH filter values by querying the VDS to check if they exist in the target field.\n * Returns fuzzy matched sample values from the field if validation fails.\n */\nexport async function validateFilterValues(\n server: Server,\n query: Query,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError[]>> {\n if (!query.filters) {\n return Ok.EMPTY;\n }\n\n const validationErrors: FilterValidationError[] = [];\n\n // Filter for SET and MATCH filters that need validation\n const filtersToValidate = query.filters.filter(\n (filter) =>\n (filter.filterType === 'SET' || filter.filterType === 'MATCH') &&\n 'fieldCaption' in filter.field &&\n filter.field.fieldCaption,\n ) as Array<MatchFilter | SetFilter>;\n\n if (filtersToValidate.length === 0) {\n return Ok.EMPTY;\n }\n\n // Validate each filter\n for (const filter of filtersToValidate) {\n const fieldCaption = filter.field.fieldCaption;\n\n try {\n if (filter.filterType === 'SET') {\n const result = await validateSetFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n } else if (filter.filterType === 'MATCH') {\n const result = await validateMatchFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n }\n } catch (error) {\n log.warning(server, `Filter value validation failed for field ${fieldCaption}: ${error}`);\n }\n }\n\n if (validationErrors.length > 0) {\n return new Err(validationErrors);\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a SET filter by checking if all values exist in the target field\n */\nasync function validateSetFilter(\n filter: SetFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n const filterValues = filter.values.map((v) => String(v));\n\n // Query to get distinct values from the field\n const distinctValuesQuery: z.infer<typeof QueryType> = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'DistinctValues',\n },\n ],\n };\n\n const queryRequest: z.infer<typeof QueryRequest> = {\n datasource,\n query: distinctValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const existingValues = new Set(\n (data as Record<string, unknown>[]).map((row) =>\n String(row.DistinctValues || row[fieldCaption] || ''),\n ),\n );\n\n // Check which filter values don't exist in the field\n const invalidValues = filterValues.filter((value) => !existingValues.has(value));\n\n if (invalidValues.length > 0) {\n // Use fuzzy matching to find similar values\n const suggestedValues = getFuzzyMatches(\n invalidValues,\n Array.from(existingValues),\n 3, // max edit distance\n 5, // max suggestions\n );\n\n let message = `Filter validation failed for field \"${fieldCaption}\". The following values were not found: ${invalidValues.join(', ')}.`;\n if (suggestedValues.length > 0) {\n message += ` Did you mean: ${suggestedValues.join(', ')}?`;\n }\n message +=\n ' Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.';\n\n return new Err({\n field: fieldCaption,\n invalidValues,\n sampleValues: suggestedValues,\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a MATCH filter by checking if the pattern matches any values in the target field\n */\nasync function validateMatchFilter(\n filter: MatchFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n\n // Query to get a sample of values from the field\n const sampleValuesQuery: z.infer<typeof QueryType> = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'SampleValues',\n },\n ],\n };\n\n const queryRequest: z.infer<typeof QueryRequest> = {\n datasource,\n query: sampleValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const fieldValues = (data as Record<string, unknown>[]).map((row: any) =>\n String(row.SampleValues || row[fieldCaption] || ''),\n );\n\n // Check if any values match the pattern\n const hasMatch = fieldValues.some((value) => {\n if (filter.startsWith && !value.startsWith(filter.startsWith)) return false;\n if (filter.endsWith && !value.endsWith(filter.endsWith)) return false;\n if (filter.contains && !value.includes(filter.contains)) return false;\n return true;\n });\n\n if (!hasMatch) {\n const similarValues = new Set<string>();\n\n // Find up to 5 similar values to avoid processing all field values\n for (const value of fieldValues) {\n if (similarValues.size >= 5) break;\n\n const lowerValue = value.toLowerCase();\n\n const fuzzyStartMatch = filter.startsWith\n ? (() => {\n const pattern = filter.startsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const startSlice = lowerValue.slice(0, len);\n return levenshtein.get(pattern, startSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyEndMatch = filter.endsWith\n ? (() => {\n const pattern = filter.endsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const endSlice = lowerValue.slice(-len);\n return levenshtein.get(pattern, endSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyContainsMatch = filter.contains\n ? (() => {\n const pattern = filter.contains!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n if (lowerValue.length >= len) {\n return Array.from({ length: lowerValue.length - len + 1 }, (_, i) =>\n levenshtein.get(pattern, lowerValue.slice(i, i + len)),\n ).some((dist) => dist <= dynamicDistance);\n } else {\n return levenshtein.get(pattern, lowerValue) <= dynamicDistance;\n }\n })()\n : true;\n\n if (fuzzyStartMatch && fuzzyEndMatch && fuzzyContainsMatch) {\n similarValues.add(value);\n }\n }\n\n const patternDescriptions: Array<string> = [];\n if (filter.startsWith) patternDescriptions.push(`starts with \"${filter.startsWith}\"`);\n if (filter.endsWith) patternDescriptions.push(`ends with \"${filter.endsWith}\"`);\n if (filter.contains) patternDescriptions.push(`contains \"${filter.contains}\"`);\n const similarValuesString =\n similarValues.size > 0\n ? `Similar values in this field: ${Array.from(similarValues).join(', ')}.`\n : '';\n\n const message =\n `Filter validation failed for field \"${fieldCaption}\". ` +\n `No values found that ${patternDescriptions.join(' and ')}. ` +\n `${similarValuesString} ` +\n `Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.`;\n\n return new Err({\n field: fieldCaption,\n invalidValues: patternDescriptions,\n sampleValues: Array.from(similarValues),\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Finds the closest matches to invalid filter values using fuzzy matching\n */\nexport function getFuzzyMatches(\n invalidValues: string[],\n existingValues: string[],\n maxDistance: number = 3,\n maxSuggestions: number = 5,\n): string[] {\n const suggestions: Array<{\n invalidValue: string;\n suggestionForInvalidValue: string;\n distance: number;\n }> = [];\n\n for (const existingValue of existingValues) {\n const matches = invalidValues\n .map((invalidValue) => ({\n value: invalidValue,\n distance: levenshtein.get(invalidValue.toLowerCase(), existingValue.toLowerCase()),\n }))\n .filter((match) => match.distance <= maxDistance)\n .sort((a, b) => a.distance - b.distance);\n if (matches.length > 0) {\n const bestMatch = matches[0];\n suggestions.push({\n invalidValue: bestMatch.value,\n suggestionForInvalidValue: existingValue,\n distance: bestMatch.distance,\n });\n }\n }\n\n // now that we have all the suggestions, sort them by distance.\n suggestions.sort((a, b) => a.distance - b.distance);\n\n // pick the best suggestions, but prevent having too many suggestions for the same invalid value.\n const toReturn: Array<string> = [];\n const suggestionLimitPerInvalidValue = Math.ceil(maxSuggestions / invalidValues.length);\n // create and initialize a suggestion counter for each invalid value.\n const invalidValueSuggestionCounter: Map<string, number> = new Map();\n for (const invalidValue of invalidValues) {\n invalidValueSuggestionCounter.set(invalidValue, 0);\n }\n\n for (const { invalidValue, suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n }\n\n if (invalidValueSuggestionCounter.get(invalidValue) === suggestionLimitPerInvalidValue) {\n continue;\n }\n\n toReturn.push(suggestionForInvalidValue);\n invalidValueSuggestionCounter.set(\n invalidValue,\n invalidValueSuggestionCounter.get(invalidValue)! + 1,\n );\n }\n\n // If we don't have enough suggestions, include more suggestions (ignoring the suggestion limit per invalid value).\n for (const { suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n } else if (toReturn.includes(suggestionForInvalidValue)) {\n continue;\n }\n toReturn.push(suggestionForInvalidValue);\n }\n\n return toReturn;\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n};\n\nexport const getGetViewDataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewDataTool = new Tool({\n server,\n name: 'get-view-data',\n description: `Retrieves data in comma separated value (CSV) format for the specified view in a Tableau workbook.`,\n paramsSchema,\n annotations: {\n title: 'Get View Data',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ viewId }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewDataTool.logAndExecute({\n requestId,\n args: { viewId },\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewData({\n viewId,\n siteId: restApi.siteId,\n });\n },\n }),\n );\n },\n });\n },\n });\n\n return getViewDataTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { convertPngDataToToolResult } from '../convertPngDataToToolResult.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n width: z.number().gt(0).optional(),\n height: z.number().gt(0).optional(),\n};\n\nexport const getGetViewImageTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewImageTool = new Tool({\n server,\n name: 'get-view-image',\n description: `Retrieves an image of the specified view in a Tableau workbook. The width and height in pixels can be provided. The default width and height are both 800 pixels.`,\n paramsSchema,\n annotations: {\n title: 'Get View Image',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ viewId, width, height }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewImageTool.logAndExecute({\n requestId,\n args: { viewId },\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewImage({\n viewId,\n siteId: restApi.siteId,\n width,\n height,\n resolution: 'high',\n });\n },\n }),\n );\n },\n getSuccessResult: convertPngDataToToolResult,\n });\n },\n });\n\n return getViewImageTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport function convertPngDataToToolResult(pngData: string): CallToolResult {\n const base64Data = Buffer.from(pngData).toString('base64');\n\n return {\n isError: false,\n content: [\n {\n type: 'image',\n data: base64Data,\n mimeType: 'image/png',\n },\n ],\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { Tool } from '../tool.js';\nimport { parseAndValidateViewsFilterString } from './viewsFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListViewsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listViewsTool = new Tool({\n server,\n name: 'list-views',\n description: `\n Retrieves a list of views on a Tableau site including their metadata such as name, owner, and the workbook they are found in. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Overview) for precise and flexible view discovery. Use this tool when a user requests to list, search, or filter Tableau views on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |---------------------|----------------------|\n | caption | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | fields | eq, in |\n | hitsTotal | eq, gt, gte, lt, lte |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetNumber | eq, gt, gte, lt, lte |\n | sheetType | eq, in |\n | tags | eq, in |\n | title | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n | viewUrlname | eq, in |\n | workbookDescription | eq, in |\n | workbookName | eq, in |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all views on a site\n - List views with the name \"Overview\":\n filter: \"name:eq:Overview\"\n - List views in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List views created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List views with the name \"Overview\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Views',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ filter, pageSize, limit }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateViewsFilterString(filter) : undefined;\n\n return await listViewsTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbooks = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, views: data } =\n await restApi.viewsMethods.queryViewsForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n includeUsageStatistics: true,\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return workbooks;\n },\n }),\n );\n },\n });\n },\n });\n\n return listViewsTool;\n};\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'caption',\n 'contentUrl',\n 'createdAt',\n 'favoritesTotal',\n 'fields',\n 'hitsTotal',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetNumber',\n 'sheetType',\n 'tags',\n 'title',\n 'updatedAt',\n 'viewUrlname',\n 'workbookDescription',\n 'workbookName',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n caption: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n fields: ['eq', 'in'],\n hitsTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetNumber: ['eq', 'gt', 'gte', 'lt', 'lte'],\n sheetType: ['eq', 'in'],\n tags: ['eq', 'in'],\n title: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n viewUrlname: ['eq', 'in'],\n workbookDescription: ['eq', 'in'],\n workbookName: ['eq', 'in'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateViewsFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n workbookId: z.string(),\n};\n\nexport const getGetWorkbookTool = (server: Server): Tool<typeof paramsSchema> => {\n const getWorkbookTool = new Tool({\n server,\n name: 'get-workbook',\n description: `Retrieves information about the specified workbook, including information about the views contained in the workbook.`,\n paramsSchema,\n annotations: {\n title: 'Get Workbook',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ workbookId }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getWorkbookTool.logAndExecute({\n requestId,\n args: { workbookId },\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbook = await restApi.workbooksMethods.getWorkbook({\n workbookId,\n siteId: restApi.siteId,\n });\n\n // The views returned by the getWorkbook API do not include usage statistics.\n // Query the views for the workbook to get each view's usage statistics.\n if (workbook.views) {\n const views = await restApi.viewsMethods.queryViewsForWorkbook({\n workbookId,\n siteId: restApi.siteId,\n includeUsageStatistics: true,\n });\n\n workbook.views.view = views;\n }\n\n return workbook;\n },\n }),\n );\n },\n });\n },\n });\n\n return getWorkbookTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { Tool } from '../tool.js';\nimport { parseAndValidateWorkbooksFilterString } from './workbooksFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListWorkbooksTool = (server: Server): Tool<typeof paramsSchema> => {\n const listWorkbooksTool = new Tool({\n server,\n name: 'list-workbooks',\n description: `\n Retrieves a list of workbooks on a Tableau site including their metadata such as name, description, and information about the views contained in the workbook. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Superstore) for precise and flexible workbook discovery. Use this tool when a user requests to list, search, or filter Tableau workbooks on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |-------------------|----------------------|\n | createdAt | eq, gt, gte, lt, lte |\n | contentUrl | eq, in |\n | displayTabs | eq |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlerts | eq |\n | hasExtracts | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetCount | eq, gt, gte, lt, lte |\n | size | eq, gt, gte, lt, lte |\n | subscriptionTotal | eq, gt, gte, lt, lte |\n | tags | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all workbooks on a site\n - List workbooks with the name \"Superstore\":\n filter: \"name:eq:Superstore\"\n - List workbooks in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List workbooks created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List workbooks with the name \"Superstore\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Workbooks',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ filter, pageSize, limit }, { requestId }): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateWorkbooksFilterString(filter) : undefined;\n\n return await listWorkbooksTool.logAndExecute({\n requestId,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbooks = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, workbooks: data } =\n await restApi.workbooksMethods.queryWorkbooksForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return workbooks;\n },\n }),\n );\n },\n });\n },\n });\n\n return listWorkbooksTool;\n};\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'createdAt',\n 'contentUrl',\n 'displayTabs',\n 'favoritesTotal',\n 'hasAlerts',\n 'hasExtracts',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetCount',\n 'size',\n 'subscriptionTotal',\n 'tags',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n contentUrl: ['eq', 'in'],\n displayTabs: ['eq'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlerts: ['eq'],\n hasExtracts: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetCount: ['eq', 'gt', 'gte', 'lt', 'lte'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n subscriptionTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tags: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateWorkbooksFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { getSearchContentTool } from './contentExploration/searchContent.js';\nimport { getGetDatasourceMetadataTool } from './getDatasourceMetadata/getDatasourceMetadata.js';\nimport { getListDatasourcesTool } from './listDatasources/listDatasources.js';\nimport { getGeneratePulseMetricValueInsightBundleTool } from './pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.js';\nimport { getListAllPulseMetricDefinitionsTool } from './pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.js';\nimport { getListPulseMetricDefinitionsFromDefinitionIdsTool } from './pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.js';\nimport { getListPulseMetricsFromMetricDefinitionIdTool } from './pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.js';\nimport { getListPulseMetricsFromMetricIdsTool } from './pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.js';\nimport { getListPulseMetricSubscriptionsTool } from './pulse/listMetricSubscriptions/listPulseMetricSubscriptions.js';\nimport { getQueryDatasourceTool } from './queryDatasource/queryDatasource.js';\nimport { getGetViewDataTool } from './views/getViewData.js';\nimport { getGetViewImageTool } from './views/getViewImage.js';\nimport { getListViewsTool } from './views/listViews.js';\nimport { getGetWorkbookTool } from './workbooks/getWorkbook.js';\nimport { getListWorkbooksTool } from './workbooks/listWorkbooks.js';\n\nexport const toolFactories = [\n getGetDatasourceMetadataTool,\n getListDatasourcesTool,\n getQueryDatasourceTool,\n getListAllPulseMetricDefinitionsTool,\n getListPulseMetricDefinitionsFromDefinitionIdsTool,\n getListPulseMetricsFromMetricDefinitionIdTool,\n getListPulseMetricsFromMetricIdsTool,\n getListPulseMetricSubscriptionsTool,\n getGeneratePulseMetricValueInsightBundleTool,\n getGetWorkbookTool,\n getGetViewDataTool,\n getGetViewImageTool,\n getListWorkbooksTool,\n getListViewsTool,\n getSearchContentTool,\n];\n", "import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\nimport cors from 'cors';\nimport express, { Request, Response } from 'express';\nimport fs, { existsSync } from 'fs';\nimport http from 'http';\nimport https from 'https';\n\nimport { Config } from '../config.js';\nimport { setLogLevel } from '../logging/log.js';\nimport { Server } from '../server.js';\n\nexport async function startExpressServer({\n basePath,\n config,\n logLevel,\n}: {\n basePath: string;\n config: Config;\n logLevel: LoggingLevel;\n}): Promise<{ url: string }> {\n const app = express();\n\n app.use(express.json());\n app.use(express.urlencoded());\n\n app.use(\n cors({\n origin: config.corsOriginConfig,\n credentials: true,\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'Cache-Control',\n 'Accept',\n 'MCP-Protocol-Version',\n ],\n exposedHeaders: ['mcp-session-id', 'x-session-id'],\n }),\n );\n\n const path = `/${basePath}`;\n app.post(path, createMcpServer);\n app.get(path, methodNotAllowed);\n app.delete(path, methodNotAllowed);\n\n const useSsl = !!(config.sslKey && config.sslCert);\n if (!useSsl) {\n return new Promise((resolve) => {\n http\n .createServer(app)\n .listen(config.httpPort, () =>\n resolve({ url: `http://localhost:${config.httpPort}/${basePath}` }),\n );\n });\n }\n\n if (!existsSync(config.sslKey)) {\n throw new Error('SSL key file does not exist');\n }\n\n if (!existsSync(config.sslCert)) {\n throw new Error('SSL cert file does not exist');\n }\n\n const options = {\n key: fs.readFileSync(config.sslKey),\n cert: fs.readFileSync(config.sslCert),\n };\n\n return new Promise((resolve) => {\n https\n .createServer(options, app)\n .listen(config.httpPort, () =>\n resolve({ url: `https://localhost:${config.httpPort}/${basePath}` }),\n );\n });\n\n async function createMcpServer(req: Request, res: Response): Promise<void> {\n try {\n const server = new Server();\n const transport: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n res.on('close', () => {\n transport.close();\n server.close();\n });\n\n server.registerTools();\n server.registerRequestHandlers();\n\n await server.connect(transport);\n setLogLevel(server, logLevel);\n\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n // eslint-disable-next-line no-console -- console.error is intentional here since the transport is not stdio.\n console.error('Error handling MCP request:', error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n }\n }\n}\n\nasync function methodNotAllowed(_req: Request, res: Response): Promise<void> {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n }),\n );\n}\n"],
|
|
5
5
|
"mappings": ";6FACA,OAAS,wBAAAA,OAA4B,4CACrC,OAAOC,OAAY,SCDnB,OAAS,QAAAC,OAAY,OACrB,OAAS,iBAAAC,OAAqB,MCFvB,IAAMC,GAAY,CACvB,mBACA,iBACA,aACA,mBACA,0BACA,eACA,gBACA,iBACA,oCACA,oDACA,+CACA,qCACA,kCACA,6CACA,gBACF,EAGaC,GAAiB,CAC5B,aACA,WACA,OACA,QACA,qBACF,EAGaC,GAAa,CACxB,WAAY,CAAC,mBAAoB,0BAA2B,kBAAkB,EAC9E,SAAU,CAAC,iBAAkB,cAAc,EAC3C,KAAM,CAAC,aAAc,gBAAiB,gBAAgB,EACtD,MAAO,CACL,oCACA,oDACA,+CACA,qCACA,kCACA,4CACF,EACA,sBAAuB,CAAC,gBAAgB,CAC1C,EAEO,SAASC,GAAWC,EAAmC,CAC5D,MAAO,CAAC,CAACJ,GAAU,KAAMK,GAASA,IAASD,CAAK,CAClD,CAEO,SAASE,GAAgBF,EAAwC,CACtE,MAAO,CAAC,CAACH,GAAe,KAAMI,GAASA,IAASD,CAAK,CACvD,CCjDA,IAAMG,GAAa,CAAC,QAAS,MAAM,EAE5B,SAASC,GAAYC,EAAgD,CAC1E,MAAO,CAAC,CAACF,GAAW,KAAMG,GAAMA,IAAMD,CAAS,CACjD,CCJe,SAARE,GAA2BC,EAAoBC,EAAqC,CACzF,GAAI,CAACD,EACH,MAAM,IAAI,MAAMC,GAAoB,qBAAqB,CAE7D,CHIA,IAAMC,GAAYC,GAAc,IAAI,IAAI,IAAK,YAAY,GAAG,CAAC,EAEvDC,GAAY,CAAC,MAAO,cAAc,EAG3BC,GAAN,KAAa,CAClB,KACA,OACA,UACA,OACA,QACA,SACA,iBACA,SACA,QACA,SACA,YACA,qBACA,qBACA,wBACA,qBACA,sBACA,gBACA,kBACA,aACA,aACA,eACA,uCACA,2BACA,oBACA,mBAEA,aAAc,CACZ,IAAMC,EAAeC,GAAyC,QAAQ,GAAG,EACnE,CACJ,KAAMC,EACN,OAAQC,EACR,UAAWC,EACX,UAAWC,EACX,QAASC,EACT,SAAUC,EACV,uBAAwBC,EACxB,mBAAoBC,EACpB,SAAUC,EACV,UAAWC,EACX,cAAeC,EACf,wBAAyBC,EACzB,wBAAyBC,EACzB,2BAA4BC,EAC5B,uBAAwBC,EACxB,uBAAwBC,EACxB,kBAAmBC,EACnB,oBAAqBC,EACrB,cAAeC,EACf,cAAeC,EACf,iBAAkBC,EAClB,2CAA4CC,EAC5C,8BAA+BC,GAC/B,sBAAuBC,GACvB,qBAAsBC,EACxB,EAAI1B,EAEE2B,GAAc,KACdC,EAAW5B,EAAaQ,GAAoB,KAAK,GAAK,MAAM,GAAKmB,GAAY,SAAS,EACtFE,EAAiB,SAASD,EAAU,EAAE,EAE5C,KAAK,SAAWxB,GAAY,GAC5B,KAAK,KAAON,GAAU,KAAMgC,GAASA,IAAS5B,CAAI,GAAK,MACvD,KAAK,UAAY6B,GAAY1B,CAAS,EAAIA,EAAY,QACtD,KAAK,OAASC,GAAQ,KAAK,GAAK,GAChC,KAAK,QAAUC,GAAS,KAAK,GAAK,GAClC,KAAK,SAAW,MAAMsB,CAAc,EAAIF,GAAcE,EACtD,KAAK,iBAAmBG,GAAoBvB,GAAkB,KAAK,GAAK,EAAE,EAC1E,KAAK,sBAAwBQ,GAAyB,GACtD,KAAK,gBAAkBC,GAAmB,QAC1C,KAAK,kBAAoBC,IAAsB,OAC/C,KAAK,uCAAyCI,IAA2C,OACzF,KAAK,2BAA6BC,KAA+B,OACjE,KAAK,oBAAsBC,KAAwB,OACnD,KAAK,mBAAqBC,IAAsBO,GAAKrC,GAAW,MAAM,EAEtE,IAAMsC,EAAuBZ,EAAiB,SAASA,CAAc,EAAI,IAkBzE,GAjBA,KAAK,eACH,MAAMY,CAAoB,GAAKA,GAAwB,EAAI,KAAOA,EAEpE,KAAK,aAAed,EAChBA,EAAa,MAAM,GAAG,EAAE,QAASe,GAAM,CACrC,IAAMC,EAAID,EAAE,KAAK,EACjB,OAAOE,GAAWD,CAAC,EAAIA,EAAIE,GAAgBF,CAAC,EAAIG,GAAWH,CAAC,EAAI,CAAC,CACnE,CAAC,EACD,CAAC,EAEL,KAAK,aAAef,EAChBA,EAAa,MAAM,GAAG,EAAE,QAASc,GAAM,CACrC,IAAMC,EAAID,EAAE,KAAK,EACjB,OAAOE,GAAWD,CAAC,EAAIA,EAAIE,GAAgBF,CAAC,EAAIG,GAAWH,CAAC,EAAI,CAAC,CACnE,CAAC,EACD,CAAC,EAED,KAAK,aAAa,OAAS,GAAK,KAAK,aAAa,OAAS,EAC7D,MAAM,IAAI,MAAM,iDAAiD,EAGnEI,GAAUrC,EAAQ,4CAA4C,EAC9DsC,GAAetC,CAAM,EAEjB,KAAK,OAAS,OAChBqC,GAAU9B,EAAS,8CAA8C,EACjE8B,GAAU7B,EAAU,+CAA+C,GAC1D,KAAK,OAAS,iBACvB6B,GAAU5B,EAAa,mDAAmD,EAC1E4B,GAAU3B,EAAU,6DAA6D,EACjF2B,GAAU1B,EAAU,6DAA6D,EACjF0B,GAAUzB,EAAa,gEAAgE,GAGzF,KAAK,OAASZ,EACd,KAAK,QAAUO,GAAW,GAC1B,KAAK,SAAWC,GAAY,GAC5B,KAAK,YAAcC,GAAe,GAClC,KAAK,qBAAuBC,GAAY,GACxC,KAAK,qBAAuBC,GAAY,GACxC,KAAK,wBAA0BC,GAAe,GAC9C,KAAK,qBAAuBC,GAAwB,IACtD,CACF,EAEA,SAASyB,GAAetC,EAAsB,CAC5C,GAAI,CAACA,EAAO,WAAW,UAAU,EAC/B,MAAM,IAAI,MAAM,+DAA+DA,CAAM,EAAE,EAGzF,GAAI,CACF,IAAMuC,EAAI,IAAI,IAAIvC,CAAM,CAC1B,OAASwC,EAAgB,CACvB,IAAMC,EAAeD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAC1E,MAAM,IAAI,MACR,uDAAuDxC,CAAM,OAAOyC,CAAY,EAClF,CACF,CACF,CAEA,SAASZ,GAAoBvB,EAAiD,CAC5E,GAAI,CAACA,EACH,MAAO,GAGT,GAAIA,EAAiB,MAAM,eAAe,EACxC,OAAOA,EAAiB,YAAY,IAAM,OAG5C,GAAIA,IAAqB,IACvB,MAAO,IAGT,GAAIA,EAAiB,WAAW,GAAG,GAAKA,EAAiB,SAAS,GAAG,EACnE,GAAI,CAEF,OADgB,KAAK,MAAMA,CAAgB,EAC5B,IAAKoC,GAAW,IAAI,IAAIA,CAAM,EAAE,MAAM,CACvD,MAAQ,CACN,MAAM,IAAI,MACR,6EAA6EpC,CAAgB,EAC/F,CACF,CAGF,GAAI,CACF,OAAO,IAAI,IAAIA,CAAgB,EAAE,MACnC,MAAQ,CACN,MAAM,IAAI,MACR,mEAAmEA,CAAgB,EACrF,CACF,CACF,CAIA,SAASR,GACP6C,EACoC,CACpC,OAAO,OAAO,QAAQA,CAAO,EAAE,OAA2C,CAACC,EAAK,CAACC,EAAKC,CAAK,KACrFA,GAAO,WAAW,gBAAgB,EACpCF,EAAIC,CAAG,EAAI,GAEXD,EAAIC,CAAG,EAAIC,EAENF,GACN,CAAC,CAAC,CACP,CAEO,IAAMG,EAAY,IAAc,IAAInD,GI1LpC,IAAMoD,GAAgB,CAC3B,QACA,OACA,SACA,UACA,QACA,WACA,QACA,WACF,EAEIC,GAAgC,QAChCC,GAEG,SAASC,GAAeC,EAAuC,CACpE,MAAO,CAAC,CAACJ,GAAc,KAAMK,GAAMA,IAAMD,CAAK,CAChD,CAEO,IAAME,GAAc,CACzBC,EACAH,EACA,CAAE,OAAAI,EAAS,EAAM,EAA0B,CAAC,IACnC,CACLP,KAAoBG,IAIxBH,GAAkBG,EAEbI,GACHC,GAAI,OAAOF,EAAQ,yBAAyBH,CAAK,EAAE,EAEvD,EAEaM,GAAmBC,GAA+B,CAC7DT,GAAeS,CACjB,EAIaF,GAAM,CACjB,MAAOG,GAAwB,OAAO,EACtC,KAAMA,GAAwB,MAAM,EACpC,OAAQA,GAAwB,QAAQ,EACxC,QAASA,GAAwB,SAAS,EAC1C,MAAOA,GAAwB,OAAO,EACtC,SAAUA,GAAwB,UAAU,EAC5C,MAAOA,GAAwB,OAAO,EACtC,UAAWA,GAAwB,WAAW,CAChD,EAQaC,GAA8B,CAACT,EAAQH,KAC3CD,GAAc,QAAQI,CAAK,GAAKJ,GAAc,QAAQC,EAAe,EAGjEa,GAAiBC,GAA0B,CAClD,QAAQ,IAAI,mBAAqB,SAKrCA,EAAUA,EAAQ,SAAS;AAAA,CAAI,EAAIA,EAAU,GAAGA,CAAO;AAAA,EACvD,QAAQ,OAAO,MAAMA,CAAO,EAC9B,EAEaC,GAAoB,CAAC,CAChC,UAAAC,EACA,SAAAC,EACA,KAAAC,CACF,KAKS,CACL,KAAM,OACN,UAAAF,EACA,KAAM,CACJ,KAAMC,EACN,GAAIC,IAAS,OAAY,CAAE,KAAAA,CAAK,EAAI,CAAC,CACvC,CACF,GAGF,SAASP,GAAwBR,EAAqB,CACpD,MAAO,OACLG,EACAQ,EACA,CAAE,OAAAJ,EAAQ,UAAAM,CAAU,EAAsB,CACxC,OAAQV,EAAO,IACjB,IACG,CAGH,GAFAL,IAAc,IAAI,CAAE,QAAAa,EAAS,MAAAX,EAAO,OAAAO,CAAO,CAAC,EAExC,EAACE,GAA4BT,CAAK,EAMtC,OAAOG,EAAO,OAAO,aACnB,CACE,OAAQ,wBACR,OAAQ,CACN,MAAAH,EACA,OAAAO,EACA,KAAM,KAAK,UACT,CACE,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,gBAAAV,GACA,QAAAc,CACF,EACA,KACA,CACF,CACF,CACF,EACA,CACE,iBAAkBE,CACpB,CACF,CACF,CACF,CC5IA,OAAS,cAAAG,OAAkB,mBAE3B,OAAS,cAAAC,GAAY,aAAAC,OAAiB,KACtC,OAAS,QAAAC,OAAY,OCHd,SAASC,GAAoBC,EAAwB,CAC1D,GAAIA,aAAiB,MACnB,OAAOA,EAAM,QAGf,GAAI,CACF,OAAO,KAAK,UAAUA,CAAK,GAAK,WAClC,MAAQ,CACN,MAAO,GAAGA,CAAK,EACjB,CACF,CDFO,IAAMC,GAAN,KAAmB,CACP,cACA,aAAe,IAAI,IAEpC,YAAY,CAAE,aAAAC,CAAa,EAA6B,CACtD,KAAK,cAAgBA,EAEhBC,GAAW,KAAK,aAAa,GAChCC,GAAU,KAAK,cAAe,CAAE,UAAW,EAAK,CAAC,CAErD,CAEA,MAAM,IAAIC,EAA6C,CAErD,IAAMC,EAAY,IAAI,KAAK,EAAE,YAAY,EACnCC,EAAW,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE,WAAW,EAAG,EAAG,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,QAAS,GAAG,CAAC,OAC1FC,EAAcC,GAAK,KAAK,cAAeF,CAAQ,EAG/CG,EAAWF,EAIXG,GAHe,KAAK,aAAa,IAAID,CAAQ,GAAK,QAAQ,QAAQ,GAG1C,KAAK,SAAY,CAC7C,GAAI,CAEF,MAAME,GAAWJ,EAAa,KAAK,UAAU,CAAE,UAAAF,EAAW,GAAGD,CAAI,CAAC,EAAI;AAAA,CAAI,CAC5E,OAASQ,EAAO,CACdC,GAAc,+BAA+BN,CAAW,KAAKO,GAAoBF,CAAK,CAAC,EAAE,CAC3F,CACF,CAAC,EAED,KAAK,aAAa,IAAIH,EAAUC,CAAQ,EAGxCA,EAAS,QAAQ,IAAM,CACjB,KAAK,aAAa,IAAID,CAAQ,IAAMC,GACtC,KAAK,aAAa,OAAOD,CAAQ,CAErC,CAAC,EAGD,MAAMC,CACR,CACF,EEpDA,OAAS,aAAAK,OAAiB,0CAC1B,OAAS,yBAAAC,OAA6B,qCCDtC,IAAAC,GAAA,CACE,KAAQ,sBACR,YAAe,sJACf,QAAW,SACX,WAAc,CACZ,KAAQ,MACR,IAAO,gDACT,EACA,SAAY,yCACZ,KAAQ,gDACR,OAAU,UACV,KAAQ,SACR,QAAW,aACX,SAAY,CACV,UACA,KACF,EACA,IAAO,CACL,qBAAsB,kBACxB,EACA,QAAW,CACT,SAAU,2IACV,MAAS,0BACT,cAAe,4BACf,eAAgB,gCAChB,cAAe,oDACf,aAAc,yDACd,iBAAkB,uDAClB,wBAAyB,gKACzB,aAAc,sBACd,oBAAqB,kEACrB,KAAQ,kBACR,QAAW,4EACX,gBAAiB,iFACjB,eAAgB,iCAChB,iBAAkB,mFAClB,sBAAuB,wCACvB,gBAAiB,sBACjB,uBAAwB,oCACxB,4BAA6B,yCAC7B,aAAc,0BACd,KAAQ,qCACR,WAAY,yCACZ,YAAa,0CACb,SAAY,oDACZ,gBAAiB,yCACjB,gBAAiB,yCACjB,gBAAiB,wCACnB,EACA,aAAgB,CACd,4BAA6B,UAC7B,eAAgB,UAChB,KAAQ,SACR,OAAU,UACV,QAAW,SACX,mBAAoB,SACpB,KAAQ,UACR,gBAAiB,SACjB,IAAO,UACP,uBAAwB,QAC1B,EACA,gBAAmB,CACjB,qBAAsB,SACtB,mBAAoB,SACpB,aAAc,UACd,kCAAmC,UACnC,iBAAkB,SAClB,cAAe,UACf,oBAAqB,UACrB,iBAAkB,SAClB,0BAA2B,SAC3B,cAAe,WACf,mCAAoC,UACpC,4BAA6B,UAC7B,sBAAuB,SACvB,QAAW,UACX,OAAU,UACV,yBAA0B,UAC1B,yBAA0B,SAC1B,mCAAoC,UACpC,cAAe,SACf,OAAU,UACV,SAAY,SACZ,OAAU,SACV,IAAO,SACP,WAAc,SACd,oBAAqB,UACrB,OAAU,QACZ,EACA,QAAW,CACT,KAAQ,MACV,CACF,EC3FA,OAAS,MAAAC,OAAU,gBACnB,OAAS,KAAAC,OAAS,MCFlB,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBAczB,IAAMC,GAAeC,GAAoD,CAC9E,IAAMC,EAASC,GAAqBF,CAAM,EAC1C,GAAIC,EAAO,MAAM,EACf,OAAOD,EAGT,IAAMG,EAAaF,EAAO,MAC1B,OAAIG,GAA4B,OAAO,GACjCD,EAAW,MAAM,cACnBA,EAAW,KAAK,YAAc,cAG5B,MAAM,QAAQA,GAAY,MAAM,YAAY,WAAW,GACrCA,EAAW,KAAK,WAAW,YAMnC,QAASE,GAAe,CAClCA,EAAW,mBAAqB,aAChCA,EAAW,mBAAqB,YAClC,CAAC,EAGCF,EAAW,UAAU,gBAAgB,IACvCA,EAAW,QAAQ,gBAAgB,EAAI,cAGrCA,EAAW,QAAS,UACtBA,EAAW,OAAO,QAAa,gBAGjC,OAAOA,EAAW,KAClB,OAAOA,EAAW,QAClB,OAAOA,EAAW,QAGbA,CACT,EAEaG,GAAgBC,GAAwD,CACnF,IAAMN,EAASC,GAAsBK,CAAQ,EAC7C,GAAIN,EAAO,MAAM,EACf,OAAOM,EAGT,IAAMJ,EAAaF,EAAO,MAC1B,OAAIG,GAA4B,OAAO,EACjCD,EAAW,MAAM,cACnBA,EAAW,KAAK,YAAc,eAGhC,OAAOA,EAAW,KAClB,OAAOA,EAAW,SAGbA,CACT,EAEA,SAASD,GAASM,EAA0B,CAC1C,GAAI,CACF,OAAOC,GAAG,gBAAgBD,CAAG,CAAC,CAChC,OAASE,EAAO,CACd,GAAIA,aAAiB,MACnB,OAAOC,GAAID,CAAK,EAGlB,IAAME,EAAUC,GAAoBH,CAAK,EACzC,OAAAI,GAAc,qEAAqEF,CAAO,EAAE,EACrFD,GAAI,IAAI,MAAMC,CAAO,CAAC,CAC/B,CACF,CC9DO,SAASG,GACdC,EAC2C,CAC3C,MAAO,CACL,OAAQA,EAAO,QAAU,iBACzB,IAAKA,EAAO,KAAO,cACnB,QAASA,EAAO,QAChB,KAAMA,EAAO,KACb,OAAQA,EAAO,MACjB,CACF,CAEO,SAASC,GACdC,EAC4C,CAC5C,MAAO,CACL,IAAKA,EAAS,OAAO,KAAO,cAC5B,OAAQA,EAAS,OACjB,QAASA,EAAS,QAClB,KAAMA,EAAS,IACjB,CACF,CC7CA,OAAS,UAAAC,OAAc,eCAvB,OAAS,cAAAC,OAAkB,cAE3B,OAA0C,WAAAC,OAAe,OAEzD,eAAsBC,GAAO,CAC3B,SAAAC,EACA,aAAAC,EACA,OAAAC,EACA,kBAAAC,CACF,EASoB,CAClB,IAAMC,EAA8B,CAClC,IAAK,QACL,IAAK,MACL,IAAKH,EAAa,QACpB,EAEMI,EAAsB,CAC1B,IAAKR,GAAW,EAChB,IAAKI,EAAa,SAClB,IAAK,UACL,IAAKD,EACL,IAAK,CAAC,GAAGE,CAAM,EACf,IAAK,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAI,EACrC,IAAK,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAI,EAAI,GACzC,GAAGC,CACL,EAMA,OAJc,MAAM,IAAIL,GAAQO,CAAO,EACpC,mBAAmBD,CAAM,EACzB,KAAK,IAAI,YAAY,EAAE,OAAOH,EAAa,WAAW,CAAC,CAG5D,CCzCA,OAAS,WAAAK,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,OAAS,MCDlB,OAAS,KAAAC,OAAS,MAEX,IAAMC,GAAoBD,GAAE,OAAO,CACxC,YAAaA,GAAE,OAAO,CACpB,KAAMA,GAAE,OAAO,CACb,GAAIA,GAAE,OAAO,CACf,CAAC,EACD,KAAMA,GAAE,OAAO,CACb,GAAIA,GAAE,OAAO,CACf,CAAC,EACD,MAAOA,GAAE,OAAO,CAClB,CAAC,CACH,CAAC,EDPD,IAAME,GAAsBC,GAAE,OAAO,CACnC,YAAaA,GACV,OAAO,CACN,KAAMA,GAAE,OAAO,CACb,WAAYA,GAAE,OAAO,CACvB,CAAC,CACH,CAAC,EACA,IACCA,GACG,OAAO,CACN,wBAAyBA,GAAE,OAAO,EAClC,0BAA2BA,GAAE,OAAO,CACtC,CAAC,EACA,GACCA,GAAE,OAAO,CACP,IAAKA,GAAE,OAAO,CAChB,CAAC,CACH,CACJ,CACJ,CAAC,EAEKC,GAAiBC,GAAa,CAClC,OAAQ,OACR,KAAM,eACN,MAAO,SACP,YAAa,qCACb,SAAUC,GACV,WAAY,CACV,CACE,KAAM,cACN,KAAM,OACN,OAAQJ,EACV,CACF,CACF,CAAC,EAEKK,GAAkBF,GAAa,CACnC,OAAQ,OACR,KAAM,gBACN,MAAO,UACP,YACE,6HACF,SAAUF,GAAE,KAAK,CACnB,CAAC,EAEKK,GAAoBC,GAAQ,CAACL,GAAgBG,EAAe,CAAC,EACtDG,GAAqB,CAChC,GAAGF,EACL,EEnDA,IAAqBG,GAArB,KAAkE,CACtD,WAEV,YAAYC,EAA8B,CACxC,KAAK,WAAaA,CACpB,CAEA,IAAI,cAAwD,CAC1D,OAAO,KAAK,WAAW,MAAM,YAC/B,CACF,ECMA,IAA8BC,EAA9B,cAEUC,EAAW,CACX,OAER,IAAc,YAA0B,CACtC,GAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,wCAAwC,EAG1D,MAAO,CACL,QAAS,CACP,iBAAkB,KAAK,OAAO,KAChC,CACF,CACF,CAEA,IAAc,QAAiB,CAC7B,GAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,wCAAwC,EAE1D,OAAO,KAAK,OAAO,KAAK,EAC1B,CAEA,YAAYC,EAA8BC,EAAoB,CAC5D,MAAMD,CAAS,EACf,KAAK,OAASC,CAChB,CACF,EL9BA,IAAqBC,GAArB,cAAmDC,EAAmC,CACpF,YAAYC,EAAiB,CAC3B,MAAM,IAAIC,GAAOD,EAASE,EAAkB,CAAC,CAC/C,CAQA,OAAS,MAAOC,IAEZ,MAAM,KAAK,WAAW,OAAO,CAC3B,YAAa,CACX,KAAM,CACJ,WAAYA,EAAW,QACzB,EACA,GAAI,MAAO,SAAY,CACrB,OAAQA,EAAW,KAAM,CACvB,IAAK,MACH,MAAO,CACL,wBAAyBA,EAAW,QACpC,0BAA2BA,EAAW,QACxC,EACF,IAAK,eACH,MAAO,CACL,IAAK,MAAMC,GAAO,CAChB,SAAUD,EAAW,SACrB,aAAc,CACZ,SAAUA,EAAW,SACrB,SAAUA,EAAW,SACrB,YAAaA,EAAW,WAC1B,EACA,OAAQA,EAAW,OACnB,kBAAmBA,EAAW,iBAChC,CAAC,CACH,CACJ,CACF,GAAG,CACL,CACF,CAAC,GACD,WAEN,EASaE,GAAN,cAAiDC,CAEtD,CACA,YAAYN,EAAiBO,EAAoB,CAC/C,MAAM,IAAIN,GAAOD,EAASE,EAAkB,EAAGK,CAAK,CACtD,CASA,QAAU,SAA2B,CACnC,MAAM,KAAK,WAAW,QAAQ,OAAW,CACvC,GAAG,KAAK,UACV,CAAC,CACH,CACF,EMxFA,OAAS,UAAAC,OAAc,eCAvB,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,OAAS,MCDlB,OAAS,KAAAC,MAAS,MAElB,IAAMC,GAAkBD,EAAE,KAAK,CAC7B,YACA,qBACA,sBACA,qBACA,yBACF,CAAC,EAEYE,GAAgBF,EAC1B,MACCA,EAAE,OAAO,CACP,OAAQC,GACR,cAAeD,EAAE,KAAK,CAAC,MAAO,MAAM,CAAC,EAAE,QAAQ,KAAK,EAAE,SAAS,CACjE,CAAC,CACH,EACC,SAAS,EAING,GAAeH,EAAE,KAAK,CAC1B,OACA,aACA,oBACA,aACA,UACA,OACA,WACA,QACA,WACA,OACA,UACF,CAAC,EAEKI,GAAqBJ,EAAE,MAAM,CACjCA,EAAE,MAAMA,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,EACxCA,EACG,OAAO,CACN,UAAWA,EAAE,OAAO,EAAE,SAAS,EAC/B,QAASA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAC1C,CAAC,EACA,OAAO,EACVA,EACG,OAAO,CACN,UAAWA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC1C,QAASA,EAAE,OAAO,EAAE,SAAS,CAC/B,CAAC,EACA,OAAO,CACZ,CAAC,EAEYK,GAA0BL,EACpC,OAAO,CACN,aAAcA,EAAE,MAAMG,EAAY,EAAE,SAAS,EAC7C,SAAUH,EAAE,MAAMA,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAC7C,aAAcI,EAChB,CAAC,EACA,QAAQ,EAEEE,GAA4BN,EAAE,MAAM,CAC/CK,GAAwB,OAAO,CAAE,aAAcL,EAAE,MAAMG,EAAY,EAAE,SAAS,CAAE,CAAC,EAAE,OAAO,EAC1FE,GAAwB,OAAO,CAAE,SAAUL,EAAE,MAAMA,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,CAAE,CAAC,EAAE,OAAO,EAC1FK,GAAwB,OAAO,CAAE,aAAcD,EAAmB,CAAC,EAAE,OAAO,CAC9E,CAAC,EAIKG,GAA0BP,EAAE,OAAO,CACvC,IAAKA,EAAE,OAAO,EACd,QAASA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,QAAQ,CAAC,CAC3C,CAAC,EAEYQ,GAA8BR,EACxC,OAAO,CACN,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,UAAWA,EAAE,OAAO,EAAE,IAAI,EAC1B,WAAYA,EAAE,OAAO,EAAE,IAAI,EAC3B,MAAOA,EAAE,OAAO,EAAE,IAAI,EACtB,MAAOA,EAAE,OAAO,EAAE,IAAI,EACtB,MAAOA,EAAE,MAAMO,EAAuB,CACxC,CAAC,EACA,QAAQ,ED7EX,IAAME,GAAwBC,GAAa,CACzC,OAAQ,MACR,KAAM,UACN,MAAO,gBACP,YACE,6IACF,WAAY,CACV,CACE,KAAM,QACN,KAAM,QACN,OAAQC,GAAE,OAAO,EAAE,SAAS,CAC9B,EACA,CACE,KAAM,OACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CACpC,EACA,CACE,KAAM,QACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CACpC,EACA,CACE,KAAM,WACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,SAAS,CAC9B,EACA,CACE,KAAM,SACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,SAAS,CAC9B,CACF,EACA,SAAUA,GAAE,OAAO,CACjB,KAAMC,EACR,CAAC,CACH,CAAC,EAEKC,GAAwBC,GAAQ,CAACL,EAAqB,CAAC,EAEhDM,GAAyB,CACpC,GAAGF,EACL,EDjCA,IAAqBG,GAArB,cAAuDC,CAErD,CACA,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAsB,EAAGF,CAAK,CAC1D,CAcA,cAAgB,MAAOG,IAOrB,OAAO,QAAQA,CAAO,EAAE,QAAQ,CAAC,CAACC,EAAKC,CAAK,IAAM,CAC5CA,IAAU,QACZ,OAAOF,EAAQC,CAA2B,CAE9C,CAAC,GACgB,MAAM,KAAK,WAAW,cAAc,CAAE,QAAAD,EAAS,GAAG,KAAK,UAAW,CAAC,GACpE,KAEpB,EGhDA,OAAS,UAAAG,OAAc,eCAvB,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,OAAS,MCDlB,OAAS,KAAAC,OAAS,MCAlB,OAAS,KAAAC,OAAS,MAEX,IAAMC,GAAgBD,GAAE,OAAO,CACpC,KAAMA,GAAE,OAAO,EACf,GAAIA,GAAE,OAAO,CACf,CAAC,EDDM,IAAME,GAAmBC,GAAE,OAAO,CACvC,GAAIA,GAAE,OAAO,EACb,KAAMA,GAAE,OAAO,EACf,YAAaA,GAAE,OAAO,EAAE,SAAS,EACjC,QAASC,EACX,CAAC,EETD,OAAS,KAAAC,OAAS,MAEX,IAAMC,GAAmBD,GAAE,OAAO,CACvC,WAAYA,GAAE,OAAO,OAAO,EAC5B,SAAUA,GAAE,OAAO,OAAO,EAC1B,eAAgBA,GAAE,OAAO,OAAO,CAClC,CAAC,ECLD,OAAS,KAAAE,OAAS,MAEX,IAAMC,GAAuB,CAClC,CACE,KAAM,WACN,KAAM,QACN,OAAQD,GAAE,OAAO,EAAE,SAAS,EAC5B,YACE,2GACJ,EACA,CACE,KAAM,aACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,SAAS,EAC5B,YAAa,0CACf,CACF,EJVA,IAAME,GAA8BC,GAAa,CAC/C,OAAQ,MACR,KAAM,6BACN,MAAO,kBACP,YACE,oJACF,WAAY,CACV,GAAGC,GACH,CACE,KAAM,SACN,KAAM,OACN,OAAQC,GAAE,OAAO,CACnB,EACA,CACE,KAAM,SACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,SAAS,EAC5B,YAAa,gFACf,CACF,EACA,SAAUA,GAAE,OAAO,CACjB,WAAYC,GACZ,YAAaD,GAAE,OAAO,CACpB,WAAYA,GAAE,SAASA,GAAE,MAAME,EAAgB,CAAC,CAClD,CAAC,CACH,CAAC,CACH,CAAC,EAEKC,GAAiBC,GAAQ,CAACP,EAA2B,CAAC,EAC/CQ,GAAkB,CAAC,GAAGF,EAAc,EDrBjD,IAAqBG,GAArB,cAAgDC,CAA6C,CAC3F,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAe,EAAGF,CAAK,CACnD,CAaA,gBAAkB,MAAO,CACvB,OAAAG,EACA,OAAAC,EACA,SAAAC,EACA,WAAAC,CACF,IAKsE,CACpE,IAAMC,EAAW,MAAM,KAAK,WAAW,gBAAgB,CACrD,OAAQ,CAAE,OAAAJ,CAAO,EACjB,QAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,WAAAC,CAAW,EACxC,GAAG,KAAK,UACV,CAAC,EACD,MAAO,CACL,WAAYC,EAAS,WACrB,YAAaA,EAAS,YAAY,YAAc,CAAC,CACnD,CACF,CACF,EMpDA,OAAS,UAAAC,OAAc,eCAvB,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,MAAS,MAEX,IAAMC,GAAkBD,EAAE,OAAO,CACtC,KAAMA,EAAE,OAAO,CACb,qBAAsBA,EAAE,MACtBA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,YAAaA,EAAE,OAAO,EAAE,SAAS,EACjC,MAAOA,EAAE,OAAO,CACd,KAAMA,EAAE,OAAO,EAAE,SAAS,CAC5B,CAAC,EACD,OAAQA,EAAE,MACRA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,QAAQ,EAAE,SAAS,EAC/B,YAAaA,EAAE,OAAO,EAAE,SAAS,EACjC,qBAAsBA,EACnB,MACCA,EACG,OAAO,CACN,UAAWA,EAAE,OAAO,EACpB,MAAOA,EAAE,OAAO,EAAE,SAAS,CAC7B,CAAC,EACA,SAAS,CACd,EACC,SAAS,EACZ,mBAAoBA,EAAE,OAAO,EAC7B,WAAYA,EAAE,OAAO,EAErB,aAAcA,EAAE,OAAO,EAAE,QAAQ,EACjC,KAAMA,EAAE,OAAO,EAAE,QAAQ,EACzB,SAAUA,EAAE,OAAO,EAAE,QAAQ,EAC7B,cAAeA,EAAE,OAAO,EAAE,QAAQ,EAClC,aAAcA,EAAE,OAAO,EAAE,QAAQ,EACjC,YAAaA,EAAE,OAAO,EAAE,QAAQ,EAChC,iBAAkBA,EAAE,OAAO,EAAE,QAAQ,EAErC,QAASA,EAAE,OAAO,EAAE,QAAQ,EAC5B,gBAAiBA,EAAE,QAAQ,EAAE,QAAQ,EACrC,iBAAkBA,EAAE,QAAQ,EAAE,QAAQ,EAEtC,QAASA,EAAE,OAAO,EAAE,QAAQ,EAE5B,SAAUA,EAAE,QAAQ,EAAE,QAAQ,EAE9B,UAAWA,EAAE,OAAO,EAAE,QAAQ,EAC9B,gBAAiBA,EAAE,OAAO,EAAE,QAAQ,CACtC,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAIKE,GAAkBH,GAAa,CACnC,OAAQ,OACR,KAAM,WACN,MAAO,UACP,SAAUE,GACV,WAAY,CACV,CACE,KAAM,QACN,KAAM,OACN,OAAQD,EAAE,OAAO,CACf,MAAOA,EAAE,OAAO,CAClB,CAAC,CACH,CACF,CACF,CAAC,EAEKG,GAAcL,GAAQ,CAACI,EAAe,CAAC,EAChCE,GAAe,CAAC,GAAGD,EAAW,ED7D3C,IAAqBE,GAArB,cAA6CC,CAA0C,CACrF,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAY,EAAGF,CAAK,CAChD,CAWA,QAAU,MAAOG,GACR,MAAM,KAAK,WAAW,QAAQ,CAAE,MAAAA,CAAM,EAAG,CAAE,GAAG,KAAK,UAAW,CAAC,CAE1E,EE9BA,OAAS,UAAAC,OAAc,eACvB,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBCCjB,SAARC,GAAsBC,EAAIC,EAAS,CACxC,OAAO,UAAgB,CACrB,OAAOD,EAAG,MAAMC,EAAS,SAAS,CACpC,CACF,CCAA,GAAM,CAAC,SAAAC,EAAQ,EAAI,OAAO,UACpB,CAAC,eAAAC,EAAc,EAAI,OACnB,CAAC,SAAAC,GAAU,YAAAC,EAAW,EAAI,OAE1BC,IAAUC,GAASC,GAAS,CAC9B,IAAMC,EAAMP,GAAS,KAAKM,CAAK,EAC/B,OAAOD,EAAME,CAAG,IAAMF,EAAME,CAAG,EAAIA,EAAI,MAAM,EAAG,EAAE,EAAE,YAAY,EACpE,GAAG,OAAO,OAAO,IAAI,CAAC,EAEhBC,GAAcC,IAClBA,EAAOA,EAAK,YAAY,EAChBH,GAAUF,GAAOE,CAAK,IAAMG,GAGhCC,GAAaD,GAAQH,GAAS,OAAOA,IAAUG,EAS/C,CAAC,QAAAE,EAAO,EAAI,MASZC,GAAcF,GAAW,WAAW,EAS1C,SAASG,GAASC,EAAK,CACrB,OAAOA,IAAQ,MAAQ,CAACF,GAAYE,CAAG,GAAKA,EAAI,cAAgB,MAAQ,CAACF,GAAYE,EAAI,WAAW,GAC/FC,EAAWD,EAAI,YAAY,QAAQ,GAAKA,EAAI,YAAY,SAASA,CAAG,CAC3E,CASA,IAAME,GAAgBR,GAAW,aAAa,EAU9C,SAASS,GAAkBH,EAAK,CAC9B,IAAII,EACJ,OAAK,OAAO,YAAgB,KAAiB,YAAY,OACvDA,EAAS,YAAY,OAAOJ,CAAG,EAE/BI,EAAUJ,GAASA,EAAI,QAAYE,GAAcF,EAAI,MAAM,EAEtDI,CACT,CASA,IAAMC,GAAWT,GAAW,QAAQ,EAQ9BK,EAAaL,GAAW,UAAU,EASlCU,GAAWV,GAAW,QAAQ,EAS9BW,GAAYf,GAAUA,IAAU,MAAQ,OAAOA,GAAU,SAQzDgB,GAAYhB,GAASA,IAAU,IAAQA,IAAU,GASjDiB,GAAiBT,GAAQ,CAC7B,GAAIV,GAAOU,CAAG,IAAM,SAClB,MAAO,GAGT,IAAMU,EAAYvB,GAAea,CAAG,EACpC,OAAQU,IAAc,MAAQA,IAAc,OAAO,WAAa,OAAO,eAAeA,CAAS,IAAM,OAAS,EAAErB,MAAeW,IAAQ,EAAEZ,MAAYY,EACvJ,EASMW,GAAiBX,GAAQ,CAE7B,GAAI,CAACO,GAASP,CAAG,GAAKD,GAASC,CAAG,EAChC,MAAO,GAGT,GAAI,CACF,OAAO,OAAO,KAAKA,CAAG,EAAE,SAAW,GAAK,OAAO,eAAeA,CAAG,IAAM,OAAO,SAChF,MAAY,CAEV,MAAO,EACT,CACF,EASMY,GAASlB,GAAW,MAAM,EAS1BmB,GAASnB,GAAW,MAAM,EAS1BoB,GAASpB,GAAW,MAAM,EAS1BqB,GAAarB,GAAW,UAAU,EASlCsB,GAAYhB,GAAQO,GAASP,CAAG,GAAKC,EAAWD,EAAI,IAAI,EASxDiB,GAAczB,GAAU,CAC5B,IAAI0B,EACJ,OAAO1B,IACJ,OAAO,UAAa,YAAcA,aAAiB,UAClDS,EAAWT,EAAM,MAAM,KACpB0B,EAAO5B,GAAOE,CAAK,KAAO,YAE1B0B,IAAS,UAAYjB,EAAWT,EAAM,QAAQ,GAAKA,EAAM,SAAS,IAAM,qBAIjF,EASM2B,GAAoBzB,GAAW,iBAAiB,EAEhD,CAAC0B,GAAkBC,GAAWC,GAAYC,EAAS,EAAI,CAAC,iBAAkB,UAAW,WAAY,SAAS,EAAE,IAAI7B,EAAU,EAS1H8B,GAAQ/B,GAAQA,EAAI,KACxBA,EAAI,KAAK,EAAIA,EAAI,QAAQ,qCAAsC,EAAE,EAiBnE,SAASgC,GAAQC,EAAKC,EAAI,CAAC,WAAAC,EAAa,EAAK,EAAI,CAAC,EAAG,CAEnD,GAAIF,IAAQ,MAAQ,OAAOA,EAAQ,IACjC,OAGF,IAAI,EACAG,EAQJ,GALI,OAAOH,GAAQ,WAEjBA,EAAM,CAACA,CAAG,GAGR7B,GAAQ6B,CAAG,EAEb,IAAK,EAAI,EAAGG,EAAIH,EAAI,OAAQ,EAAIG,EAAG,IACjCF,EAAG,KAAK,KAAMD,EAAI,CAAC,EAAG,EAAGA,CAAG,MAEzB,CAEL,GAAI3B,GAAS2B,CAAG,EACd,OAIF,IAAMI,EAAOF,EAAa,OAAO,oBAAoBF,CAAG,EAAI,OAAO,KAAKA,CAAG,EACrEK,EAAMD,EAAK,OACbE,EAEJ,IAAK,EAAI,EAAG,EAAID,EAAK,IACnBC,EAAMF,EAAK,CAAC,EACZH,EAAG,KAAK,KAAMD,EAAIM,CAAG,EAAGA,EAAKN,CAAG,CAEpC,CACF,CAEA,SAASO,GAAQP,EAAKM,EAAK,CACzB,GAAIjC,GAAS2B,CAAG,EACd,OAAO,KAGTM,EAAMA,EAAI,YAAY,EACtB,IAAMF,EAAO,OAAO,KAAKJ,CAAG,EACxB,EAAII,EAAK,OACTI,EACJ,KAAO,KAAM,GAEX,GADAA,EAAOJ,EAAK,CAAC,EACTE,IAAQE,EAAK,YAAY,EAC3B,OAAOA,EAGX,OAAO,IACT,CAEA,IAAMC,GAEA,OAAO,WAAe,IAAoB,WACvC,OAAO,KAAS,IAAc,KAAQ,OAAO,OAAW,IAAc,OAAS,OAGlFC,GAAoBC,GAAY,CAACvC,GAAYuC,CAAO,GAAKA,IAAYF,GAoB3E,SAASG,IAAmC,CAC1C,GAAM,CAAC,SAAAC,EAAU,cAAAC,CAAa,EAAIJ,GAAiB,IAAI,GAAK,MAAQ,CAAC,EAC/DhC,EAAS,CAAC,EACVqC,EAAc,CAACzC,EAAKgC,IAAQ,CAChC,IAAMU,EAAYH,GAAYN,GAAQ7B,EAAQ4B,CAAG,GAAKA,EAClDvB,GAAcL,EAAOsC,CAAS,CAAC,GAAKjC,GAAcT,CAAG,EACvDI,EAAOsC,CAAS,EAAIJ,GAAMlC,EAAOsC,CAAS,EAAG1C,CAAG,EACvCS,GAAcT,CAAG,EAC1BI,EAAOsC,CAAS,EAAIJ,GAAM,CAAC,EAAGtC,CAAG,EACxBH,GAAQG,CAAG,EACpBI,EAAOsC,CAAS,EAAI1C,EAAI,MAAM,GAE1B,CAACwC,GAAiB,CAAC1C,GAAYE,CAAG,KACpCI,EAAOsC,CAAS,EAAI1C,EAG1B,EAEA,QAAS2C,EAAI,EAAGd,EAAI,UAAU,OAAQc,EAAId,EAAGc,IAC3C,UAAUA,CAAC,GAAKlB,GAAQ,UAAUkB,CAAC,EAAGF,CAAW,EAEnD,OAAOrC,CACT,CAYA,IAAMwC,GAAS,CAACC,EAAGC,EAAGC,EAAS,CAAC,WAAAnB,CAAU,EAAG,CAAC,KAC5CH,GAAQqB,EAAG,CAAC9C,EAAKgC,IAAQ,CACnBe,GAAW9C,EAAWD,CAAG,EAC3B6C,EAAEb,CAAG,EAAIgB,GAAKhD,EAAK+C,CAAO,EAE1BF,EAAEb,CAAG,EAAIhC,CAEb,EAAG,CAAC,WAAA4B,CAAU,CAAC,EACRiB,GAUHI,GAAYC,IACZA,EAAQ,WAAW,CAAC,IAAM,QAC5BA,EAAUA,EAAQ,MAAM,CAAC,GAEpBA,GAYHC,GAAW,CAACC,EAAaC,EAAkBC,EAAOC,IAAgB,CACtEH,EAAY,UAAY,OAAO,OAAOC,EAAiB,UAAWE,CAAW,EAC7EH,EAAY,UAAU,YAAcA,EACpC,OAAO,eAAeA,EAAa,QAAS,CAC1C,MAAOC,EAAiB,SAC1B,CAAC,EACDC,GAAS,OAAO,OAAOF,EAAY,UAAWE,CAAK,CACrD,EAWME,GAAe,CAACC,EAAWC,EAASC,EAAQC,IAAe,CAC/D,IAAIN,EACAX,EACAkB,EACEC,EAAS,CAAC,EAIhB,GAFAJ,EAAUA,GAAW,CAAC,EAElBD,GAAa,KAAM,OAAOC,EAE9B,EAAG,CAGD,IAFAJ,EAAQ,OAAO,oBAAoBG,CAAS,EAC5Cd,EAAIW,EAAM,OACHX,KAAM,GACXkB,EAAOP,EAAMX,CAAC,GACT,CAACiB,GAAcA,EAAWC,EAAMJ,EAAWC,CAAO,IAAM,CAACI,EAAOD,CAAI,IACvEH,EAAQG,CAAI,EAAIJ,EAAUI,CAAI,EAC9BC,EAAOD,CAAI,EAAI,IAGnBJ,EAAYE,IAAW,IAASxE,GAAesE,CAAS,CAC1D,OAASA,IAAc,CAACE,GAAUA,EAAOF,EAAWC,CAAO,IAAMD,IAAc,OAAO,WAEtF,OAAOC,CACT,EAWMK,GAAW,CAACtE,EAAKuE,EAAcC,IAAa,CAChDxE,EAAM,OAAOA,CAAG,GACZwE,IAAa,QAAaA,EAAWxE,EAAI,UAC3CwE,EAAWxE,EAAI,QAEjBwE,GAAYD,EAAa,OACzB,IAAME,EAAYzE,EAAI,QAAQuE,EAAcC,CAAQ,EACpD,OAAOC,IAAc,IAAMA,IAAcD,CAC3C,EAUME,GAAW3E,GAAU,CACzB,GAAI,CAACA,EAAO,OAAO,KACnB,GAAIK,GAAQL,CAAK,EAAG,OAAOA,EAC3B,IAAImD,EAAInD,EAAM,OACd,GAAI,CAACc,GAASqC,CAAC,EAAG,OAAO,KACzB,IAAMyB,EAAM,IAAI,MAAMzB,CAAC,EACvB,KAAOA,KAAM,GACXyB,EAAIzB,CAAC,EAAInD,EAAMmD,CAAC,EAElB,OAAOyB,CACT,EAWMC,IAAgBC,GAEb9E,GACE8E,GAAc9E,aAAiB8E,GAEvC,OAAO,WAAe,KAAenF,GAAe,UAAU,CAAC,EAU5DoF,GAAe,CAAC7C,EAAKC,IAAO,CAGhC,IAAM6C,GAFY9C,GAAOA,EAAItC,EAAQ,GAET,KAAKsC,CAAG,EAEhCtB,EAEJ,MAAQA,EAASoE,EAAU,KAAK,IAAM,CAACpE,EAAO,MAAM,CAClD,IAAMqE,EAAOrE,EAAO,MACpBuB,EAAG,KAAKD,EAAK+C,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAC/B,CACF,EAUMC,GAAW,CAACC,EAAQlF,IAAQ,CAChC,IAAImF,EACER,EAAM,CAAC,EAEb,MAAQQ,EAAUD,EAAO,KAAKlF,CAAG,KAAO,MACtC2E,EAAI,KAAKQ,CAAO,EAGlB,OAAOR,CACT,EAGMS,GAAanF,GAAW,iBAAiB,EAEzCoF,GAAcrF,GACXA,EAAI,YAAY,EAAE,QAAQ,wBAC/B,SAAkBsF,EAAGC,EAAIC,EAAI,CAC3B,OAAOD,EAAG,YAAY,EAAIC,CAC5B,CACF,EAIIC,IAAkB,CAAC,CAAC,eAAAA,CAAc,IAAM,CAACxD,EAAKmC,IAASqB,EAAe,KAAKxD,EAAKmC,CAAI,GAAG,OAAO,SAAS,EASvGsB,GAAWzF,GAAW,QAAQ,EAE9B0F,GAAoB,CAAC1D,EAAK2D,IAAY,CAC1C,IAAM9B,EAAc,OAAO,0BAA0B7B,CAAG,EAClD4D,EAAqB,CAAC,EAE5B7D,GAAQ8B,EAAa,CAACgC,EAAYC,IAAS,CACzC,IAAIC,GACCA,EAAMJ,EAAQE,EAAYC,EAAM9D,CAAG,KAAO,KAC7C4D,EAAmBE,CAAI,EAAIC,GAAOF,EAEtC,CAAC,EAED,OAAO,iBAAiB7D,EAAK4D,CAAkB,CACjD,EAOMI,GAAiBhE,GAAQ,CAC7B0D,GAAkB1D,EAAK,CAAC6D,EAAYC,IAAS,CAE3C,GAAIvF,EAAWyB,CAAG,GAAK,CAAC,YAAa,SAAU,QAAQ,EAAE,QAAQ8D,CAAI,IAAM,GACzE,MAAO,GAGT,IAAMG,EAAQjE,EAAI8D,CAAI,EAEtB,GAAKvF,EAAW0F,CAAK,EAIrB,IAFAJ,EAAW,WAAa,GAEpB,aAAcA,EAAY,CAC5BA,EAAW,SAAW,GACtB,MACF,CAEKA,EAAW,MACdA,EAAW,IAAM,IAAM,CACrB,MAAM,MAAM,qCAAwCC,EAAO,GAAI,CACjE,GAEJ,CAAC,CACH,EAEMI,GAAc,CAACC,EAAeC,IAAc,CAChD,IAAMpE,EAAM,CAAC,EAEPqE,EAAU3B,GAAQ,CACtBA,EAAI,QAAQuB,GAAS,CACnBjE,EAAIiE,CAAK,EAAI,EACf,CAAC,CACH,EAEA,OAAA9F,GAAQgG,CAAa,EAAIE,EAAOF,CAAa,EAAIE,EAAO,OAAOF,CAAa,EAAE,MAAMC,CAAS,CAAC,EAEvFpE,CACT,EAEMsE,GAAO,IAAM,CAAC,EAEdC,GAAiB,CAACN,EAAOO,IACtBP,GAAS,MAAQ,OAAO,SAASA,EAAQ,CAACA,CAAK,EAAIA,EAAQO,EAYpE,SAASC,GAAoB3G,EAAO,CAClC,MAAO,CAAC,EAAEA,GAASS,EAAWT,EAAM,MAAM,GAAKA,EAAMH,EAAW,IAAM,YAAcG,EAAMJ,EAAQ,EACpG,CAEA,IAAMgH,GAAgB1E,GAAQ,CAC5B,IAAM2E,EAAQ,IAAI,MAAM,EAAE,EAEpBC,EAAQ,CAACC,EAAQ5D,IAAM,CAE3B,GAAIpC,GAASgG,CAAM,EAAG,CACpB,GAAIF,EAAM,QAAQE,CAAM,GAAK,EAC3B,OAIF,GAAIxG,GAASwG,CAAM,EACjB,OAAOA,EAGT,GAAG,EAAE,WAAYA,GAAS,CACxBF,EAAM1D,CAAC,EAAI4D,EACX,IAAMC,EAAS3G,GAAQ0G,CAAM,EAAI,CAAC,EAAI,CAAC,EAEvC,OAAA9E,GAAQ8E,EAAQ,CAACZ,EAAO3D,IAAQ,CAC9B,IAAMyE,EAAeH,EAAMX,EAAOhD,EAAI,CAAC,EACvC,CAAC7C,GAAY2G,CAAY,IAAMD,EAAOxE,CAAG,EAAIyE,EAC/C,CAAC,EAEDJ,EAAM1D,CAAC,EAAI,OAEJ6D,CACT,CACF,CAEA,OAAOD,CACT,EAEA,OAAOD,EAAM5E,EAAK,CAAC,CACrB,EAEMgF,GAAYhH,GAAW,eAAe,EAEtCiH,GAAcnH,GAClBA,IAAUe,GAASf,CAAK,GAAKS,EAAWT,CAAK,IAAMS,EAAWT,EAAM,IAAI,GAAKS,EAAWT,EAAM,KAAK,EAK/FoH,IAAiB,CAACC,EAAuBC,IACzCD,EACK,aAGFC,GAAwB,CAACC,EAAOC,KACrC7E,GAAQ,iBAAiB,UAAW,CAAC,CAAC,OAAAoE,EAAQ,KAAAU,CAAI,IAAM,CAClDV,IAAWpE,IAAW8E,IAASF,GACjCC,EAAU,QAAUA,EAAU,MAAM,EAAE,CAE1C,EAAG,EAAK,EAEAE,GAAO,CACbF,EAAU,KAAKE,CAAE,EACjB/E,GAAQ,YAAY4E,EAAO,GAAG,CAChC,IACC,SAAS,KAAK,OAAO,CAAC,GAAI,CAAC,CAAC,EAAKG,GAAO,WAAWA,CAAE,GAExD,OAAO,cAAiB,WACxBjH,EAAWkC,GAAQ,WAAW,CAChC,EAEMgF,GAAO,OAAO,eAAmB,IACrC,eAAe,KAAKhF,EAAO,EAAM,OAAO,QAAY,KAAe,QAAQ,UAAYyE,GAKnFQ,GAAc5H,GAAUA,GAAS,MAAQS,EAAWT,EAAMJ,EAAQ,CAAC,EAGlEiI,EAAQ,CACb,QAAAxH,GACA,cAAAK,GACA,SAAAH,GACA,WAAAkB,GACA,kBAAAd,GACA,SAAAE,GACA,SAAAC,GACA,UAAAE,GACA,SAAAD,GACA,cAAAE,GACA,cAAAE,GACA,iBAAAS,GACA,UAAAC,GACA,WAAAC,GACA,UAAAC,GACA,YAAAzB,GACA,OAAAc,GACA,OAAAC,GACA,OAAAC,GACA,SAAAqE,GACA,WAAAlF,EACA,SAAAe,GACA,kBAAAG,GACA,aAAAkD,GACA,WAAAtD,GACA,QAAAU,GACA,MAAAa,GACA,OAAAM,GACA,KAAApB,GACA,SAAAyB,GACA,SAAAE,GACA,aAAAK,GACA,OAAAlE,GACA,WAAAI,GACA,SAAAqE,GACA,QAAAI,GACA,aAAAI,GACA,SAAAG,GACA,WAAAG,GACA,eAAAK,GACA,WAAYA,GACZ,kBAAAE,GACA,cAAAM,GACA,YAAAE,GACA,YAAAd,GACA,KAAAkB,GACA,eAAAC,GACA,QAAAhE,GACA,OAAQE,GACR,iBAAAC,GACA,oBAAA+D,GACA,aAAAC,GACA,UAAAM,GACA,WAAAC,GACA,aAAcC,GACd,KAAAO,GACA,WAAAC,EACF,EChwBA,SAASE,GAAWC,EAASC,EAAMC,EAAQC,EAASC,EAAU,CAC5D,MAAM,KAAK,IAAI,EAEX,MAAM,kBACR,MAAM,kBAAkB,KAAM,KAAK,WAAW,EAE9C,KAAK,MAAS,IAAI,MAAM,EAAG,MAG7B,KAAK,QAAUJ,EACf,KAAK,KAAO,aACZC,IAAS,KAAK,KAAOA,GACrBC,IAAW,KAAK,OAASA,GACzBC,IAAY,KAAK,QAAUA,GACvBC,IACF,KAAK,SAAWA,EAChB,KAAK,OAASA,EAAS,OAASA,EAAS,OAAS,KAEtD,CAEAC,EAAM,SAASN,GAAY,MAAO,CAChC,OAAQ,UAAkB,CACxB,MAAO,CAEL,QAAS,KAAK,QACd,KAAM,KAAK,KAEX,YAAa,KAAK,YAClB,OAAQ,KAAK,OAEb,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,aAAc,KAAK,aACnB,MAAO,KAAK,MAEZ,OAAQM,EAAM,aAAa,KAAK,MAAM,EACtC,KAAM,KAAK,KACX,OAAQ,KAAK,MACf,CACF,CACF,CAAC,EAED,IAAMC,GAAYP,GAAW,UACvBQ,GAAc,CAAC,EAErB,CACE,uBACA,iBACA,eACA,YACA,cACA,4BACA,iBACA,mBACA,kBACA,eACA,kBACA,iBAEF,EAAE,QAAQN,GAAQ,CAChBM,GAAYN,CAAI,EAAI,CAAC,MAAOA,CAAI,CAClC,CAAC,EAED,OAAO,iBAAiBF,GAAYQ,EAAW,EAC/C,OAAO,eAAeD,GAAW,eAAgB,CAAC,MAAO,EAAI,CAAC,EAG9DP,GAAW,KAAO,CAACS,EAAOP,EAAMC,EAAQC,EAASC,EAAUK,IAAgB,CACzE,IAAMC,EAAa,OAAO,OAAOJ,EAAS,EAE1CD,EAAM,aAAaG,EAAOE,EAAY,SAAgBC,EAAK,CACzD,OAAOA,IAAQ,MAAM,SACvB,EAAGC,GACMA,IAAS,cACjB,EAED,IAAMC,EAAML,GAASA,EAAM,QAAUA,EAAM,QAAU,QAG/CM,EAAUb,GAAQ,MAAQO,EAAQA,EAAM,KAAOP,EACrD,OAAAF,GAAW,KAAKW,EAAYG,EAAKC,EAASZ,EAAQC,EAASC,CAAQ,EAG/DI,GAASE,EAAW,OAAS,MAC/B,OAAO,eAAeA,EAAY,QAAS,CAAE,MAAOF,EAAO,aAAc,EAAK,CAAC,EAGjFE,EAAW,KAAQF,GAASA,EAAM,MAAS,QAE3CC,GAAe,OAAO,OAAOC,EAAYD,CAAW,EAE7CC,CACT,EAEA,IAAOK,EAAQhB,GC7Gf,OAAOiB,OAAc,YAErB,IAAOC,GAAQD,GCYf,SAASE,GAAYC,EAAO,CAC1B,OAAOC,EAAM,cAAcD,CAAK,GAAKC,EAAM,QAAQD,CAAK,CAC1D,CASA,SAASE,GAAeC,EAAK,CAC3B,OAAOF,EAAM,SAASE,EAAK,IAAI,EAAIA,EAAI,MAAM,EAAG,EAAE,EAAIA,CACxD,CAWA,SAASC,GAAUC,EAAMF,EAAKG,EAAM,CAClC,OAAKD,EACEA,EAAK,OAAOF,CAAG,EAAE,IAAI,SAAcI,EAAOC,EAAG,CAElD,OAAAD,EAAQL,GAAeK,CAAK,EACrB,CAACD,GAAQE,EAAI,IAAMD,EAAQ,IAAMA,CAC1C,CAAC,EAAE,KAAKD,EAAO,IAAM,EAAE,EALLH,CAMpB,CASA,SAASM,GAAYC,EAAK,CACxB,OAAOT,EAAM,QAAQS,CAAG,GAAK,CAACA,EAAI,KAAKX,EAAW,CACpD,CAEA,IAAMY,GAAaV,EAAM,aAAaA,EAAO,CAAC,EAAG,KAAM,SAAgBW,EAAM,CAC3E,MAAO,WAAW,KAAKA,CAAI,CAC7B,CAAC,EAyBD,SAASC,GAAWC,EAAKC,EAAUC,EAAS,CAC1C,GAAI,CAACf,EAAM,SAASa,CAAG,EACrB,MAAM,IAAI,UAAU,0BAA0B,EAIhDC,EAAWA,GAAY,IAAKE,IAAoB,UAGhDD,EAAUf,EAAM,aAAae,EAAS,CACpC,WAAY,GACZ,KAAM,GACN,QAAS,EACX,EAAG,GAAO,SAAiBE,EAAQC,EAAQ,CAEzC,MAAO,CAAClB,EAAM,YAAYkB,EAAOD,CAAM,CAAC,CAC1C,CAAC,EAED,IAAME,EAAaJ,EAAQ,WAErBK,EAAUL,EAAQ,SAAWM,EAC7BhB,EAAOU,EAAQ,KACfO,EAAUP,EAAQ,QAElBQ,GADQR,EAAQ,MAAQ,OAAO,KAAS,KAAe,OACpCf,EAAM,oBAAoBc,CAAQ,EAE3D,GAAI,CAACd,EAAM,WAAWoB,CAAO,EAC3B,MAAM,IAAI,UAAU,4BAA4B,EAGlD,SAASI,EAAaC,EAAO,CAC3B,GAAIA,IAAU,KAAM,MAAO,GAE3B,GAAIzB,EAAM,OAAOyB,CAAK,EACpB,OAAOA,EAAM,YAAY,EAG3B,GAAIzB,EAAM,UAAUyB,CAAK,EACvB,OAAOA,EAAM,SAAS,EAGxB,GAAI,CAACF,GAAWvB,EAAM,OAAOyB,CAAK,EAChC,MAAM,IAAIC,EAAW,8CAA8C,EAGrE,OAAI1B,EAAM,cAAcyB,CAAK,GAAKzB,EAAM,aAAayB,CAAK,EACjDF,GAAW,OAAO,MAAS,WAAa,IAAI,KAAK,CAACE,CAAK,CAAC,EAAI,OAAO,KAAKA,CAAK,EAG/EA,CACT,CAYA,SAASJ,EAAeI,EAAOvB,EAAKE,EAAM,CACxC,IAAIK,EAAMgB,EAEV,GAAIA,GAAS,CAACrB,GAAQ,OAAOqB,GAAU,UACrC,GAAIzB,EAAM,SAASE,EAAK,IAAI,EAE1BA,EAAMiB,EAAajB,EAAMA,EAAI,MAAM,EAAG,EAAE,EAExCuB,EAAQ,KAAK,UAAUA,CAAK,UAE3BzB,EAAM,QAAQyB,CAAK,GAAKjB,GAAYiB,CAAK,IACxCzB,EAAM,WAAWyB,CAAK,GAAKzB,EAAM,SAASE,EAAK,IAAI,KAAOO,EAAMT,EAAM,QAAQyB,CAAK,GAGrF,OAAAvB,EAAMD,GAAeC,CAAG,EAExBO,EAAI,QAAQ,SAAckB,EAAIC,EAAO,CACnC,EAAE5B,EAAM,YAAY2B,CAAE,GAAKA,IAAO,OAASb,EAAS,OAElDQ,IAAY,GAAOnB,GAAU,CAACD,CAAG,EAAG0B,EAAOvB,CAAI,EAAKiB,IAAY,KAAOpB,EAAMA,EAAM,KACnFsB,EAAaG,CAAE,CACjB,CACF,CAAC,EACM,GAIX,OAAI7B,GAAY2B,CAAK,EACZ,IAGTX,EAAS,OAAOX,GAAUC,EAAMF,EAAKG,CAAI,EAAGmB,EAAaC,CAAK,CAAC,EAExD,GACT,CAEA,IAAMI,EAAQ,CAAC,EAETC,EAAiB,OAAO,OAAOpB,GAAY,CAC/C,eAAAW,EACA,aAAAG,EACA,YAAA1B,EACF,CAAC,EAED,SAASiC,EAAMN,EAAOrB,EAAM,CAC1B,GAAI,CAAAJ,EAAM,YAAYyB,CAAK,EAE3B,IAAII,EAAM,QAAQJ,CAAK,IAAM,GAC3B,MAAM,MAAM,kCAAoCrB,EAAK,KAAK,GAAG,CAAC,EAGhEyB,EAAM,KAAKJ,CAAK,EAEhBzB,EAAM,QAAQyB,EAAO,SAAcE,EAAIzB,EAAK,EAC3B,EAAEF,EAAM,YAAY2B,CAAE,GAAKA,IAAO,OAASP,EAAQ,KAChEN,EAAUa,EAAI3B,EAAM,SAASE,CAAG,EAAIA,EAAI,KAAK,EAAIA,EAAKE,EAAM0B,CAC9D,KAEe,IACbC,EAAMJ,EAAIvB,EAAOA,EAAK,OAAOF,CAAG,EAAI,CAACA,CAAG,CAAC,CAE7C,CAAC,EAED2B,EAAM,IAAI,EACZ,CAEA,GAAI,CAAC7B,EAAM,SAASa,CAAG,EACrB,MAAM,IAAI,UAAU,wBAAwB,EAG9C,OAAAkB,EAAMlB,CAAG,EAEFC,CACT,CAEA,IAAOkB,GAAQpB,GClNf,SAASqB,GAAOC,EAAK,CACnB,IAAMC,EAAU,CACd,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,MAAO,IACP,MAAO,IACT,EACA,OAAO,mBAAmBD,CAAG,EAAE,QAAQ,mBAAoB,SAAkBE,EAAO,CAClF,OAAOD,EAAQC,CAAK,CACtB,CAAC,CACH,CAUA,SAASC,GAAqBC,EAAQC,EAAS,CAC7C,KAAK,OAAS,CAAC,EAEfD,GAAUE,GAAWF,EAAQ,KAAMC,CAAO,CAC5C,CAEA,IAAME,GAAYJ,GAAqB,UAEvCI,GAAU,OAAS,SAAgBC,EAAMC,EAAO,CAC9C,KAAK,OAAO,KAAK,CAACD,EAAMC,CAAK,CAAC,CAChC,EAEAF,GAAU,SAAW,SAAkBG,EAAS,CAC9C,IAAMC,EAAUD,EAAU,SAASD,EAAO,CACxC,OAAOC,EAAQ,KAAK,KAAMD,EAAOV,EAAM,CACzC,EAAIA,GAEJ,OAAO,KAAK,OAAO,IAAI,SAAca,EAAM,CACzC,OAAOD,EAAQC,EAAK,CAAC,CAAC,EAAI,IAAMD,EAAQC,EAAK,CAAC,CAAC,CACjD,EAAG,EAAE,EAAE,KAAK,GAAG,CACjB,EAEA,IAAOC,GAAQV,GC5Cf,SAASW,GAAOC,EAAK,CACnB,OAAO,mBAAmBA,CAAG,EAC3B,QAAQ,QAAS,GAAG,EACpB,QAAQ,OAAQ,GAAG,EACnB,QAAQ,QAAS,GAAG,EACpB,QAAQ,OAAQ,GAAG,CACvB,CAWe,SAARC,GAA0BC,EAAKC,EAAQC,EAAS,CAErD,GAAI,CAACD,EACH,OAAOD,EAGT,IAAMG,EAAUD,GAAWA,EAAQ,QAAUL,GAEzCO,EAAM,WAAWF,CAAO,IAC1BA,EAAU,CACR,UAAWA,CACb,GAGF,IAAMG,EAAcH,GAAWA,EAAQ,UAEnCI,EAUJ,GARID,EACFC,EAAmBD,EAAYJ,EAAQC,CAAO,EAE9CI,EAAmBF,EAAM,kBAAkBH,CAAM,EAC/CA,EAAO,SAAS,EAChB,IAAIM,GAAqBN,EAAQC,CAAO,EAAE,SAASC,CAAO,EAG1DG,EAAkB,CACpB,IAAME,EAAgBR,EAAI,QAAQ,GAAG,EAEjCQ,IAAkB,KACpBR,EAAMA,EAAI,MAAM,EAAGQ,CAAa,GAElCR,IAAQA,EAAI,QAAQ,GAAG,IAAM,GAAK,IAAM,KAAOM,CACjD,CAEA,OAAON,CACT,CC9DA,IAAMS,GAAN,KAAyB,CACvB,aAAc,CACZ,KAAK,SAAW,CAAC,CACnB,CAUA,IAAIC,EAAWC,EAAUC,EAAS,CAChC,YAAK,SAAS,KAAK,CACjB,UAAAF,EACA,SAAAC,EACA,YAAaC,EAAUA,EAAQ,YAAc,GAC7C,QAASA,EAAUA,EAAQ,QAAU,IACvC,CAAC,EACM,KAAK,SAAS,OAAS,CAChC,CASA,MAAMC,EAAI,CACJ,KAAK,SAASA,CAAE,IAClB,KAAK,SAASA,CAAE,EAAI,KAExB,CAOA,OAAQ,CACF,KAAK,WACP,KAAK,SAAW,CAAC,EAErB,CAYA,QAAQC,EAAI,CACVC,EAAM,QAAQ,KAAK,SAAU,SAAwBC,EAAG,CAClDA,IAAM,MACRF,EAAGE,CAAC,CAER,CAAC,CACH,CACF,EAEOC,GAAQR,GCpEf,IAAOS,GAAQ,CACb,kBAAmB,GACnB,kBAAmB,GACnB,oBAAqB,EACvB,ECNA,OAAOC,OAAY,SCEnB,OAAOC,OAAS,MAChB,IAAOC,GAAQD,GAAI,gBDCnB,IAAME,GAAQ,6BAERC,GAAQ,aAERC,GAAW,CACf,MAAAD,GACA,MAAAD,GACA,YAAaA,GAAQA,GAAM,YAAY,EAAIC,EAC7C,EAEME,GAAiB,CAACC,EAAO,GAAIC,EAAWH,GAAS,cAAgB,CACrE,IAAII,EAAM,GACJ,CAAC,OAAAC,CAAM,EAAIF,EACXG,EAAe,IAAI,YAAYJ,CAAI,EACzCK,GAAO,eAAeD,CAAY,EAClC,QAASE,EAAI,EAAGA,EAAIN,EAAMM,IACxBJ,GAAOD,EAASG,EAAaE,CAAC,EAAIH,CAAM,EAG1C,OAAOD,CACT,EAGOK,GAAQ,CACb,OAAQ,GACR,QAAS,CACP,gBAAAC,GACA,SAAAC,GACA,KAAM,OAAO,KAAS,KAAe,MAAQ,IAC/C,EACA,SAAAX,GACA,eAAAC,GACA,UAAW,CAAE,OAAQ,QAAS,OAAQ,MAAO,CAC/C,EErCA,IAAAW,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,0BAAAC,GAAA,mCAAAC,GAAA,cAAAC,GAAA,WAAAC,KAAA,IAAMJ,GAAgB,OAAO,OAAW,KAAe,OAAO,SAAa,IAErEG,GAAa,OAAO,WAAc,UAAY,WAAa,OAmB3DF,GAAwBD,KAC3B,CAACG,IAAc,CAAC,cAAe,eAAgB,IAAI,EAAE,QAAQA,GAAW,OAAO,EAAI,GAWhFD,GAEF,OAAO,kBAAsB,KAE7B,gBAAgB,mBAChB,OAAO,KAAK,eAAkB,WAI5BE,GAASJ,IAAiB,OAAO,SAAS,MAAQ,mBCvCxD,IAAOK,EAAQ,CACb,GAAGC,GACH,GAAGC,EACL,ECAe,SAARC,GAAkCC,EAAMC,EAAS,CACtD,OAAOC,GAAWF,EAAM,IAAIG,EAAS,QAAQ,gBAAmB,CAC9D,QAAS,SAASC,EAAOC,EAAKC,EAAMC,EAAS,CAC3C,OAAIJ,EAAS,QAAUK,EAAM,SAASJ,CAAK,GACzC,KAAK,OAAOC,EAAKD,EAAM,SAAS,QAAQ,CAAC,EAClC,IAGFG,EAAQ,eAAe,MAAM,KAAM,SAAS,CACrD,EACA,GAAGN,CACL,CAAC,CACH,CCPA,SAASQ,GAAcC,EAAM,CAK3B,OAAOC,EAAM,SAAS,gBAAiBD,CAAI,EAAE,IAAIE,GACxCA,EAAM,CAAC,IAAM,KAAO,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,CACpD,CACH,CASA,SAASC,GAAcC,EAAK,CAC1B,IAAMC,EAAM,CAAC,EACPC,EAAO,OAAO,KAAKF,CAAG,EACxB,EACEG,EAAMD,EAAK,OACbE,EACJ,IAAK,EAAI,EAAG,EAAID,EAAK,IACnBC,EAAMF,EAAK,CAAC,EACZD,EAAIG,CAAG,EAAIJ,EAAII,CAAG,EAEpB,OAAOH,CACT,CASA,SAASI,GAAeC,EAAU,CAChC,SAASC,EAAUC,EAAMC,EAAOC,EAAQC,EAAO,CAC7C,IAAIf,EAAOY,EAAKG,GAAO,EAEvB,GAAIf,IAAS,YAAa,MAAO,GAEjC,IAAMgB,EAAe,OAAO,SAAS,CAAChB,CAAI,EACpCiB,EAASF,GAASH,EAAK,OAG7B,OAFAZ,EAAO,CAACA,GAAQC,EAAM,QAAQa,CAAM,EAAIA,EAAO,OAASd,EAEpDiB,GACEhB,EAAM,WAAWa,EAAQd,CAAI,EAC/Bc,EAAOd,CAAI,EAAI,CAACc,EAAOd,CAAI,EAAGa,CAAK,EAEnCC,EAAOd,CAAI,EAAIa,EAGV,CAACG,KAGN,CAACF,EAAOd,CAAI,GAAK,CAACC,EAAM,SAASa,EAAOd,CAAI,CAAC,KAC/Cc,EAAOd,CAAI,EAAI,CAAC,GAGHW,EAAUC,EAAMC,EAAOC,EAAOd,CAAI,EAAGe,CAAK,GAE3Cd,EAAM,QAAQa,EAAOd,CAAI,CAAC,IACtCc,EAAOd,CAAI,EAAIG,GAAcW,EAAOd,CAAI,CAAC,GAGpC,CAACgB,EACV,CAEA,GAAIf,EAAM,WAAWS,CAAQ,GAAKT,EAAM,WAAWS,EAAS,OAAO,EAAG,CACpE,IAAML,EAAM,CAAC,EAEb,OAAAJ,EAAM,aAAaS,EAAU,CAACV,EAAMa,IAAU,CAC5CF,EAAUZ,GAAcC,CAAI,EAAGa,EAAOR,EAAK,CAAC,CAC9C,CAAC,EAEMA,CACT,CAEA,OAAO,IACT,CAEA,IAAOa,GAAQT,GC1Ef,SAASU,GAAgBC,EAAUC,EAAQC,EAAS,CAClD,GAAIC,EAAM,SAASH,CAAQ,EACzB,GAAI,CACF,OAACC,GAAU,KAAK,OAAOD,CAAQ,EACxBG,EAAM,KAAKH,CAAQ,CAC5B,OAASI,EAAG,CACV,GAAIA,EAAE,OAAS,cACb,MAAMA,CAEV,CAGF,OAAQF,GAAW,KAAK,WAAWF,CAAQ,CAC7C,CAEA,IAAMK,GAAW,CAEf,aAAcC,GAEd,QAAS,CAAC,MAAO,OAAQ,OAAO,EAEhC,iBAAkB,CAAC,SAA0BC,EAAMC,EAAS,CAC1D,IAAMC,EAAcD,EAAQ,eAAe,GAAK,GAC1CE,EAAqBD,EAAY,QAAQ,kBAAkB,EAAI,GAC/DE,EAAkBR,EAAM,SAASI,CAAI,EAQ3C,GANII,GAAmBR,EAAM,WAAWI,CAAI,IAC1CA,EAAO,IAAI,SAASA,CAAI,GAGPJ,EAAM,WAAWI,CAAI,EAGtC,OAAOG,EAAqB,KAAK,UAAUE,GAAeL,CAAI,CAAC,EAAIA,EAGrE,GAAIJ,EAAM,cAAcI,CAAI,GAC1BJ,EAAM,SAASI,CAAI,GACnBJ,EAAM,SAASI,CAAI,GACnBJ,EAAM,OAAOI,CAAI,GACjBJ,EAAM,OAAOI,CAAI,GACjBJ,EAAM,iBAAiBI,CAAI,EAE3B,OAAOA,EAET,GAAIJ,EAAM,kBAAkBI,CAAI,EAC9B,OAAOA,EAAK,OAEd,GAAIJ,EAAM,kBAAkBI,CAAI,EAC9B,OAAAC,EAAQ,eAAe,kDAAmD,EAAK,EACxED,EAAK,SAAS,EAGvB,IAAIM,EAEJ,GAAIF,EAAiB,CACnB,GAAIF,EAAY,QAAQ,mCAAmC,EAAI,GAC7D,OAAOK,GAAiBP,EAAM,KAAK,cAAc,EAAE,SAAS,EAG9D,IAAKM,EAAaV,EAAM,WAAWI,CAAI,IAAME,EAAY,QAAQ,qBAAqB,EAAI,GAAI,CAC5F,IAAMM,EAAY,KAAK,KAAO,KAAK,IAAI,SAEvC,OAAOC,GACLH,EAAa,CAAC,UAAWN,CAAI,EAAIA,EACjCQ,GAAa,IAAIA,EACjB,KAAK,cACP,CACF,CACF,CAEA,OAAIJ,GAAmBD,GACrBF,EAAQ,eAAe,mBAAoB,EAAK,EACzCT,GAAgBQ,CAAI,GAGtBA,CACT,CAAC,EAED,kBAAmB,CAAC,SAA2BA,EAAM,CACnD,IAAMU,EAAe,KAAK,cAAgBZ,GAAS,aAC7Ca,EAAoBD,GAAgBA,EAAa,kBACjDE,EAAgB,KAAK,eAAiB,OAE5C,GAAIhB,EAAM,WAAWI,CAAI,GAAKJ,EAAM,iBAAiBI,CAAI,EACvD,OAAOA,EAGT,GAAIA,GAAQJ,EAAM,SAASI,CAAI,IAAOW,GAAqB,CAAC,KAAK,cAAiBC,GAAgB,CAEhG,IAAMC,EAAoB,EADAH,GAAgBA,EAAa,oBACPE,EAEhD,GAAI,CACF,OAAO,KAAK,MAAMZ,EAAM,KAAK,YAAY,CAC3C,OAASH,EAAG,CACV,GAAIgB,EACF,MAAIhB,EAAE,OAAS,cACPiB,EAAW,KAAKjB,EAAGiB,EAAW,iBAAkB,KAAM,KAAM,KAAK,QAAQ,EAE3EjB,CAEV,CACF,CAEA,OAAOG,CACT,CAAC,EAMD,QAAS,EAET,eAAgB,aAChB,eAAgB,eAEhB,iBAAkB,GAClB,cAAe,GAEf,IAAK,CACH,SAAUe,EAAS,QAAQ,SAC3B,KAAMA,EAAS,QAAQ,IACzB,EAEA,eAAgB,SAAwBC,EAAQ,CAC9C,OAAOA,GAAU,KAAOA,EAAS,GACnC,EAEA,QAAS,CACP,OAAQ,CACN,OAAU,oCACV,eAAgB,MAClB,CACF,CACF,EAEApB,EAAM,QAAQ,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,OAAO,EAAIqB,GAAW,CAC3EnB,GAAS,QAAQmB,CAAM,EAAI,CAAC,CAC9B,CAAC,EAED,IAAOC,GAAQpB,GC1Jf,IAAMqB,GAAoBC,EAAM,YAAY,CAC1C,MAAO,gBAAiB,iBAAkB,eAAgB,OAC1D,UAAW,OAAQ,OAAQ,oBAAqB,sBAChD,gBAAiB,WAAY,eAAgB,sBAC7C,UAAW,cAAe,YAC5B,CAAC,EAgBMC,GAAQC,GAAc,CAC3B,IAAMC,EAAS,CAAC,EACZC,EACAC,EACAC,EAEJ,OAAAJ,GAAcA,EAAW,MAAM;AAAA,CAAI,EAAE,QAAQ,SAAgBK,EAAM,CACjED,EAAIC,EAAK,QAAQ,GAAG,EACpBH,EAAMG,EAAK,UAAU,EAAGD,CAAC,EAAE,KAAK,EAAE,YAAY,EAC9CD,EAAME,EAAK,UAAUD,EAAI,CAAC,EAAE,KAAK,EAE7B,GAACF,GAAQD,EAAOC,CAAG,GAAKL,GAAkBK,CAAG,KAI7CA,IAAQ,aACND,EAAOC,CAAG,EACZD,EAAOC,CAAG,EAAE,KAAKC,CAAG,EAEpBF,EAAOC,CAAG,EAAI,CAACC,CAAG,EAGpBF,EAAOC,CAAG,EAAID,EAAOC,CAAG,EAAID,EAAOC,CAAG,EAAI,KAAOC,EAAMA,EAE3D,CAAC,EAEMF,CACT,ECjDA,IAAMK,GAAa,OAAO,WAAW,EAErC,SAASC,GAAgBC,EAAQ,CAC/B,OAAOA,GAAU,OAAOA,CAAM,EAAE,KAAK,EAAE,YAAY,CACrD,CAEA,SAASC,GAAeC,EAAO,CAC7B,OAAIA,IAAU,IAASA,GAAS,KACvBA,EAGFC,EAAM,QAAQD,CAAK,EAAIA,EAAM,IAAID,EAAc,EAAI,OAAOC,CAAK,CACxE,CAEA,SAASE,GAAYC,EAAK,CACxB,IAAMC,EAAS,OAAO,OAAO,IAAI,EAC3BC,EAAW,mCACbC,EAEJ,KAAQA,EAAQD,EAAS,KAAKF,CAAG,GAC/BC,EAAOE,EAAM,CAAC,CAAC,EAAIA,EAAM,CAAC,EAG5B,OAAOF,CACT,CAEA,IAAMG,GAAqBJ,GAAQ,iCAAiC,KAAKA,EAAI,KAAK,CAAC,EAEnF,SAASK,GAAiBC,EAAST,EAAOF,EAAQY,EAAQC,EAAoB,CAC5E,GAAIV,EAAM,WAAWS,CAAM,EACzB,OAAOA,EAAO,KAAK,KAAMV,EAAOF,CAAM,EAOxC,GAJIa,IACFX,EAAQF,GAGN,EAACG,EAAM,SAASD,CAAK,EAEzB,IAAIC,EAAM,SAASS,CAAM,EACvB,OAAOV,EAAM,QAAQU,CAAM,IAAM,GAGnC,GAAIT,EAAM,SAASS,CAAM,EACvB,OAAOA,EAAO,KAAKV,CAAK,EAE5B,CAEA,SAASY,GAAad,EAAQ,CAC5B,OAAOA,EAAO,KAAK,EAChB,YAAY,EAAE,QAAQ,kBAAmB,CAACe,EAAGC,EAAMX,IAC3CW,EAAK,YAAY,EAAIX,CAC7B,CACL,CAEA,SAASY,GAAeC,EAAKlB,EAAQ,CACnC,IAAMmB,EAAehB,EAAM,YAAY,IAAMH,CAAM,EAEnD,CAAC,MAAO,MAAO,KAAK,EAAE,QAAQoB,GAAc,CAC1C,OAAO,eAAeF,EAAKE,EAAaD,EAAc,CACpD,MAAO,SAASE,EAAMC,EAAMC,EAAM,CAChC,OAAO,KAAKH,CAAU,EAAE,KAAK,KAAMpB,EAAQqB,EAAMC,EAAMC,CAAI,CAC7D,EACA,aAAc,EAChB,CAAC,CACH,CAAC,CACH,CAEA,IAAMC,GAAN,KAAmB,CACjB,YAAYC,EAAS,CACnBA,GAAW,KAAK,IAAIA,CAAO,CAC7B,CAEA,IAAIzB,EAAQ0B,EAAgBC,EAAS,CACnC,IAAMC,EAAO,KAEb,SAASC,EAAUC,EAAQC,EAASC,EAAU,CAC5C,IAAMC,EAAUlC,GAAgBgC,CAAO,EAEvC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,wCAAwC,EAG1D,IAAMC,EAAM/B,EAAM,QAAQyB,EAAMK,CAAO,GAEpC,CAACC,GAAON,EAAKM,CAAG,IAAM,QAAaF,IAAa,IAASA,IAAa,QAAaJ,EAAKM,CAAG,IAAM,MAClGN,EAAKM,GAAOH,CAAO,EAAI9B,GAAe6B,CAAM,EAEhD,CAEA,IAAMK,EAAa,CAACV,EAASO,IAC3B7B,EAAM,QAAQsB,EAAS,CAACK,EAAQC,IAAYF,EAAUC,EAAQC,EAASC,CAAQ,CAAC,EAElF,GAAI7B,EAAM,cAAcH,CAAM,GAAKA,aAAkB,KAAK,YACxDmC,EAAWnC,EAAQ0B,CAAc,UACzBvB,EAAM,SAASH,CAAM,IAAMA,EAASA,EAAO,KAAK,IAAM,CAACS,GAAkBT,CAAM,EACvFmC,EAAWC,GAAapC,CAAM,EAAG0B,CAAc,UACtCvB,EAAM,SAASH,CAAM,GAAKG,EAAM,WAAWH,CAAM,EAAG,CAC7D,IAAIkB,EAAM,CAAC,EAAGmB,EAAMH,EACpB,QAAWI,KAAStC,EAAQ,CAC1B,GAAI,CAACG,EAAM,QAAQmC,CAAK,EACtB,MAAM,UAAU,8CAA8C,EAGhEpB,EAAIgB,EAAMI,EAAM,CAAC,CAAC,GAAKD,EAAOnB,EAAIgB,CAAG,GAClC/B,EAAM,QAAQkC,CAAI,EAAI,CAAC,GAAGA,EAAMC,EAAM,CAAC,CAAC,EAAI,CAACD,EAAMC,EAAM,CAAC,CAAC,EAAKA,EAAM,CAAC,CAC5E,CAEAH,EAAWjB,EAAKQ,CAAc,CAChC,MACE1B,GAAU,MAAQ6B,EAAUH,EAAgB1B,EAAQ2B,CAAO,EAG7D,OAAO,IACT,CAEA,IAAI3B,EAAQuC,EAAQ,CAGlB,GAFAvC,EAASD,GAAgBC,CAAM,EAE3BA,EAAQ,CACV,IAAMkC,EAAM/B,EAAM,QAAQ,KAAMH,CAAM,EAEtC,GAAIkC,EAAK,CACP,IAAMhC,EAAQ,KAAKgC,CAAG,EAEtB,GAAI,CAACK,EACH,OAAOrC,EAGT,GAAIqC,IAAW,GACb,OAAOnC,GAAYF,CAAK,EAG1B,GAAIC,EAAM,WAAWoC,CAAM,EACzB,OAAOA,EAAO,KAAK,KAAMrC,EAAOgC,CAAG,EAGrC,GAAI/B,EAAM,SAASoC,CAAM,EACvB,OAAOA,EAAO,KAAKrC,CAAK,EAG1B,MAAM,IAAI,UAAU,wCAAwC,CAC9D,CACF,CACF,CAEA,IAAIF,EAAQwC,EAAS,CAGnB,GAFAxC,EAASD,GAAgBC,CAAM,EAE3BA,EAAQ,CACV,IAAMkC,EAAM/B,EAAM,QAAQ,KAAMH,CAAM,EAEtC,MAAO,CAAC,EAAEkC,GAAO,KAAKA,CAAG,IAAM,SAAc,CAACM,GAAW9B,GAAiB,KAAM,KAAKwB,CAAG,EAAGA,EAAKM,CAAO,GACzG,CAEA,MAAO,EACT,CAEA,OAAOxC,EAAQwC,EAAS,CACtB,IAAMZ,EAAO,KACTa,EAAU,GAEd,SAASC,EAAaX,EAAS,CAG7B,GAFAA,EAAUhC,GAAgBgC,CAAO,EAE7BA,EAAS,CACX,IAAMG,EAAM/B,EAAM,QAAQyB,EAAMG,CAAO,EAEnCG,IAAQ,CAACM,GAAW9B,GAAiBkB,EAAMA,EAAKM,CAAG,EAAGA,EAAKM,CAAO,KACpE,OAAOZ,EAAKM,CAAG,EAEfO,EAAU,GAEd,CACF,CAEA,OAAItC,EAAM,QAAQH,CAAM,EACtBA,EAAO,QAAQ0C,CAAY,EAE3BA,EAAa1C,CAAM,EAGdyC,CACT,CAEA,MAAMD,EAAS,CACb,IAAMG,EAAO,OAAO,KAAK,IAAI,EACzB,EAAIA,EAAK,OACTF,EAAU,GAEd,KAAO,KAAK,CACV,IAAMP,EAAMS,EAAK,CAAC,GACf,CAACH,GAAW9B,GAAiB,KAAM,KAAKwB,CAAG,EAAGA,EAAKM,EAAS,EAAI,KACjE,OAAO,KAAKN,CAAG,EACfO,EAAU,GAEd,CAEA,OAAOA,CACT,CAEA,UAAUG,EAAQ,CAChB,IAAMhB,EAAO,KACPH,EAAU,CAAC,EAEjB,OAAAtB,EAAM,QAAQ,KAAM,CAACD,EAAOF,IAAW,CACrC,IAAMkC,EAAM/B,EAAM,QAAQsB,EAASzB,CAAM,EAEzC,GAAIkC,EAAK,CACPN,EAAKM,CAAG,EAAIjC,GAAeC,CAAK,EAChC,OAAO0B,EAAK5B,CAAM,EAClB,MACF,CAEA,IAAM6C,EAAaD,EAAS9B,GAAad,CAAM,EAAI,OAAOA,CAAM,EAAE,KAAK,EAEnE6C,IAAe7C,GACjB,OAAO4B,EAAK5B,CAAM,EAGpB4B,EAAKiB,CAAU,EAAI5C,GAAeC,CAAK,EAEvCuB,EAAQoB,CAAU,EAAI,EACxB,CAAC,EAEM,IACT,CAEA,UAAUC,EAAS,CACjB,OAAO,KAAK,YAAY,OAAO,KAAM,GAAGA,CAAO,CACjD,CAEA,OAAOC,EAAW,CAChB,IAAM7B,EAAM,OAAO,OAAO,IAAI,EAE9B,OAAAf,EAAM,QAAQ,KAAM,CAACD,EAAOF,IAAW,CACrCE,GAAS,MAAQA,IAAU,KAAUgB,EAAIlB,CAAM,EAAI+C,GAAa5C,EAAM,QAAQD,CAAK,EAAIA,EAAM,KAAK,IAAI,EAAIA,EAC5G,CAAC,EAEMgB,CACT,CAEA,CAAC,OAAO,QAAQ,GAAI,CAClB,OAAO,OAAO,QAAQ,KAAK,OAAO,CAAC,EAAE,OAAO,QAAQ,EAAE,CACxD,CAEA,UAAW,CACT,OAAO,OAAO,QAAQ,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,CAAClB,EAAQE,CAAK,IAAMF,EAAS,KAAOE,CAAK,EAAE,KAAK;AAAA,CAAI,CAChG,CAEA,cAAe,CACb,OAAO,KAAK,IAAI,YAAY,GAAK,CAAC,CACpC,CAEA,IAAK,OAAO,WAAW,GAAI,CACzB,MAAO,cACT,CAEA,OAAO,KAAK8C,EAAO,CACjB,OAAOA,aAAiB,KAAOA,EAAQ,IAAI,KAAKA,CAAK,CACvD,CAEA,OAAO,OAAOC,KAAUH,EAAS,CAC/B,IAAMI,EAAW,IAAI,KAAKD,CAAK,EAE/B,OAAAH,EAAQ,QAASK,GAAWD,EAAS,IAAIC,CAAM,CAAC,EAEzCD,CACT,CAEA,OAAO,SAASlD,EAAQ,CAKtB,IAAMoD,GAJY,KAAKtD,EAAU,EAAK,KAAKA,EAAU,EAAI,CACvD,UAAW,CAAC,CACd,GAE4B,UACtBuD,EAAY,KAAK,UAEvB,SAASC,EAAevB,EAAS,CAC/B,IAAME,EAAUlC,GAAgBgC,CAAO,EAElCqB,EAAUnB,CAAO,IACpBhB,GAAeoC,EAAWtB,CAAO,EACjCqB,EAAUnB,CAAO,EAAI,GAEzB,CAEA,OAAA9B,EAAM,QAAQH,CAAM,EAAIA,EAAO,QAAQsD,CAAc,EAAIA,EAAetD,CAAM,EAEvE,IACT,CACF,EAEAwB,GAAa,SAAS,CAAC,eAAgB,iBAAkB,SAAU,kBAAmB,aAAc,eAAe,CAAC,EAGpHrB,EAAM,kBAAkBqB,GAAa,UAAW,CAAC,CAAC,MAAAtB,CAAK,EAAGgC,IAAQ,CAChE,IAAIqB,EAASrB,EAAI,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAC/C,MAAO,CACL,IAAK,IAAMhC,EACX,IAAIsD,EAAa,CACf,KAAKD,CAAM,EAAIC,CACjB,CACF,CACF,CAAC,EAEDrD,EAAM,cAAcqB,EAAY,EAEhC,IAAOiC,EAAQjC,GC3SA,SAARkC,GAA+BC,EAAKC,EAAU,CACnD,IAAMC,EAAS,MAAQC,GACjBC,EAAUH,GAAYC,EACtBG,EAAUC,EAAa,KAAKF,EAAQ,OAAO,EAC7CG,EAAOH,EAAQ,KAEnB,OAAAI,EAAM,QAAQR,EAAK,SAAmBS,EAAI,CACxCF,EAAOE,EAAG,KAAKP,EAAQK,EAAMF,EAAQ,UAAU,EAAGJ,EAAWA,EAAS,OAAS,MAAS,CAC1F,CAAC,EAEDI,EAAQ,UAAU,EAEXE,CACT,CCzBe,SAARG,GAA0BC,EAAO,CACtC,MAAO,CAAC,EAAEA,GAASA,EAAM,WAC3B,CCUA,SAASC,GAAcC,EAASC,EAAQC,EAAS,CAE/CC,EAAW,KAAK,KAAMH,GAAkB,WAAsBG,EAAW,aAAcF,EAAQC,CAAO,EACtG,KAAK,KAAO,eACd,CAEAE,EAAM,SAASL,GAAeI,EAAY,CACxC,WAAY,EACd,CAAC,EAED,IAAOE,GAAQN,GCXA,SAARO,GAAwBC,EAASC,EAAQC,EAAU,CACxD,IAAMC,EAAiBD,EAAS,OAAO,eACnC,CAACA,EAAS,QAAU,CAACC,GAAkBA,EAAeD,EAAS,MAAM,EACvEF,EAAQE,CAAQ,EAEhBD,EAAO,IAAIG,EACT,mCAAqCF,EAAS,OAC9C,CAACE,EAAW,gBAAiBA,EAAW,gBAAgB,EAAE,KAAK,MAAMF,EAAS,OAAS,GAAG,EAAI,CAAC,EAC/FA,EAAS,OACTA,EAAS,QACTA,CACF,CAAC,CAEL,CCjBe,SAARG,GAA+BC,EAAK,CAIzC,MAAO,8BAA8B,KAAKA,CAAG,CAC/C,CCJe,SAARC,GAA6BC,EAASC,EAAa,CACxD,OAAOA,EACHD,EAAQ,QAAQ,SAAU,EAAE,EAAI,IAAMC,EAAY,QAAQ,OAAQ,EAAE,EACpED,CACN,CCCe,SAARE,GAA+BC,EAASC,EAAcC,EAAmB,CAC9E,IAAIC,EAAgB,CAACC,GAAcH,CAAY,EAC/C,OAAID,IAAYG,GAAiBD,GAAqB,IAC7CG,GAAYL,EAASC,CAAY,EAEnCA,CACT,CCfA,OAAOK,OAAkB,iBACzB,OAAOC,OAAU,OACjB,OAAOC,OAAW,QAClB,OAAOC,OAAU,OACjB,OAAOC,OAAqB,mBAC5B,OAAOC,OAAU,OCXV,IAAMC,GAAU,SCER,SAARC,GAA+BC,EAAK,CACzC,IAAMC,EAAQ,4BAA4B,KAAKD,CAAG,EAClD,OAAOC,GAASA,EAAM,CAAC,GAAK,EAC9B,CCCA,IAAMC,GAAmB,gDAYV,SAARC,GAA6BC,EAAKC,EAAQC,EAAS,CACxD,IAAMC,EAAQD,GAAWA,EAAQ,MAAQE,EAAS,QAAQ,KACpDC,EAAWC,GAAcN,CAAG,EAMlC,GAJIC,IAAW,QAAaE,IAC1BF,EAAS,IAGPI,IAAa,OAAQ,CACvBL,EAAMK,EAAS,OAASL,EAAI,MAAMK,EAAS,OAAS,CAAC,EAAIL,EAEzD,IAAMO,EAAQT,GAAiB,KAAKE,CAAG,EAEvC,GAAI,CAACO,EACH,MAAM,IAAIC,EAAW,cAAeA,EAAW,eAAe,EAGhE,IAAMC,EAAOF,EAAM,CAAC,EACdG,EAAWH,EAAM,CAAC,EAClBI,EAAOJ,EAAM,CAAC,EACdK,EAAS,OAAO,KAAK,mBAAmBD,CAAI,EAAGD,EAAW,SAAW,MAAM,EAEjF,GAAIT,EAAQ,CACV,GAAI,CAACE,EACH,MAAM,IAAIK,EAAW,wBAAyBA,EAAW,eAAe,EAG1E,OAAO,IAAIL,EAAM,CAACS,CAAM,EAAG,CAAC,KAAMH,CAAI,CAAC,CACzC,CAEA,OAAOG,CACT,CAEA,MAAM,IAAIJ,EAAW,wBAA0BH,EAAUG,EAAW,eAAe,CACrF,CHlCA,OAAOK,OAAY,SIhBnB,OAAOC,OAAY,SAGnB,IAAMC,GAAa,OAAO,WAAW,EAE/BC,GAAN,cAAmCC,GAAO,SAAS,CACjD,YAAYC,EAAS,CACnBA,EAAUC,EAAM,aAAaD,EAAS,CACpC,QAAS,EACT,UAAW,GAAK,KAChB,aAAc,IACd,WAAY,IACZ,UAAW,EACX,aAAc,EAChB,EAAG,KAAM,CAACE,EAAMC,IACP,CAACF,EAAM,YAAYE,EAAOD,CAAI,CAAC,CACvC,EAED,MAAM,CACJ,sBAAuBF,EAAQ,SACjC,CAAC,EAED,IAAMI,EAAY,KAAKP,EAAU,EAAI,CACnC,WAAYG,EAAQ,WACpB,UAAWA,EAAQ,UACnB,QAASA,EAAQ,QACjB,aAAcA,EAAQ,aACtB,UAAW,EACX,WAAY,GACZ,oBAAqB,EACrB,GAAI,KAAK,IAAI,EACb,MAAO,EACP,eAAgB,IAClB,EAEA,KAAK,GAAG,cAAeK,GAAS,CAC1BA,IAAU,aACPD,EAAU,aACbA,EAAU,WAAa,IAG7B,CAAC,CACH,CAEA,MAAME,EAAM,CACV,IAAMF,EAAY,KAAKP,EAAU,EAEjC,OAAIO,EAAU,gBACZA,EAAU,eAAe,EAGpB,MAAM,MAAME,CAAI,CACzB,CAEA,WAAWC,EAAOC,EAAUC,EAAU,CACpC,IAAML,EAAY,KAAKP,EAAU,EAC3Ba,EAAUN,EAAU,QAEpBO,EAAwB,KAAK,sBAE7BC,EAAaR,EAAU,WAEvBS,EAAU,IAAOD,EACjBE,EAAkBJ,EAAUG,EAC5BE,EAAeX,EAAU,eAAiB,GAAQ,KAAK,IAAIA,EAAU,aAAcU,EAAiB,GAAI,EAAI,EAE5GE,EAAY,CAACC,EAAQC,IAAc,CACvC,IAAMC,EAAQ,OAAO,WAAWF,CAAM,EACtCb,EAAU,WAAae,EACvBf,EAAU,OAASe,EAEnBf,EAAU,YAAc,KAAK,KAAK,WAAYA,EAAU,SAAS,EAE7D,KAAK,KAAKa,CAAM,EAClB,QAAQ,SAASC,CAAS,EAE1Bd,EAAU,eAAiB,IAAM,CAC/BA,EAAU,eAAiB,KAC3B,QAAQ,SAASc,CAAS,CAC5B,CAEJ,EAEME,EAAiB,CAACH,EAAQC,IAAc,CAC5C,IAAMG,EAAY,OAAO,WAAWJ,CAAM,EACtCK,EAAiB,KACjBC,EAAeZ,EACfa,EACAC,EAAS,EAEb,GAAIf,EAAS,CACX,IAAMgB,EAAM,KAAK,IAAI,GAEjB,CAACtB,EAAU,KAAOqB,EAAUC,EAAMtB,EAAU,KAAQQ,KACtDR,EAAU,GAAKsB,EACfF,EAAYV,EAAiBV,EAAU,MACvCA,EAAU,MAAQoB,EAAY,EAAI,CAACA,EAAY,EAC/CC,EAAS,GAGXD,EAAYV,EAAiBV,EAAU,KACzC,CAEA,GAAIM,EAAS,CACX,GAAIc,GAAa,EAEf,OAAO,WAAW,IAAM,CACtBN,EAAU,KAAMD,CAAM,CACxB,EAAGL,EAAaa,CAAM,EAGpBD,EAAYD,IACdA,EAAeC,EAEnB,CAEID,GAAgBF,EAAYE,GAAiBF,EAAYE,EAAgBR,IAC3EO,EAAiBL,EAAO,SAASM,CAAY,EAC7CN,EAASA,EAAO,SAAS,EAAGM,CAAY,GAG1CP,EAAUC,EAAQK,EAAiB,IAAM,CACvC,QAAQ,SAASJ,EAAW,KAAMI,CAAc,CAClD,EAAIJ,CAAS,CACf,EAEAE,EAAeb,EAAO,SAASoB,EAAmBC,EAAKX,EAAQ,CAC7D,GAAIW,EACF,OAAOnB,EAASmB,CAAG,EAGjBX,EACFG,EAAeH,EAAQU,CAAkB,EAEzClB,EAAS,IAAI,CAEjB,CAAC,CACH,CACF,EAEOoB,GAAQ/B,GJzHf,OAAQ,gBAAAgC,OAAmB,SKrB3B,OAAOC,OAAU,OACjB,OAAQ,YAAAC,OAAe,SCDvB,GAAM,CAAC,cAAAC,EAAa,EAAI,OAElBC,GAAW,gBAAiBC,EAAM,CAClCA,EAAK,OACP,MAAOA,EAAK,OAAO,EACVA,EAAK,YACd,MAAM,MAAMA,EAAK,YAAY,EACpBA,EAAKF,EAAa,EAC3B,MAAOE,EAAKF,EAAa,EAAE,EAE3B,MAAME,CAEV,EAEOC,GAAQF,GDRf,IAAMG,GAAoBC,EAAS,SAAS,YAAc,KAEpDC,GAAc,OAAO,aAAgB,WAAa,IAAI,YAAgB,IAAIC,GAAK,YAE/EC,GAAO;AAAA,EACPC,GAAaH,GAAY,OAAOE,EAAI,EACpCE,GAAmB,EAEnBC,GAAN,KAAmB,CACjB,YAAYC,EAAMC,EAAO,CACvB,GAAM,CAAC,WAAAC,CAAU,EAAI,KAAK,YACpBC,EAAgBC,EAAM,SAASH,CAAK,EAEtCI,EAAU,yCAAyCH,EAAWF,CAAI,CAAC,IACrE,CAACG,GAAiBF,EAAM,KAAO,eAAeC,EAAWD,EAAM,IAAI,CAAC,IAAM,EAC5E,GAAGL,EAAI,GAEHO,EACFF,EAAQP,GAAY,OAAO,OAAOO,CAAK,EAAE,QAAQ,eAAgBL,EAAI,CAAC,EAEtES,GAAW,iBAAiBJ,EAAM,MAAQ,0BAA0B,GAAGL,EAAI,GAG7E,KAAK,QAAUF,GAAY,OAAOW,EAAUT,EAAI,EAEhD,KAAK,cAAgBO,EAAgBF,EAAM,WAAaA,EAAM,KAE9D,KAAK,KAAO,KAAK,QAAQ,WAAa,KAAK,cAAgBH,GAE3D,KAAK,KAAOE,EACZ,KAAK,MAAQC,CACf,CAEA,MAAO,QAAQ,CACb,MAAM,KAAK,QAEX,GAAM,CAAC,MAAAA,CAAK,EAAI,KAEbG,EAAM,aAAaH,CAAK,EACzB,MAAMA,EAEN,MAAOK,GAASL,CAAK,EAGvB,MAAMJ,EACR,CAEA,OAAO,WAAWG,EAAM,CACpB,OAAO,OAAOA,CAAI,EAAE,QAAQ,WAAaO,IAAW,CAClD,KAAO,MACP,KAAO,MACP,IAAM,KACR,GAAEA,CAAK,CAAE,CACb,CACF,EAEMC,GAAmB,CAACC,EAAMC,EAAgBC,IAAY,CAC1D,GAAM,CACJ,IAAAC,EAAM,qBACN,KAAAC,EAAO,GACP,SAAAC,EAAWF,EAAM,IAAMnB,EAAS,eAAeoB,EAAMrB,EAAiB,CACxE,EAAImB,GAAW,CAAC,EAEhB,GAAG,CAACP,EAAM,WAAWK,CAAI,EACvB,MAAM,UAAU,4BAA4B,EAG9C,GAAIK,EAAS,OAAS,GAAKA,EAAS,OAAS,GAC3C,MAAM,MAAM,wCAAwC,EAGtD,IAAMC,EAAgBrB,GAAY,OAAO,KAAOoB,EAAWlB,EAAI,EACzDoB,EAActB,GAAY,OAAO,KAAOoB,EAAW,KAAOlB,EAAI,EAChEqB,EAAgBD,EAAY,WAE1BE,EAAQ,MAAM,KAAKT,EAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAACT,EAAMC,CAAK,IAAM,CAC9D,IAAMkB,EAAO,IAAIpB,GAAaC,EAAMC,CAAK,EACzC,OAAAgB,GAAiBE,EAAK,KACfA,CACT,CAAC,EAEDF,GAAiBF,EAAc,WAAaG,EAAM,OAElDD,EAAgBb,EAAM,eAAea,CAAa,EAElD,IAAMG,EAAkB,CACtB,eAAgB,iCAAiCN,CAAQ,EAC3D,EAEA,OAAI,OAAO,SAASG,CAAa,IAC/BG,EAAgB,gBAAgB,EAAIH,GAGtCP,GAAkBA,EAAeU,CAAe,EAEzCC,GAAS,KAAM,iBAAmB,CACvC,QAAUF,KAAQD,EAChB,MAAMH,EACN,MAAOI,EAAK,OAAO,EAGrB,MAAMH,CACR,EAAG,CAAC,CACN,EAEOM,GAAQd,GE7Gf,OAAOe,OAAY,SAEnB,IAAMC,GAAN,cAAwCD,GAAO,SAAU,CACvD,YAAYE,EAAOC,EAAUC,EAAU,CACrC,KAAK,KAAKF,CAAK,EACfE,EAAS,CACX,CAEA,WAAWF,EAAOC,EAAUC,EAAU,CACpC,GAAIF,EAAM,SAAW,IACnB,KAAK,WAAa,KAAK,YAGnBA,EAAM,CAAC,IAAM,KAAK,CACpB,IAAMG,EAAS,OAAO,MAAM,CAAC,EAC7BA,EAAO,CAAC,EAAI,IACZA,EAAO,CAAC,EAAI,IACZ,KAAK,KAAKA,EAAQF,CAAQ,CAC5B,CAGF,KAAK,YAAYD,EAAOC,EAAUC,CAAQ,CAC5C,CACF,EAEOE,GAAQL,GCzBf,IAAMM,GAAc,CAACC,EAAIC,IAChBC,EAAM,UAAUF,CAAE,EAAI,YAAaG,EAAM,CAC9C,IAAMC,EAAKD,EAAK,IAAI,EACpBH,EAAG,MAAM,KAAMG,CAAI,EAAE,KAAME,GAAU,CACnC,GAAI,CACFJ,EAAUG,EAAG,KAAM,GAAGH,EAAQI,CAAK,CAAC,EAAID,EAAG,KAAMC,CAAK,CACxD,OAASC,EAAK,CACZF,EAAGE,CAAG,CACR,CACF,EAAGF,CAAE,CACP,EAAIJ,EAGCO,GAAQR,GCPf,SAASS,GAAYC,EAAcC,EAAK,CACtCD,EAAeA,GAAgB,GAC/B,IAAME,EAAQ,IAAI,MAAMF,CAAY,EAC9BG,EAAa,IAAI,MAAMH,CAAY,EACrCI,EAAO,EACPC,EAAO,EACPC,EAEJ,OAAAL,EAAMA,IAAQ,OAAYA,EAAM,IAEzB,SAAcM,EAAa,CAChC,IAAMC,EAAM,KAAK,IAAI,EAEfC,EAAYN,EAAWE,CAAI,EAE5BC,IACHA,EAAgBE,GAGlBN,EAAME,CAAI,EAAIG,EACdJ,EAAWC,CAAI,EAAII,EAEnB,IAAIE,EAAIL,EACJM,EAAa,EAEjB,KAAOD,IAAMN,GACXO,GAAcT,EAAMQ,GAAG,EACvBA,EAAIA,EAAIV,EASV,GANAI,GAAQA,EAAO,GAAKJ,EAEhBI,IAASC,IACXA,GAAQA,EAAO,GAAKL,GAGlBQ,EAAMF,EAAgBL,EACxB,OAGF,IAAMW,EAASH,GAAaD,EAAMC,EAElC,OAAOG,EAAS,KAAK,MAAMD,EAAa,IAAOC,CAAM,EAAI,MAC3D,CACF,CAEA,IAAOC,GAAQd,GChDf,SAASe,GAASC,EAAIC,EAAM,CAC1B,IAAIC,EAAY,EACZC,EAAY,IAAOF,EACnBG,EACAC,EAEEC,EAAS,CAACC,EAAMC,EAAM,KAAK,IAAI,IAAM,CACzCN,EAAYM,EACZJ,EAAW,KACPC,IACF,aAAaA,CAAK,EAClBA,EAAQ,MAEVL,EAAG,GAAGO,CAAI,CACZ,EAoBA,MAAO,CAlBW,IAAIA,IAAS,CAC7B,IAAMC,EAAM,KAAK,IAAI,EACfC,EAASD,EAAMN,EAChBO,GAAUN,EACbG,EAAOC,EAAMC,CAAG,GAEhBJ,EAAWG,EACNF,IACHA,EAAQ,WAAW,IAAM,CACvBA,EAAQ,KACRC,EAAOF,CAAQ,CACjB,EAAGD,EAAYM,CAAM,GAG3B,EAEc,IAAML,GAAYE,EAAOF,CAAQ,CAEvB,CAC1B,CAEA,IAAOM,GAAQX,GCvCR,IAAMY,GAAuB,CAACC,EAAUC,EAAkBC,EAAO,IAAM,CAC5E,IAAIC,EAAgB,EACdC,EAAeC,GAAY,GAAI,GAAG,EAExC,OAAOC,GAASC,GAAK,CACnB,IAAMC,EAASD,EAAE,OACXE,EAAQF,EAAE,iBAAmBA,EAAE,MAAQ,OACvCG,EAAgBF,EAASL,EACzBQ,EAAOP,EAAaM,CAAa,EACjCE,EAAUJ,GAAUC,EAE1BN,EAAgBK,EAEhB,IAAMK,EAAO,CACX,OAAAL,EACA,MAAAC,EACA,SAAUA,EAASD,EAASC,EAAS,OACrC,MAAOC,EACP,KAAMC,GAAc,OACpB,UAAWA,GAAQF,GAASG,GAAWH,EAAQD,GAAUG,EAAO,OAChE,MAAOJ,EACP,iBAAkBE,GAAS,KAC3B,CAACR,EAAmB,WAAa,QAAQ,EAAG,EAC9C,EAEAD,EAASa,CAAI,CACf,EAAGX,CAAI,CACT,EAEaY,GAAyB,CAACL,EAAOM,IAAc,CAC1D,IAAMC,EAAmBP,GAAS,KAElC,MAAO,CAAED,GAAWO,EAAU,CAAC,EAAE,CAC/B,iBAAAC,EACA,MAAAP,EACA,OAAAD,CACF,CAAC,EAAGO,EAAU,CAAC,CAAC,CAClB,EAEaE,GAAkBC,GAAO,IAAIC,IAASC,EAAM,KAAK,IAAMF,EAAG,GAAGC,CAAI,CAAC,EClChE,SAARE,GAA6CC,EAAK,CAEvD,GADI,CAACA,GAAO,OAAOA,GAAQ,UACvB,CAACA,EAAI,WAAW,OAAO,EAAG,MAAO,GAErC,IAAMC,EAAQD,EAAI,QAAQ,GAAG,EAC7B,GAAIC,EAAQ,EAAG,MAAO,GAEtB,IAAMC,EAAOF,EAAI,MAAM,EAAGC,CAAK,EACzBE,EAAOH,EAAI,MAAMC,EAAQ,CAAC,EAGhC,GAFiB,WAAW,KAAKC,CAAI,EAEvB,CACZ,IAAIE,EAAeD,EAAK,OAClBE,EAAMF,EAAK,OAEjB,QAASG,EAAI,EAAGA,EAAID,EAAKC,IACvB,GAAIH,EAAK,WAAWG,CAAC,IAAM,IAAgBA,EAAI,EAAID,EAAK,CACtD,IAAME,EAAIJ,EAAK,WAAWG,EAAI,CAAC,EACzBE,EAAIL,EAAK,WAAWG,EAAI,CAAC,GAE3BC,GAAK,IAAMA,GAAK,IAAQA,GAAK,IAAMA,GAAK,IAAQA,GAAK,IAAMA,GAAK,OAChEC,GAAK,IAAMA,GAAK,IAAQA,GAAK,IAAMA,GAAK,IAAQA,GAAK,IAAMA,GAAK,OAGlEJ,GAAgB,EAChBE,GAAK,EAET,CAGF,IAAIG,EAAM,EACNC,EAAML,EAAM,EAEVM,EAAeC,GACnBA,GAAK,GACLT,EAAK,WAAWS,EAAI,CAAC,IAAM,IAC3BT,EAAK,WAAWS,EAAI,CAAC,IAAM,KAC1BT,EAAK,WAAWS,CAAC,IAAM,IAAMT,EAAK,WAAWS,CAAC,IAAM,KAEnDF,GAAO,IACLP,EAAK,WAAWO,CAAG,IAAM,IAC3BD,IACAC,KACSC,EAAYD,CAAG,IACxBD,IACAC,GAAO,IAIPD,IAAQ,GAAKC,GAAO,IAClBP,EAAK,WAAWO,CAAG,IAAM,IAElBC,EAAYD,CAAG,IACxBD,IAKJ,IAAMI,EADS,KAAK,MAAMT,EAAe,CAAC,EACnB,GAAKK,GAAO,GACnC,OAAOI,EAAQ,EAAIA,EAAQ,CAC7B,CAEA,OAAO,OAAO,WAAWV,EAAM,MAAM,CACvC,CZ3CA,IAAMW,GAAc,CAClB,MAAOC,GAAK,UAAU,aACtB,YAAaA,GAAK,UAAU,YAC9B,EAEMC,GAAgB,CACpB,MAAOD,GAAK,UAAU,uBACtB,YAAaA,GAAK,UAAU,sBAC9B,EAEME,GAAoBC,EAAM,WAAWH,GAAK,sBAAsB,EAEhE,CAAC,KAAMI,GAAY,MAAOC,EAAW,EAAIC,GAEzCC,GAAU,UAEVC,GAAqBC,EAAS,UAAU,IAAIC,GACzCA,EAAW,GACnB,EAGKC,GAAgB,CAACC,EAAQ,CAACC,EAAWC,CAAK,KAC9CF,EACG,GAAG,MAAOE,CAAK,EACf,GAAG,QAASA,CAAK,EAEbD,GAYT,SAASE,GAAuBC,EAASC,EAAiB,CACpDD,EAAQ,gBAAgB,OAC1BA,EAAQ,gBAAgB,MAAMA,CAAO,EAEnCA,EAAQ,gBAAgB,QAC1BA,EAAQ,gBAAgB,OAAOA,EAASC,CAAe,CAE3D,CAWA,SAASC,GAASF,EAASG,EAAaC,EAAU,CAChD,IAAIC,EAAQF,EACZ,GAAI,CAACE,GAASA,IAAU,GAAO,CAC7B,IAAMC,EAAWC,GAAa,eAAeH,CAAQ,EACjDE,IACFD,EAAQ,IAAI,IAAIC,CAAQ,EAE5B,CACA,GAAID,EAAO,CAMT,GAJIA,EAAM,WACRA,EAAM,MAAQA,EAAM,UAAY,IAAM,KAAOA,EAAM,UAAY,KAG7DA,EAAM,KAAM,EAEVA,EAAM,KAAK,UAAYA,EAAM,KAAK,YACpCA,EAAM,MAAQA,EAAM,KAAK,UAAY,IAAM,KAAOA,EAAM,KAAK,UAAY,KAE3E,IAAMG,EAAS,OACZ,KAAKH,EAAM,KAAM,MAAM,EACvB,SAAS,QAAQ,EACpBL,EAAQ,QAAQ,qBAAqB,EAAI,SAAWQ,CACtD,CAEAR,EAAQ,QAAQ,KAAOA,EAAQ,UAAYA,EAAQ,KAAO,IAAMA,EAAQ,KAAO,IAC/E,IAAMS,EAAYJ,EAAM,UAAYA,EAAM,KAC1CL,EAAQ,SAAWS,EAEnBT,EAAQ,KAAOS,EACfT,EAAQ,KAAOK,EAAM,KACrBL,EAAQ,KAAOI,EACXC,EAAM,WACRL,EAAQ,SAAWK,EAAM,SAAS,SAAS,GAAG,EAAIA,EAAM,SAAW,GAAGA,EAAM,QAAQ,IAExF,CAEAL,EAAQ,gBAAgB,MAAQ,SAAwBU,EAAiB,CAGvER,GAASQ,EAAiBP,EAAaO,EAAgB,IAAI,CAC7D,CACF,CAEA,IAAMC,GAAyB,OAAO,QAAY,KAAexB,EAAM,OAAO,OAAO,IAAM,UAIrFyB,GAAaC,GACV,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,IAAIC,EACAC,EAEEC,EAAO,CAACC,EAAOC,IAAe,CAC9BH,IACJA,EAAS,GACTD,GAAUA,EAAOG,EAAOC,CAAU,EACpC,EAEMC,EAAYF,GAAU,CAC1BD,EAAKC,CAAK,EACVL,EAAQK,CAAK,CACf,EAEMG,EAAWC,GAAW,CAC1BL,EAAKK,EAAQ,EAAI,EACjBR,EAAOQ,CAAM,CACf,EAEAV,EAAcQ,EAAUC,EAAUE,GAAmBR,EAASQ,CAAc,EAAE,MAAMF,CAAO,CAC7F,CAAC,EAGGG,GAAgB,CAAC,CAAC,QAAAC,EAAS,OAAAC,CAAM,IAAM,CAC3C,GAAI,CAACxC,EAAM,SAASuC,CAAO,EACzB,MAAM,UAAU,0BAA0B,EAE5C,MAAQ,CACN,QAAAA,EACA,OAAQC,IAAWD,EAAQ,QAAQ,GAAG,EAAI,EAAI,EAAI,EACpD,CACF,EAEME,GAAoB,CAACF,EAASC,IAAWF,GAActC,EAAM,SAASuC,CAAO,EAAIA,EAAU,CAAC,QAAAA,EAAS,OAAAC,CAAM,CAAC,EAG3GE,GAAQlB,IAA0B,SAAqBmB,EAAQ,CACpE,OAAOlB,GAAU,eAAmCE,EAASC,EAAQC,EAAQ,CAC3E,GAAI,CAAC,KAAAe,EAAM,OAAAC,EAAQ,OAAAL,CAAM,EAAIG,EACvB,CAAC,aAAAG,EAAc,iBAAAC,CAAgB,EAAIJ,EACnCK,EAASL,EAAO,OAAO,YAAY,EACrCb,EACAmB,EAAW,GACXC,EAEJ,GAAIL,EAAQ,CACV,IAAMM,EAAUC,GAAYP,EAASb,GAAUhC,EAAM,QAAQgC,CAAK,EAAIA,EAAQ,CAACA,CAAK,CAAC,EAErFa,EAAS,CAACQ,EAAUC,EAAKC,IAAO,CAC9BJ,EAAQE,EAAUC,EAAK,CAACE,EAAKC,GAAMC,KAAS,CAC1C,GAAIF,EACF,OAAOD,EAAGC,CAAG,EAGf,IAAMG,GAAY3D,EAAM,QAAQyD,EAAI,EAAIA,GAAK,IAAIG,IAAQnB,GAAkBmB,EAAI,CAAC,EAAI,CAACnB,GAAkBgB,GAAMC,EAAI,CAAC,EAElHJ,EAAI,IAAMC,EAAGC,EAAKG,EAAS,EAAIJ,EAAGC,EAAKG,GAAU,CAAC,EAAE,QAASA,GAAU,CAAC,EAAE,MAAM,CAClF,CAAC,CACH,CACF,CAGA,IAAME,EAAU,IAAIC,GAEdC,EAAa,IAAM,CACnBpB,EAAO,aACTA,EAAO,YAAY,YAAYqB,CAAK,EAGlCrB,EAAO,QACTA,EAAO,OAAO,oBAAoB,QAASqB,CAAK,EAGlDH,EAAQ,mBAAmB,CAC7B,EAEAhC,EAAO,CAACG,EAAOC,IAAe,CAC5BH,EAAS,GACLG,IACFgB,EAAW,GACXc,EAAW,EAEf,CAAC,EAED,SAASC,EAAM5B,EAAQ,CACrByB,EAAQ,KAAK,QAAS,CAACzB,GAAUA,EAAO,KAAO,IAAI6B,GAAc,KAAMtB,EAAQO,CAAG,EAAId,CAAM,CAC9F,CAEAyB,EAAQ,KAAK,QAASjC,CAAM,GAExBe,EAAO,aAAeA,EAAO,UAC/BA,EAAO,aAAeA,EAAO,YAAY,UAAUqB,CAAK,EACpDrB,EAAO,SACTA,EAAO,OAAO,QAAUqB,EAAM,EAAIrB,EAAO,OAAO,iBAAiB,QAASqB,CAAK,IAKnF,IAAME,EAAWC,GAAcxB,EAAO,QAASA,EAAO,IAAKA,EAAO,iBAAiB,EAC7EyB,EAAS,IAAI,IAAIF,EAAU5D,EAAS,cAAgBA,EAAS,OAAS,MAAS,EAC/EC,EAAW6D,EAAO,UAAY/D,GAAmB,CAAC,EAExD,GAAIE,IAAa,QAAS,CAExB,GAAIoC,EAAO,iBAAmB,GAAI,CAEhC,IAAM0B,EAAU,OAAO1B,EAAO,KAAOuB,GAAY,EAAE,EAGnD,GAFkBI,GAA4BD,CAAO,EAErC1B,EAAO,iBACrB,OAAOf,EAAO,IAAI2C,EAChB,4BAA8B5B,EAAO,iBAAmB,YACxD4B,EAAW,iBACX5B,CACF,CAAC,CAEL,CAEA,IAAI6B,EAEJ,GAAIxB,IAAW,MACb,OAAOyB,GAAO9C,EAASC,EAAQ,CAC7B,OAAQ,IACR,WAAY,qBACZ,QAAS,CAAC,EACV,OAAAe,CACF,CAAC,EAGH,GAAI,CACF6B,EAAgBE,GAAY/B,EAAO,IAAKG,IAAiB,OAAQ,CAC/D,KAAMH,EAAO,KAAOA,EAAO,IAAI,IACjC,CAAC,CACH,OAASa,EAAK,CACZ,MAAMe,EAAW,KAAKf,EAAKe,EAAW,gBAAiB5B,CAAM,CAC/D,CAEA,OAAIG,IAAiB,QACnB0B,EAAgBA,EAAc,SAASzB,CAAgB,GAEnD,CAACA,GAAoBA,IAAqB,UAC5CyB,EAAgBxE,EAAM,SAASwE,CAAa,IAErC1B,IAAiB,WAC1B0B,EAAgB/D,GAAO,SAAS,KAAK+D,CAAa,GAG7CC,GAAO9C,EAASC,EAAQ,CAC7B,KAAM4C,EACN,OAAQ,IACR,WAAY,KACZ,QAAS,IAAIG,EACb,OAAAhC,CACF,CAAC,CACH,CAEA,GAAItC,GAAmB,QAAQE,CAAQ,IAAM,GAC3C,OAAOqB,EAAO,IAAI2C,EAChB,wBAA0BhE,EAC1BgE,EAAW,gBACX5B,CACF,CAAC,EAGH,IAAMiC,EAAUD,EAAa,KAAKhC,EAAO,OAAO,EAAE,UAAU,EAM5DiC,EAAQ,IAAI,aAAc,SAAWC,GAAS,EAAK,EAEnD,GAAM,CAAC,iBAAAC,EAAkB,mBAAAC,CAAkB,EAAIpC,EACzCqC,GAAUrC,EAAO,QACnBsC,GACAC,GAGJ,GAAIlF,EAAM,oBAAoB4C,CAAI,EAAG,CACnC,IAAMuC,EAAeP,EAAQ,eAAe,6BAA6B,EAEzEhC,EAAOwC,GAAiBxC,EAAOyC,GAAgB,CAC7CT,EAAQ,IAAIS,CAAW,CACzB,EAAG,CACD,IAAK,SAASR,EAAO,YACrB,SAAUM,GAAgBA,EAAa,CAAC,GAAK,MAC/C,CAAC,CAEH,SAAWnF,EAAM,WAAW4C,CAAI,GAAK5C,EAAM,WAAW4C,EAAK,UAAU,GAGnE,GAFAgC,EAAQ,IAAIhC,EAAK,WAAW,CAAC,EAEzB,CAACgC,EAAQ,iBAAiB,EAC5B,GAAI,CACF,IAAMU,EAAc,MAAMC,GAAK,UAAU3C,EAAK,SAAS,EAAE,KAAKA,CAAI,EAClE,OAAO,SAAS0C,CAAW,GAAKA,GAAe,GAAKV,EAAQ,iBAAiBU,CAAW,CAE1F,MAAY,CACZ,UAEOtF,EAAM,OAAO4C,CAAI,GAAK5C,EAAM,OAAO4C,CAAI,EAChDA,EAAK,MAAQgC,EAAQ,eAAehC,EAAK,MAAQ,0BAA0B,EAC3EgC,EAAQ,iBAAiBhC,EAAK,MAAQ,CAAC,EACvCA,EAAOnC,GAAO,SAAS,KAAK+E,GAAS5C,CAAI,CAAC,UACjCA,GAAQ,CAAC5C,EAAM,SAAS4C,CAAI,EAAG,CACxC,GAAI,QAAO,SAASA,CAAI,EAEjB,GAAI5C,EAAM,cAAc4C,CAAI,EACjCA,EAAO,OAAO,KAAK,IAAI,WAAWA,CAAI,CAAC,UAC9B5C,EAAM,SAAS4C,CAAI,EAC5BA,EAAO,OAAO,KAAKA,EAAM,OAAO,MAEhC,QAAOhB,EAAO,IAAI2C,EAChB,oFACAA,EAAW,gBACX5B,CACF,CAAC,EAMH,GAFAiC,EAAQ,iBAAiBhC,EAAK,OAAQ,EAAK,EAEvCD,EAAO,cAAgB,IAAMC,EAAK,OAASD,EAAO,cACpD,OAAOf,EAAO,IAAI2C,EAChB,+CACAA,EAAW,gBACX5B,CACF,CAAC,CAEL,CAEA,IAAM8C,GAAgBzF,EAAM,eAAe4E,EAAQ,iBAAiB,CAAC,EAEjE5E,EAAM,QAAQgF,EAAO,GACvBC,GAAgBD,GAAQ,CAAC,EACzBE,GAAkBF,GAAQ,CAAC,GAE3BC,GAAgBC,GAAkBF,GAGhCpC,IAASkC,GAAoBG,MAC1BjF,EAAM,SAAS4C,CAAI,IACtBA,EAAOnC,GAAO,SAAS,KAAKmC,EAAM,CAAC,WAAY,EAAK,CAAC,GAGvDA,EAAOnC,GAAO,SAAS,CAACmC,EAAM,IAAI8C,GAAqB,CACrD,QAAS1F,EAAM,eAAeiF,EAAa,CAC7C,CAAC,CAAC,EAAGjF,EAAM,IAAI,EAEf8E,GAAoBlC,EAAK,GAAG,WAAYpC,GACtCoC,EACA+C,GACEF,GACAG,GAAqBC,GAAef,CAAgB,EAAG,GAAO,CAAC,CACjE,CACF,CAAC,GAIH,IAAIgB,EACJ,GAAInD,EAAO,KAAM,CACf,IAAMoD,EAAWpD,EAAO,KAAK,UAAY,GACnCqD,EAAWrD,EAAO,KAAK,UAAY,GACzCmD,EAAOC,EAAW,IAAMC,CAC1B,CAEA,GAAI,CAACF,GAAQ1B,EAAO,SAAU,CAC5B,IAAM6B,EAAc7B,EAAO,SACrB8B,EAAc9B,EAAO,SAC3B0B,EAAOG,EAAc,IAAMC,CAC7B,CAEAJ,GAAQlB,EAAQ,OAAO,eAAe,EAEtC,IAAIuB,EAEJ,GAAI,CACFA,EAAOC,GACLhC,EAAO,SAAWA,EAAO,OACzBzB,EAAO,OACPA,EAAO,gBACT,EAAE,QAAQ,MAAO,EAAE,CACrB,OAASa,EAAK,CACZ,IAAM6C,EAAY,IAAI,MAAM7C,EAAI,OAAO,EACvC,OAAA6C,EAAU,OAAS1D,EACnB0D,EAAU,IAAM1D,EAAO,IACvB0D,EAAU,OAAS,GACZzE,EAAOyE,CAAS,CACzB,CAEAzB,EAAQ,IACN,kBACA,2BAA6B7E,GAAoB,OAAS,IAAK,EAC/D,EAEF,IAAMc,EAAU,CACd,KAAAsF,EACA,OAAQnD,EACR,QAAS4B,EAAQ,OAAO,EACxB,OAAQ,CAAE,KAAMjC,EAAO,UAAW,MAAOA,EAAO,UAAW,EAC3D,KAAAmD,EACA,SAAAvF,EACA,OAAAiC,EACA,eAAgB5B,GAChB,gBAAiB,CAAC,CACpB,EAGA,CAACZ,EAAM,YAAY6C,CAAM,IAAMhC,EAAQ,OAASgC,GAE5CF,EAAO,WACT9B,EAAQ,WAAa8B,EAAO,YAE5B9B,EAAQ,SAAWuD,EAAO,SAAS,WAAW,GAAG,EAAIA,EAAO,SAAS,MAAM,EAAG,EAAE,EAAIA,EAAO,SAC3FvD,EAAQ,KAAOuD,EAAO,KACtBrD,GAASF,EAAS8B,EAAO,MAAOpC,EAAW,KAAO6D,EAAO,UAAYA,EAAO,KAAO,IAAMA,EAAO,KAAO,IAAMvD,EAAQ,IAAI,GAG3H,IAAIyF,EACEC,EAAiBnG,GAAQ,KAAKS,EAAQ,QAAQ,EAkMpD,GAjMAA,EAAQ,MAAQ0F,EAAiB5D,EAAO,WAAaA,EAAO,UACxDA,EAAO,UACT2D,EAAY3D,EAAO,UACVA,EAAO,eAAiB,EACjC2D,EAAYC,EAAiBC,GAAQC,IAEjC9D,EAAO,eACT9B,EAAQ,aAAe8B,EAAO,cAE5BA,EAAO,iBACT9B,EAAQ,gBAAgB,OAAS8B,EAAO,gBAE1C2D,EAAYC,EAAiBrG,GAAcD,IAGzC0C,EAAO,cAAgB,GACzB9B,EAAQ,cAAgB8B,EAAO,cAG/B9B,EAAQ,cAAgB,IAGtB8B,EAAO,qBACT9B,EAAQ,mBAAqB8B,EAAO,oBAItCO,EAAMoD,EAAU,QAAQzF,EAAS,SAAwB6F,EAAK,CAC5D,GAAIxD,EAAI,UAAW,OAEnB,IAAMyD,EAAU,CAACD,CAAG,EAEdE,EAAiB,CAACF,EAAI,QAAQ,gBAAgB,EAEpD,GAAI3B,GAAsBG,GAAiB,CACzC,IAAM2B,GAAkB,IAAInB,GAAqB,CAC/C,QAAS1F,EAAM,eAAekF,EAAe,CAC/C,CAAC,EAEDH,GAAsB8B,GAAgB,GAAG,WAAYrG,GACnDqG,GACAlB,GACEiB,EACAhB,GAAqBC,GAAed,CAAkB,EAAG,GAAM,CAAC,CAClE,CACF,CAAC,EAED4B,EAAQ,KAAKE,EAAe,CAC9B,CAGA,IAAIC,EAAiBJ,EAGfK,GAAcL,EAAI,KAAOxD,EAG/B,GAAIP,EAAO,aAAe,IAAS+D,EAAI,QAAQ,kBAAkB,EAO/D,QAJI1D,IAAW,QAAU0D,EAAI,aAAe,MAC1C,OAAOA,EAAI,QAAQ,kBAAkB,GAG9BA,EAAI,QAAQ,kBAAkB,GAAK,IAAI,YAAY,EAAG,CAE/D,IAAK,OACL,IAAK,SACL,IAAK,WACL,IAAK,aAEHC,EAAQ,KAAK9G,GAAK,YAAYD,EAAW,CAAC,EAG1C,OAAO8G,EAAI,QAAQ,kBAAkB,EACrC,MACF,IAAK,UACHC,EAAQ,KAAK,IAAIK,EAA2B,EAG5CL,EAAQ,KAAK9G,GAAK,YAAYD,EAAW,CAAC,EAG1C,OAAO8G,EAAI,QAAQ,kBAAkB,EACrC,MACF,IAAK,KACC3G,KACF4G,EAAQ,KAAK9G,GAAK,uBAAuBC,EAAa,CAAC,EACvD,OAAO4G,EAAI,QAAQ,kBAAkB,EAEzC,CAGFI,EAAiBH,EAAQ,OAAS,EAAIlG,GAAO,SAASkG,EAAS3G,EAAM,IAAI,EAAI2G,EAAQ,CAAC,EAEtF,IAAMM,GAAexG,GAAO,SAASqG,EAAgB,IAAM,CACzDG,GAAa,EACblD,EAAW,CACb,CAAC,EAEKmD,GAAW,CACf,OAAQR,EAAI,WACZ,WAAYA,EAAI,cAChB,QAAS,IAAI/B,EAAa+B,EAAI,OAAO,EACrC,OAAA/D,EACA,QAASoE,EACX,EAEA,GAAIjE,IAAiB,SACnBoE,GAAS,KAAOJ,EAChBrC,GAAO9C,EAASC,EAAQsF,EAAQ,MAC3B,CACL,IAAMC,GAAiB,CAAC,EACpBC,GAAqB,EAEzBN,EAAe,GAAG,OAAQ,SAA0BO,EAAO,CACzDF,GAAe,KAAKE,CAAK,EACzBD,IAAsBC,EAAM,OAGxB1E,EAAO,iBAAmB,IAAMyE,GAAqBzE,EAAO,mBAE9DM,EAAW,GACX6D,EAAe,QAAQ,EACvBlF,EAAO,IAAI2C,EAAW,4BAA8B5B,EAAO,iBAAmB,YAC5E4B,EAAW,iBAAkB5B,EAAQoE,EAAW,CAAC,EAEvD,CAAC,EAEDD,EAAe,GAAG,UAAW,UAAgC,CAC3D,GAAI7D,EACF,OAGF,IAAMO,EAAM,IAAIe,EACd,0BACAA,EAAW,iBACX5B,EACAoE,EACF,EACAD,EAAe,QAAQtD,CAAG,EAC1B5B,EAAO4B,CAAG,CACZ,CAAC,EAEDsD,EAAe,GAAG,QAAS,SAA2BtD,EAAK,CACrDN,EAAI,WACRtB,EAAO2C,EAAW,KAAKf,EAAK,KAAMb,EAAQoE,EAAW,CAAC,CACxD,CAAC,EAEDD,EAAe,GAAG,MAAO,UAA2B,CAClD,GAAI,CACF,IAAIQ,EAAeH,GAAe,SAAW,EAAIA,GAAe,CAAC,EAAI,OAAO,OAAOA,EAAc,EAC7FrE,IAAiB,gBACnBwE,EAAeA,EAAa,SAASvE,CAAgB,GACjD,CAACA,GAAoBA,IAAqB,UAC5CuE,EAAetH,EAAM,SAASsH,CAAY,IAG9CJ,GAAS,KAAOI,CAClB,OAAS9D,EAAK,CACZ,OAAO5B,EAAO2C,EAAW,KAAKf,EAAK,KAAMb,EAAQuE,GAAS,QAASA,EAAQ,CAAC,CAC9E,CACAzC,GAAO9C,EAASC,EAAQsF,EAAQ,CAClC,CAAC,CACH,CAEArD,EAAQ,KAAK,QAASL,IAAO,CACtBsD,EAAe,YAClBA,EAAe,KAAK,QAAStD,EAAG,EAChCsD,EAAe,QAAQ,EAE3B,CAAC,CACH,CAAC,EAEDjD,EAAQ,KAAK,QAASL,GAAO,CAC3B5B,EAAO4B,CAAG,EACVN,EAAI,QAAQM,CAAG,CACjB,CAAC,EAGDN,EAAI,GAAG,QAAS,SAA4BM,EAAK,CAG/C5B,EAAO2C,EAAW,KAAKf,EAAK,KAAMb,EAAQO,CAAG,CAAC,CAChD,CAAC,EAGDA,EAAI,GAAG,SAAU,SAA6BqE,EAAQ,CAEpDA,EAAO,aAAa,GAAM,IAAO,EAAE,CACrC,CAAC,EAGG5E,EAAO,QAAS,CAElB,IAAM6E,EAAU,SAAS7E,EAAO,QAAS,EAAE,EAE3C,GAAI,OAAO,MAAM6E,CAAO,EAAG,CACzB5F,EAAO,IAAI2C,EACT,gDACAA,EAAW,qBACX5B,EACAO,CACF,CAAC,EAED,MACF,CAOAA,EAAI,WAAWsE,EAAS,UAAgC,CACtD,GAAI1F,EAAQ,OACZ,IAAI2F,EAAsB9E,EAAO,QAAU,cAAgBA,EAAO,QAAU,cAAgB,mBACtF+E,EAAe/E,EAAO,cAAgBgF,GACxChF,EAAO,sBACT8E,EAAsB9E,EAAO,qBAE/Bf,EAAO,IAAI2C,EACTkD,EACAC,EAAa,oBAAsBnD,EAAW,UAAYA,EAAW,aACrE5B,EACAO,CACF,CAAC,EACDc,EAAM,CACR,CAAC,CACH,CAIA,GAAIhE,EAAM,SAAS4C,CAAI,EAAG,CACxB,IAAIgF,EAAQ,GACRC,EAAU,GAEdjF,EAAK,GAAG,MAAO,IAAM,CACnBgF,EAAQ,EACV,CAAC,EAEDhF,EAAK,KAAK,QAASY,GAAO,CACxBqE,EAAU,GACV3E,EAAI,QAAQM,CAAG,CACjB,CAAC,EAEDZ,EAAK,GAAG,QAAS,IAAM,CACjB,CAACgF,GAAS,CAACC,GACb7D,EAAM,IAAIC,GAAc,kCAAmCtB,EAAQO,CAAG,CAAC,CAE3E,CAAC,EAEDN,EAAK,KAAKM,CAAG,CACf,MACEA,EAAI,IAAIN,CAAI,CAEhB,CAAC,CACH,EapsBA,IAAOkF,GAAQC,EAAS,uBAAyB,CAACC,EAAQC,IAAYC,IACpEA,EAAM,IAAI,IAAIA,EAAKH,EAAS,MAAM,EAGhCC,EAAO,WAAaE,EAAI,UACxBF,EAAO,OAASE,EAAI,OACnBD,GAAUD,EAAO,OAASE,EAAI,QAGjC,IAAI,IAAIH,EAAS,MAAM,EACvBA,EAAS,WAAa,kBAAkB,KAAKA,EAAS,UAAU,SAAS,CAC3E,EAAI,IAAM,GCVV,IAAOI,GAAQC,EAAS,sBAGtB,CACE,MAAMC,EAAMC,EAAOC,EAASC,EAAMC,EAAQC,EAAQ,CAChD,IAAMC,EAAS,CAACN,EAAO,IAAM,mBAAmBC,CAAK,CAAC,EAEtDM,EAAM,SAASL,CAAO,GAAKI,EAAO,KAAK,WAAa,IAAI,KAAKJ,CAAO,EAAE,YAAY,CAAC,EAEnFK,EAAM,SAASJ,CAAI,GAAKG,EAAO,KAAK,QAAUH,CAAI,EAElDI,EAAM,SAASH,CAAM,GAAKE,EAAO,KAAK,UAAYF,CAAM,EAExDC,IAAW,IAAQC,EAAO,KAAK,QAAQ,EAEvC,SAAS,OAASA,EAAO,KAAK,IAAI,CACpC,EAEA,KAAKN,EAAM,CACT,IAAMQ,EAAQ,SAAS,OAAO,MAAM,IAAI,OAAO,aAAeR,EAAO,WAAW,CAAC,EACjF,OAAQQ,EAAQ,mBAAmBA,EAAM,CAAC,CAAC,EAAI,IACjD,EAEA,OAAOR,EAAM,CACX,KAAK,MAAMA,EAAM,GAAI,KAAK,IAAI,EAAI,KAAQ,CAC5C,CACF,EAKA,CACE,OAAQ,CAAC,EACT,MAAO,CACL,OAAO,IACT,EACA,QAAS,CAAC,CACZ,ECnCF,IAAMS,GAAmBC,GAAUA,aAAiBC,EAAe,CAAE,GAAGD,CAAM,EAAIA,EAWnE,SAARE,GAA6BC,EAASC,EAAS,CAEpDA,EAAUA,GAAW,CAAC,EACtB,IAAMC,EAAS,CAAC,EAEhB,SAASC,EAAeC,EAAQC,EAAQC,EAAMC,EAAU,CACtD,OAAIC,EAAM,cAAcJ,CAAM,GAAKI,EAAM,cAAcH,CAAM,EACpDG,EAAM,MAAM,KAAK,CAAC,SAAAD,CAAQ,EAAGH,EAAQC,CAAM,EACzCG,EAAM,cAAcH,CAAM,EAC5BG,EAAM,MAAM,CAAC,EAAGH,CAAM,EACpBG,EAAM,QAAQH,CAAM,EACtBA,EAAO,MAAM,EAEfA,CACT,CAGA,SAASI,EAAoBC,EAAGC,EAAGL,EAAOC,EAAU,CAClD,GAAKC,EAAM,YAAYG,CAAC,GAEjB,GAAI,CAACH,EAAM,YAAYE,CAAC,EAC7B,OAAOP,EAAe,OAAWO,EAAGJ,EAAOC,CAAQ,MAFnD,QAAOJ,EAAeO,EAAGC,EAAGL,EAAOC,CAAQ,CAI/C,CAGA,SAASK,EAAiBF,EAAGC,EAAG,CAC9B,GAAI,CAACH,EAAM,YAAYG,CAAC,EACtB,OAAOR,EAAe,OAAWQ,CAAC,CAEtC,CAGA,SAASE,EAAiBH,EAAGC,EAAG,CAC9B,GAAKH,EAAM,YAAYG,CAAC,GAEjB,GAAI,CAACH,EAAM,YAAYE,CAAC,EAC7B,OAAOP,EAAe,OAAWO,CAAC,MAFlC,QAAOP,EAAe,OAAWQ,CAAC,CAItC,CAGA,SAASG,EAAgBJ,EAAGC,EAAGL,EAAM,CACnC,GAAIA,KAAQL,EACV,OAAOE,EAAeO,EAAGC,CAAC,EACrB,GAAIL,KAAQN,EACjB,OAAOG,EAAe,OAAWO,CAAC,CAEtC,CAEA,IAAMK,EAAW,CACf,IAAKH,EACL,OAAQA,EACR,KAAMA,EACN,QAASC,EACT,iBAAkBA,EAClB,kBAAmBA,EACnB,iBAAkBA,EAClB,QAASA,EACT,eAAgBA,EAChB,gBAAiBA,EACjB,cAAeA,EACf,QAASA,EACT,aAAcA,EACd,eAAgBA,EAChB,eAAgBA,EAChB,iBAAkBA,EAClB,mBAAoBA,EACpB,WAAYA,EACZ,iBAAkBA,EAClB,cAAeA,EACf,eAAgBA,EAChB,UAAWA,EACX,UAAWA,EACX,WAAYA,EACZ,YAAaA,EACb,WAAYA,EACZ,iBAAkBA,EAClB,eAAgBC,EAChB,QAAS,CAACJ,EAAGC,EAAIL,IAASG,EAAoBb,GAAgBc,CAAC,EAAGd,GAAgBe,CAAC,EAAEL,EAAM,EAAI,CACjG,EAEA,OAAAE,EAAM,QAAQ,OAAO,KAAK,CAAC,GAAGR,EAAS,GAAGC,CAAO,CAAC,EAAG,SAA4BK,EAAM,CACrF,IAAMU,EAAQD,EAAST,CAAI,GAAKG,EAC1BQ,EAAcD,EAAMhB,EAAQM,CAAI,EAAGL,EAAQK,CAAI,EAAGA,CAAI,EAC3DE,EAAM,YAAYS,CAAW,GAAKD,IAAUF,IAAqBZ,EAAOI,CAAI,EAAIW,EACnF,CAAC,EAEMf,CACT,CChGA,IAAOgB,GAASC,GAAW,CACzB,IAAMC,EAAYC,GAAY,CAAC,EAAGF,CAAM,EAEpC,CAAE,KAAAG,EAAM,cAAAC,EAAe,eAAAC,EAAgB,eAAAC,EAAgB,QAAAC,EAAS,KAAAC,CAAK,EAAIP,EAa7E,GAXAA,EAAU,QAAUM,EAAUE,EAAa,KAAKF,CAAO,EAEvDN,EAAU,IAAMS,GAASC,GAAcV,EAAU,QAASA,EAAU,IAAKA,EAAU,iBAAiB,EAAGD,EAAO,OAAQA,EAAO,gBAAgB,EAGzIQ,GACFD,EAAQ,IAAI,gBAAiB,SAC3B,MAAMC,EAAK,UAAY,IAAM,KAAOA,EAAK,SAAW,SAAS,mBAAmBA,EAAK,QAAQ,CAAC,EAAI,GAAG,CACvG,EAGEI,EAAM,WAAWT,CAAI,GACvB,GAAIU,EAAS,uBAAyBA,EAAS,+BAC7CN,EAAQ,eAAe,MAAS,UACvBK,EAAM,WAAWT,EAAK,UAAU,EAAG,CAE5C,IAAMW,EAAcX,EAAK,WAAW,EAE9BY,EAAiB,CAAC,eAAgB,gBAAgB,EACxD,OAAO,QAAQD,CAAW,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAG,IAAM,CAC9CF,EAAe,SAASC,EAAI,YAAY,CAAC,GAC3CT,EAAQ,IAAIS,EAAKC,CAAG,CAExB,CAAC,CACH,EAOF,GAAIJ,EAAS,wBACXT,GAAiBQ,EAAM,WAAWR,CAAa,IAAMA,EAAgBA,EAAcH,CAAS,GAExFG,GAAkBA,IAAkB,IAASc,GAAgBjB,EAAU,GAAG,GAAI,CAEhF,IAAMkB,EAAYd,GAAkBC,GAAkBc,GAAQ,KAAKd,CAAc,EAE7Ea,GACFZ,EAAQ,IAAIF,EAAgBc,CAAS,CAEzC,CAGF,OAAOlB,CACT,EChDA,IAAMoB,GAAwB,OAAO,eAAmB,IAEjDC,GAAQD,IAAyB,SAAUE,EAAQ,CACxD,OAAO,IAAI,QAAQ,SAA4BC,EAASC,EAAQ,CAC9D,IAAMC,EAAUC,GAAcJ,CAAM,EAChCK,EAAcF,EAAQ,KACpBG,EAAiBC,EAAa,KAAKJ,EAAQ,OAAO,EAAE,UAAU,EAChE,CAAC,aAAAK,EAAc,iBAAAC,EAAkB,mBAAAC,CAAkB,EAAIP,EACvDQ,EACAC,EAAiBC,EACjBC,EAAaC,EAEjB,SAASC,GAAO,CACdF,GAAeA,EAAY,EAC3BC,GAAiBA,EAAc,EAE/BZ,EAAQ,aAAeA,EAAQ,YAAY,YAAYQ,CAAU,EAEjER,EAAQ,QAAUA,EAAQ,OAAO,oBAAoB,QAASQ,CAAU,CAC1E,CAEA,IAAIM,EAAU,IAAI,eAElBA,EAAQ,KAAKd,EAAQ,OAAO,YAAY,EAAGA,EAAQ,IAAK,EAAI,EAG5Dc,EAAQ,QAAUd,EAAQ,QAE1B,SAASe,GAAY,CACnB,GAAI,CAACD,EACH,OAGF,IAAME,EAAkBZ,EAAa,KACnC,0BAA2BU,GAAWA,EAAQ,sBAAsB,CACtE,EAGMG,EAAW,CACf,KAHmB,CAACZ,GAAgBA,IAAiB,QAAUA,IAAiB,OAChFS,EAAQ,aAAeA,EAAQ,SAG/B,OAAQA,EAAQ,OAChB,WAAYA,EAAQ,WACpB,QAASE,EACT,OAAAnB,EACA,QAAAiB,CACF,EAEAI,GAAO,SAAkBC,EAAO,CAC9BrB,EAAQqB,CAAK,EACbN,EAAK,CACP,EAAG,SAAiBO,EAAK,CACvBrB,EAAOqB,CAAG,EACVP,EAAK,CACP,EAAGI,CAAQ,EAGXH,EAAU,IACZ,CAEI,cAAeA,EAEjBA,EAAQ,UAAYC,EAGpBD,EAAQ,mBAAqB,UAAsB,CAC7C,CAACA,GAAWA,EAAQ,aAAe,GAQnCA,EAAQ,SAAW,GAAK,EAAEA,EAAQ,aAAeA,EAAQ,YAAY,QAAQ,OAAO,IAAM,IAK9F,WAAWC,CAAS,CACtB,EAIFD,EAAQ,QAAU,UAAuB,CAClCA,IAILf,EAAO,IAAIsB,EAAW,kBAAmBA,EAAW,aAAcxB,EAAQiB,CAAO,CAAC,EAGlFA,EAAU,KACZ,EAGFA,EAAQ,QAAU,SAAqBQ,EAAO,CAIzC,IAAMC,EAAMD,GAASA,EAAM,QAAUA,EAAM,QAAU,gBAC/CF,EAAM,IAAIC,EAAWE,EAAKF,EAAW,YAAaxB,EAAQiB,CAAO,EAEvEM,EAAI,MAAQE,GAAS,KACrBvB,EAAOqB,CAAG,EACVN,EAAU,IACb,EAGAA,EAAQ,UAAY,UAAyB,CAC3C,IAAIU,EAAsBxB,EAAQ,QAAU,cAAgBA,EAAQ,QAAU,cAAgB,mBACxFyB,EAAezB,EAAQ,cAAgB0B,GACzC1B,EAAQ,sBACVwB,EAAsBxB,EAAQ,qBAEhCD,EAAO,IAAIsB,EACTG,EACAC,EAAa,oBAAsBJ,EAAW,UAAYA,EAAW,aACrExB,EACAiB,CAAO,CAAC,EAGVA,EAAU,IACZ,EAGAZ,IAAgB,QAAaC,EAAe,eAAe,IAAI,EAG3D,qBAAsBW,GACxBa,EAAM,QAAQxB,EAAe,OAAO,EAAG,SAA0ByB,EAAKC,EAAK,CACzEf,EAAQ,iBAAiBe,EAAKD,CAAG,CACnC,CAAC,EAIED,EAAM,YAAY3B,EAAQ,eAAe,IAC5Cc,EAAQ,gBAAkB,CAAC,CAACd,EAAQ,iBAIlCK,GAAgBA,IAAiB,SACnCS,EAAQ,aAAed,EAAQ,cAI7BO,IACD,CAACG,EAAmBE,CAAa,EAAIkB,GAAqBvB,EAAoB,EAAI,EACnFO,EAAQ,iBAAiB,WAAYJ,CAAiB,GAIpDJ,GAAoBQ,EAAQ,SAC7B,CAACL,EAAiBE,CAAW,EAAImB,GAAqBxB,CAAgB,EAEvEQ,EAAQ,OAAO,iBAAiB,WAAYL,CAAe,EAE3DK,EAAQ,OAAO,iBAAiB,UAAWH,CAAW,IAGpDX,EAAQ,aAAeA,EAAQ,UAGjCQ,EAAauB,GAAU,CAChBjB,IAGLf,EAAO,CAACgC,GAAUA,EAAO,KAAO,IAAIC,GAAc,KAAMnC,EAAQiB,CAAO,EAAIiB,CAAM,EACjFjB,EAAQ,MAAM,EACdA,EAAU,KACZ,EAEAd,EAAQ,aAAeA,EAAQ,YAAY,UAAUQ,CAAU,EAC3DR,EAAQ,SACVA,EAAQ,OAAO,QAAUQ,EAAW,EAAIR,EAAQ,OAAO,iBAAiB,QAASQ,CAAU,IAI/F,IAAMyB,EAAWC,GAAclC,EAAQ,GAAG,EAE1C,GAAIiC,GAAYE,EAAS,UAAU,QAAQF,CAAQ,IAAM,GAAI,CAC3DlC,EAAO,IAAIsB,EAAW,wBAA0BY,EAAW,IAAKZ,EAAW,gBAAiBxB,CAAM,CAAC,EACnG,MACF,CAIAiB,EAAQ,KAAKZ,GAAe,IAAI,CAClC,CAAC,CACH,ECnMA,IAAMkC,GAAiB,CAACC,EAASC,IAAY,CAC3C,GAAM,CAAC,OAAAC,CAAM,EAAKF,EAAUA,EAAUA,EAAQ,OAAO,OAAO,EAAI,CAAC,EAEjE,GAAIC,GAAWC,EAAQ,CACrB,IAAIC,EAAa,IAAI,gBAEjBC,EAEEC,EAAU,SAAUC,EAAQ,CAChC,GAAI,CAACF,EAAS,CACZA,EAAU,GACVG,EAAY,EACZ,IAAMC,EAAMF,aAAkB,MAAQA,EAAS,KAAK,OACpDH,EAAW,MAAMK,aAAeC,EAAaD,EAAM,IAAIE,GAAcF,aAAe,MAAQA,EAAI,QAAUA,CAAG,CAAC,CAChH,CACF,EAEIG,EAAQV,GAAW,WAAW,IAAM,CACtCU,EAAQ,KACRN,EAAQ,IAAII,EAAW,WAAWR,CAAO,kBAAmBQ,EAAW,SAAS,CAAC,CACnF,EAAGR,CAAO,EAEJM,EAAc,IAAM,CACpBP,IACFW,GAAS,aAAaA,CAAK,EAC3BA,EAAQ,KACRX,EAAQ,QAAQY,GAAU,CACxBA,EAAO,YAAcA,EAAO,YAAYP,CAAO,EAAIO,EAAO,oBAAoB,QAASP,CAAO,CAChG,CAAC,EACDL,EAAU,KAEd,EAEAA,EAAQ,QAASY,GAAWA,EAAO,iBAAiB,QAASP,CAAO,CAAC,EAErE,GAAM,CAAC,OAAAO,CAAM,EAAIT,EAEjB,OAAAS,EAAO,YAAc,IAAMC,EAAM,KAAKN,CAAW,EAE1CK,CACT,CACF,EAEOE,GAAQf,GC9CR,IAAMgB,GAAc,UAAWC,EAAOC,EAAW,CACtD,IAAIC,EAAMF,EAAM,WAEhB,GAAI,CAACC,GAAaC,EAAMD,EAAW,CACjC,MAAMD,EACN,MACF,CAEA,IAAIG,EAAM,EACNC,EAEJ,KAAOD,EAAMD,GACXE,EAAMD,EAAMF,EACZ,MAAMD,EAAM,MAAMG,EAAKC,CAAG,EAC1BD,EAAMC,CAEV,EAEaC,GAAY,gBAAiBC,EAAUL,EAAW,CAC7D,cAAiBD,KAASO,GAAWD,CAAQ,EAC3C,MAAOP,GAAYC,EAAOC,CAAS,CAEvC,EAEMM,GAAa,gBAAiBC,EAAQ,CAC1C,GAAIA,EAAO,OAAO,aAAa,EAAG,CAChC,MAAOA,EACP,MACF,CAEA,IAAMC,EAASD,EAAO,UAAU,EAChC,GAAI,CACF,OAAS,CACP,GAAM,CAAC,KAAAE,EAAM,MAAAC,CAAK,EAAI,MAAMF,EAAO,KAAK,EACxC,GAAIC,EACF,MAEF,MAAMC,CACR,CACF,QAAE,CACA,MAAMF,EAAO,OAAO,CACtB,CACF,EAEaG,GAAc,CAACJ,EAAQP,EAAWY,EAAYC,IAAa,CACtE,IAAMC,EAAWV,GAAUG,EAAQP,CAAS,EAExCe,EAAQ,EACRN,EACAO,EAAaC,GAAM,CAChBR,IACHA,EAAO,GACPI,GAAYA,EAASI,CAAC,EAE1B,EAEA,OAAO,IAAI,eAAe,CACxB,MAAM,KAAKC,EAAY,CACrB,GAAI,CACF,GAAM,CAAC,KAAAT,EAAM,MAAAC,CAAK,EAAI,MAAMI,EAAS,KAAK,EAE1C,GAAIL,EAAM,CACTO,EAAU,EACTE,EAAW,MAAM,EACjB,MACF,CAEA,IAAIjB,EAAMS,EAAM,WAChB,GAAIE,EAAY,CACd,IAAIO,EAAcJ,GAASd,EAC3BW,EAAWO,CAAW,CACxB,CACAD,EAAW,QAAQ,IAAI,WAAWR,CAAK,CAAC,CAC1C,OAASU,EAAK,CACZ,MAAAJ,EAAUI,CAAG,EACPA,CACR,CACF,EACA,OAAOC,EAAQ,CACb,OAAAL,EAAUK,CAAM,EACTP,EAAS,OAAO,CACzB,CACF,EAAG,CACD,cAAe,CACjB,CAAC,CACH,EC5EA,IAAMQ,GAAqB,GAAK,KAE1B,CAAC,WAAAC,EAAU,EAAIC,EAEfC,IAAkB,CAAC,CAAC,MAAAC,EAAO,QAAAC,EAAS,SAAAC,CAAQ,KAAO,CACrD,MAAAF,EAAO,QAAAC,EAAS,SAAAC,CAClB,IAAIJ,EAAM,MAAM,EAEZ,CACJ,eAAAK,GAAgB,YAAAC,EAClB,EAAIN,EAAM,OAGJO,GAAO,CAACC,KAAOC,IAAS,CAC5B,GAAI,CACF,MAAO,CAAC,CAACD,EAAG,GAAGC,CAAI,CACrB,MAAY,CACV,MAAO,EACT,CACF,EAEMC,GAAWC,GAAQ,CACvB,GAAM,CAAC,MAAAT,EAAO,QAAAC,EAAS,SAAAC,CAAQ,EAAI,OAAO,OAAO,CAAC,EAAGH,GAAgBU,CAAG,EAClEC,EAAmBb,GAAWG,CAAK,EACnCW,EAAqBd,GAAWI,CAAO,EACvCW,EAAsBf,GAAWK,CAAQ,EAE/C,GAAI,CAACQ,EACH,MAAO,GAGT,IAAMG,EAA4BH,GAAoBb,GAAWM,EAAc,EAEzEW,EAAaJ,IAAqB,OAAON,IAAgB,YACzDW,GAAaC,GAAQD,EAAQ,OAAOC,CAAG,GAAG,IAAIZ,EAAa,EAC7D,MAAOY,GAAQ,IAAI,WAAW,MAAM,IAAIf,EAAQe,CAAG,EAAE,YAAY,CAAC,GAGhEC,EAAwBN,GAAsBE,GAA6BR,GAAK,IAAM,CAC1F,IAAIa,EAAiB,GAEfC,EAAiB,IAAIlB,EAAQmB,EAAS,OAAQ,CAClD,KAAM,IAAIjB,GACV,OAAQ,OACR,IAAI,QAAS,CACX,OAAAe,EAAiB,GACV,MACT,CACF,CAAC,EAAE,QAAQ,IAAI,cAAc,EAE7B,OAAOA,GAAkB,CAACC,CAC5B,CAAC,EAEKE,EAAyBT,GAAuBC,GACpDR,GAAK,IAAMP,EAAM,iBAAiB,IAAII,EAAS,EAAE,EAAE,IAAI,CAAC,EAEpDoB,EAAY,CAChB,OAAQD,IAA4BE,GAAQA,EAAI,KAClD,EAEAb,GACE,CAAC,OAAQ,cAAe,OAAQ,WAAY,QAAQ,EAAE,QAAQc,GAAQ,CACpE,CAACF,EAAUE,CAAI,IAAMF,EAAUE,CAAI,EAAI,CAACD,EAAKE,IAAW,CACtD,IAAIC,EAASH,GAAOA,EAAIC,CAAI,EAE5B,GAAIE,EACF,OAAOA,EAAO,KAAKH,CAAG,EAGxB,MAAM,IAAII,EAAW,kBAAkBH,CAAI,qBAAsBG,EAAW,gBAAiBF,CAAM,CACrG,EACF,CAAC,EAGH,IAAMG,EAAgB,MAAOC,GAAS,CACpC,GAAIA,GAAQ,KACV,MAAO,GAGT,GAAI/B,EAAM,OAAO+B,CAAI,EACnB,OAAOA,EAAK,KAGd,GAAI/B,EAAM,oBAAoB+B,CAAI,EAKhC,OAAQ,MAJS,IAAI5B,EAAQmB,EAAS,OAAQ,CAC5C,OAAQ,OACR,KAAAS,CACF,CAAC,EACsB,YAAY,GAAG,WAGxC,GAAI/B,EAAM,kBAAkB+B,CAAI,GAAK/B,EAAM,cAAc+B,CAAI,EAC3D,OAAOA,EAAK,WAOd,GAJI/B,EAAM,kBAAkB+B,CAAI,IAC9BA,EAAOA,EAAO,IAGZ/B,EAAM,SAAS+B,CAAI,EACrB,OAAQ,MAAMf,EAAWe,CAAI,GAAG,UAEpC,EAEMC,EAAoB,MAAOC,EAASF,IAAS,CACjD,IAAMG,EAASlC,EAAM,eAAeiC,EAAQ,iBAAiB,CAAC,EAE9D,OAAOC,GAAiBJ,EAAcC,CAAI,CAC5C,EAEA,MAAO,OAAOJ,GAAW,CACvB,GAAI,CACF,IAAAQ,EACA,OAAAP,EACA,KAAAQ,EACA,OAAAC,EACA,YAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,QAAAT,GACA,gBAAAU,GAAkB,cAClB,aAAAC,EACF,EAAIC,GAAclB,CAAM,EAExBe,EAAeA,GAAgBA,EAAe,IAAI,YAAY,EAAI,OAElE,IAAII,GAAiBC,GAAe,CAACV,EAAQC,GAAeA,EAAY,cAAc,CAAC,EAAGC,CAAO,EAE7FS,EAAU,KAERC,EAAcH,IAAkBA,GAAe,cAAgB,IAAM,CACzEA,GAAe,YAAY,CAC7B,GAEII,EAEJ,GAAI,CACF,GACET,GAAoBtB,GAAyBS,IAAW,OAASA,IAAW,SAC3EsB,EAAuB,MAAMlB,EAAkBC,GAASG,CAAI,KAAO,EACpE,CACA,IAAIe,EAAW,IAAIhD,EAAQgC,EAAK,CAC9B,OAAQ,OACR,KAAMC,EACN,OAAQ,MACV,CAAC,EAEGgB,EAMJ,GAJIpD,EAAM,WAAWoC,CAAI,IAAMgB,EAAoBD,EAAS,QAAQ,IAAI,cAAc,IACpFlB,GAAQ,eAAemB,CAAiB,EAGtCD,EAAS,KAAM,CACjB,GAAM,CAACE,GAAYC,EAAK,EAAIC,GAC1BL,EACAM,GAAqBC,GAAehB,CAAgB,CAAC,CACvD,EAEAL,EAAOsB,GAAYP,EAAS,KAAMrD,GAAoBuD,GAAYC,EAAK,CACzE,CACF,CAEKtD,EAAM,SAAS2C,EAAe,IACjCA,GAAkBA,GAAkB,UAAY,QAKlD,IAAMgB,EAAyB9C,GAAsB,gBAAiBV,EAAQ,UAExEyD,EAAkB,CACtB,GAAGhB,GACH,OAAQE,GACR,OAAQlB,EAAO,YAAY,EAC3B,QAASK,GAAQ,UAAU,EAAE,OAAO,EACpC,KAAMG,EACN,OAAQ,OACR,YAAauB,EAAyBhB,GAAkB,MAC1D,EAEAK,EAAUnC,GAAsB,IAAIV,EAAQgC,EAAKyB,CAAe,EAEhE,IAAIC,EAAW,MAAOhD,EAAqBX,EAAM8C,EAASJ,EAAY,EAAI1C,EAAMiC,EAAKyB,CAAe,GAE9FE,EAAmBvC,IAA2BmB,IAAiB,UAAYA,IAAiB,YAElG,GAAInB,IAA2BiB,GAAuBsB,GAAoBb,GAAe,CACvF,IAAMc,EAAU,CAAC,EAEjB,CAAC,SAAU,aAAc,SAAS,EAAE,QAAQC,IAAQ,CAClDD,EAAQC,EAAI,EAAIH,EAASG,EAAI,CAC/B,CAAC,EAED,IAAMC,EAAwBjE,EAAM,eAAe6D,EAAS,QAAQ,IAAI,gBAAgB,CAAC,EAEnF,CAACR,GAAYC,EAAK,EAAId,GAAsBe,GAChDU,EACAT,GAAqBC,GAAejB,CAAkB,EAAG,EAAI,CAC/D,GAAK,CAAC,EAENqB,EAAW,IAAIzD,EACbsD,GAAYG,EAAS,KAAM/D,GAAoBuD,GAAY,IAAM,CAC/DC,IAASA,GAAM,EACfL,GAAeA,EAAY,CAC7B,CAAC,EACDc,CACF,CACF,CAEArB,EAAeA,GAAgB,OAE/B,IAAIwB,EAAe,MAAM1C,EAAUxB,EAAM,QAAQwB,EAAWkB,CAAY,GAAK,MAAM,EAAEmB,EAAUlC,CAAM,EAErG,OAACmC,GAAoBb,GAAeA,EAAY,EAEzC,MAAM,IAAI,QAAQ,CAACkB,EAASC,IAAW,CAC5CC,GAAOF,EAASC,EAAQ,CACtB,KAAMF,EACN,QAASI,EAAa,KAAKT,EAAS,OAAO,EAC3C,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,OAAAlC,EACA,QAAAqB,CACF,CAAC,CACH,CAAC,CACH,OAASuB,EAAK,CAGZ,MAFAtB,GAAeA,EAAY,EAEvBsB,GAAOA,EAAI,OAAS,aAAe,qBAAqB,KAAKA,EAAI,OAAO,EACpE,OAAO,OACX,IAAI1C,EAAW,gBAAiBA,EAAW,YAAaF,EAAQqB,CAAO,EACvE,CACE,MAAOuB,EAAI,OAASA,CACtB,CACF,EAGI1C,EAAW,KAAK0C,EAAKA,GAAOA,EAAI,KAAM5C,EAAQqB,CAAO,CAC7D,CACF,CACF,EAEMwB,GAAY,IAAI,IAETC,GAAY9C,GAAW,CAClC,IAAIhB,EAAMX,EAAM,MAAM,KAAK,CACzB,cAAe,EACjB,EAAGC,GAAgB0B,EAASA,EAAO,IAAM,IAAI,EAEvC,CAAC,MAAAzB,EAAO,QAAAC,EAAS,SAAAC,CAAQ,EAAIO,EAE7B+D,EAAQ,CACZvE,EAASC,EAAUF,CACrB,EAEIyE,EAAMD,EAAM,OAAQE,EAAID,EAC1BE,EAAMC,EAAQC,EAAMP,GAEtB,KAAOI,KACLC,EAAOH,EAAME,CAAC,EACdE,EAASC,EAAI,IAAIF,CAAI,EAErBC,IAAW,QAAaC,EAAI,IAAIF,EAAMC,EAAUF,EAAI,IAAI,IAAQlE,GAAQC,CAAG,CAAE,EAE7EoE,EAAMD,EAGR,OAAOA,CACT,EAEME,GAAUP,GAAS,ECrRzB,IAAMQ,GAAgB,CACpB,KAAMC,GACN,IAAKC,GACL,MAAO,CACL,IAAkBC,EACpB,CACF,EAEAC,EAAM,QAAQJ,GAAe,CAACK,EAAIC,IAAU,CAC1C,GAAID,EAAI,CACN,GAAI,CACF,OAAO,eAAeA,EAAI,OAAQ,CAAC,MAAAC,CAAK,CAAC,CAC3C,MAAY,CAEZ,CACA,OAAO,eAAeD,EAAI,cAAe,CAAC,MAAAC,CAAK,CAAC,CAClD,CACF,CAAC,EAED,IAAMC,GAAgBC,GAAW,KAAKA,CAAM,GAEtCC,GAAoBC,GAAYN,EAAM,WAAWM,CAAO,GAAKA,IAAY,MAAQA,IAAY,GAE5FC,GAAQ,CACb,WAAY,CAACC,EAAUC,IAAW,CAChCD,EAAWR,EAAM,QAAQQ,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAEzD,GAAM,CAAC,OAAAE,CAAM,EAAIF,EACbG,EACAL,EAEEM,EAAkB,CAAC,EAEzB,QAASC,EAAI,EAAGA,EAAIH,EAAQG,IAAK,CAC/BF,EAAgBH,EAASK,CAAC,EAC1B,IAAIC,EAIJ,GAFAR,EAAUK,EAEN,CAACN,GAAiBM,CAAa,IACjCL,EAAUV,IAAekB,EAAK,OAAOH,CAAa,GAAG,YAAY,CAAC,EAE9DL,IAAY,QACd,MAAM,IAAIS,EAAW,oBAAoBD,CAAE,GAAG,EAIlD,GAAIR,IAAYN,EAAM,WAAWM,CAAO,IAAMA,EAAUA,EAAQ,IAAIG,CAAM,IACxE,MAGFG,EAAgBE,GAAM,IAAMD,CAAC,EAAIP,CACnC,CAEA,GAAI,CAACA,EAAS,CAEZ,IAAMU,EAAU,OAAO,QAAQJ,CAAe,EAC3C,IAAI,CAAC,CAACE,EAAIG,CAAK,IAAM,WAAWH,CAAE,KAChCG,IAAU,GAAQ,sCAAwC,gCAC7D,EAEEC,EAAIR,EACLM,EAAQ,OAAS,EAAI;AAAA,EAAcA,EAAQ,IAAIb,EAAY,EAAE,KAAK;AAAA,CAAI,EAAI,IAAMA,GAAaa,EAAQ,CAAC,CAAC,EACxG,0BAEF,MAAM,IAAID,EACR,wDAA0DG,EAC1D,iBACF,CACF,CAEA,OAAOZ,CACT,EACA,SAAUV,EACZ,EChEA,SAASuB,GAA6BC,EAAQ,CAK5C,GAJIA,EAAO,aACTA,EAAO,YAAY,iBAAiB,EAGlCA,EAAO,QAAUA,EAAO,OAAO,QACjC,MAAM,IAAIC,GAAc,KAAMD,CAAM,CAExC,CASe,SAARE,GAAiCF,EAAQ,CAC9C,OAAAD,GAA6BC,CAAM,EAEnCA,EAAO,QAAUG,EAAa,KAAKH,EAAO,OAAO,EAGjDA,EAAO,KAAOI,GAAc,KAC1BJ,EACAA,EAAO,gBACT,EAEI,CAAC,OAAQ,MAAO,OAAO,EAAE,QAAQA,EAAO,MAAM,IAAM,IACtDA,EAAO,QAAQ,eAAe,oCAAqC,EAAK,EAG1DK,GAAS,WAAWL,EAAO,SAAWM,GAAS,QAASN,CAAM,EAE/DA,CAAM,EAAE,KAAK,SAA6BO,EAAU,CACjE,OAAAR,GAA6BC,CAAM,EAGnCO,EAAS,KAAOH,GAAc,KAC5BJ,EACAA,EAAO,kBACPO,CACF,EAEAA,EAAS,QAAUJ,EAAa,KAAKI,EAAS,OAAO,EAE9CA,CACT,EAAG,SAA4BC,EAAQ,CACrC,OAAKC,GAASD,CAAM,IAClBT,GAA6BC,CAAM,EAG/BQ,GAAUA,EAAO,WACnBA,EAAO,SAAS,KAAOJ,GAAc,KACnCJ,EACAA,EAAO,kBACPQ,EAAO,QACT,EACAA,EAAO,SAAS,QAAUL,EAAa,KAAKK,EAAO,SAAS,OAAO,IAIhE,QAAQ,OAAOA,CAAM,CAC9B,CAAC,CACH,CC3EA,IAAME,GAAa,CAAC,EAGpB,CAAC,SAAU,UAAW,SAAU,WAAY,SAAU,QAAQ,EAAE,QAAQ,CAACC,EAAMC,IAAM,CACnFF,GAAWC,CAAI,EAAI,SAAmBE,EAAO,CAC3C,OAAO,OAAOA,IAAUF,GAAQ,KAAOC,EAAI,EAAI,KAAO,KAAOD,CAC/D,CACF,CAAC,EAED,IAAMG,GAAqB,CAAC,EAW5BJ,GAAW,aAAe,SAAsBK,EAAWC,EAASC,EAAS,CAC3E,SAASC,EAAcC,EAAKC,EAAM,CAChC,MAAO,WAAaC,GAAU,0BAA6BF,EAAM,IAAOC,GAAQH,EAAU,KAAOA,EAAU,GAC7G,CAGA,MAAO,CAACK,EAAOH,EAAKI,IAAS,CAC3B,GAAIR,IAAc,GAChB,MAAM,IAAIS,EACRN,EAAcC,EAAK,qBAAuBH,EAAU,OAASA,EAAU,GAAG,EAC1EQ,EAAW,cACb,EAGF,OAAIR,GAAW,CAACF,GAAmBK,CAAG,IACpCL,GAAmBK,CAAG,EAAI,GAE1B,QAAQ,KACND,EACEC,EACA,+BAAiCH,EAAU,yCAC7C,CACF,GAGKD,EAAYA,EAAUO,EAAOH,EAAKI,CAAI,EAAI,EACnD,CACF,EAEAb,GAAW,SAAW,SAAkBe,EAAiB,CACvD,MAAO,CAACH,EAAOH,KAEb,QAAQ,KAAK,GAAGA,CAAG,+BAA+BM,CAAe,EAAE,EAC5D,GAEX,EAYA,SAASC,GAAcC,EAASC,EAAQC,EAAc,CACpD,GAAI,OAAOF,GAAY,SACrB,MAAM,IAAIH,EAAW,4BAA6BA,EAAW,oBAAoB,EAEnF,IAAMM,EAAO,OAAO,KAAKH,CAAO,EAC5Bf,EAAIkB,EAAK,OACb,KAAOlB,KAAM,GAAG,CACd,IAAMO,EAAMW,EAAKlB,CAAC,EACZG,EAAYa,EAAOT,CAAG,EAC5B,GAAIJ,EAAW,CACb,IAAMO,EAAQK,EAAQR,CAAG,EACnBY,EAAST,IAAU,QAAaP,EAAUO,EAAOH,EAAKQ,CAAO,EACnE,GAAII,IAAW,GACb,MAAM,IAAIP,EAAW,UAAYL,EAAM,YAAcY,EAAQP,EAAW,oBAAoB,EAE9F,QACF,CACA,GAAIK,IAAiB,GACnB,MAAM,IAAIL,EAAW,kBAAoBL,EAAKK,EAAW,cAAc,CAE3E,CACF,CAEA,IAAOQ,GAAQ,CACb,cAAAN,GACA,WAAAhB,EACF,ECvFA,IAAMuB,GAAaC,GAAU,WASvBC,GAAN,KAAY,CACV,YAAYC,EAAgB,CAC1B,KAAK,SAAWA,GAAkB,CAAC,EACnC,KAAK,aAAe,CAClB,QAAS,IAAIC,GACb,SAAU,IAAIA,EAChB,CACF,CAUA,MAAM,QAAQC,EAAaC,EAAQ,CACjC,GAAI,CACF,OAAO,MAAM,KAAK,SAASD,EAAaC,CAAM,CAChD,OAASC,EAAK,CACZ,GAAIA,aAAe,MAAO,CACxB,IAAIC,EAAQ,CAAC,EAEb,MAAM,kBAAoB,MAAM,kBAAkBA,CAAK,EAAKA,EAAQ,IAAI,MAGxE,IAAMC,EAAQD,EAAM,MAAQA,EAAM,MAAM,QAAQ,QAAS,EAAE,EAAI,GAC/D,GAAI,CACGD,EAAI,MAGEE,GAAS,CAAC,OAAOF,EAAI,KAAK,EAAE,SAASE,EAAM,QAAQ,YAAa,EAAE,CAAC,IAC5EF,EAAI,OAAS;AAAA,EAAOE,GAHpBF,EAAI,MAAQE,CAKhB,MAAY,CAEZ,CACF,CAEA,MAAMF,CACR,CACF,CAEA,SAASF,EAAaC,EAAQ,CAGxB,OAAOD,GAAgB,UACzBC,EAASA,GAAU,CAAC,EACpBA,EAAO,IAAMD,GAEbC,EAASD,GAAe,CAAC,EAG3BC,EAASI,GAAY,KAAK,SAAUJ,CAAM,EAE1C,GAAM,CAAC,aAAAK,EAAc,iBAAAC,EAAkB,QAAAC,CAAO,EAAIP,EAE9CK,IAAiB,QACnBV,GAAU,cAAcU,EAAc,CACpC,kBAAmBX,GAAW,aAAaA,GAAW,OAAO,EAC7D,kBAAmBA,GAAW,aAAaA,GAAW,OAAO,EAC7D,oBAAqBA,GAAW,aAAaA,GAAW,OAAO,CACjE,EAAG,EAAK,EAGNY,GAAoB,OAClBE,EAAM,WAAWF,CAAgB,EACnCN,EAAO,iBAAmB,CACxB,UAAWM,CACb,EAEAX,GAAU,cAAcW,EAAkB,CACxC,OAAQZ,GAAW,SACnB,UAAWA,GAAW,QACxB,EAAG,EAAI,GAKPM,EAAO,oBAAsB,SAEtB,KAAK,SAAS,oBAAsB,OAC7CA,EAAO,kBAAoB,KAAK,SAAS,kBAEzCA,EAAO,kBAAoB,IAG7BL,GAAU,cAAcK,EAAQ,CAC9B,QAASN,GAAW,SAAS,SAAS,EACtC,cAAeA,GAAW,SAAS,eAAe,CACpD,EAAG,EAAI,EAGPM,EAAO,QAAUA,EAAO,QAAU,KAAK,SAAS,QAAU,OAAO,YAAY,EAG7E,IAAIS,EAAiBF,GAAWC,EAAM,MACpCD,EAAQ,OACRA,EAAQP,EAAO,MAAM,CACvB,EAEAO,GAAWC,EAAM,QACf,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,QAAS,QAAQ,EACzDE,GAAW,CACV,OAAOH,EAAQG,CAAM,CACvB,CACF,EAEAV,EAAO,QAAUW,EAAa,OAAOF,EAAgBF,CAAO,EAG5D,IAAMK,EAA0B,CAAC,EAC7BC,EAAiC,GACrC,KAAK,aAAa,QAAQ,QAAQ,SAAoCC,EAAa,CAC7E,OAAOA,EAAY,SAAY,YAAcA,EAAY,QAAQd,CAAM,IAAM,KAIjFa,EAAiCA,GAAkCC,EAAY,YAE/EF,EAAwB,QAAQE,EAAY,UAAWA,EAAY,QAAQ,EAC7E,CAAC,EAED,IAAMC,EAA2B,CAAC,EAClC,KAAK,aAAa,SAAS,QAAQ,SAAkCD,EAAa,CAChFC,EAAyB,KAAKD,EAAY,UAAWA,EAAY,QAAQ,CAC3E,CAAC,EAED,IAAIE,EACAC,EAAI,EACJC,EAEJ,GAAI,CAACL,EAAgC,CACnC,IAAMM,EAAQ,CAACC,GAAgB,KAAK,IAAI,EAAG,MAAS,EAOpD,IANAD,EAAM,QAAQ,GAAGP,CAAuB,EACxCO,EAAM,KAAK,GAAGJ,CAAwB,EACtCG,EAAMC,EAAM,OAEZH,EAAU,QAAQ,QAAQhB,CAAM,EAEzBiB,EAAIC,GACTF,EAAUA,EAAQ,KAAKG,EAAMF,GAAG,EAAGE,EAAMF,GAAG,CAAC,EAG/C,OAAOD,CACT,CAEAE,EAAMN,EAAwB,OAE9B,IAAIS,EAAYrB,EAIhB,IAFAiB,EAAI,EAEGA,EAAIC,GAAK,CACd,IAAMI,EAAcV,EAAwBK,GAAG,EACzCM,EAAaX,EAAwBK,GAAG,EAC9C,GAAI,CACFI,EAAYC,EAAYD,CAAS,CACnC,OAASG,EAAO,CACdD,EAAW,KAAK,KAAMC,CAAK,EAC3B,KACF,CACF,CAEA,GAAI,CACFR,EAAUI,GAAgB,KAAK,KAAMC,CAAS,CAChD,OAASG,EAAO,CACd,OAAO,QAAQ,OAAOA,CAAK,CAC7B,CAKA,IAHAP,EAAI,EACJC,EAAMH,EAAyB,OAExBE,EAAIC,GACTF,EAAUA,EAAQ,KAAKD,EAAyBE,GAAG,EAAGF,EAAyBE,GAAG,CAAC,EAGrF,OAAOD,CACT,CAEA,OAAOhB,EAAQ,CACbA,EAASI,GAAY,KAAK,SAAUJ,CAAM,EAC1C,IAAMyB,EAAWC,GAAc1B,EAAO,QAASA,EAAO,IAAKA,EAAO,iBAAiB,EACnF,OAAO2B,GAASF,EAAUzB,EAAO,OAAQA,EAAO,gBAAgB,CAClE,CACF,EAGAQ,EAAM,QAAQ,CAAC,SAAU,MAAO,OAAQ,SAAS,EAAG,SAA6BE,EAAQ,CAEvFd,GAAM,UAAUc,CAAM,EAAI,SAASkB,EAAK5B,EAAQ,CAC9C,OAAO,KAAK,QAAQI,GAAYJ,GAAU,CAAC,EAAG,CAC5C,OAAAU,EACA,IAAAkB,EACA,MAAO5B,GAAU,CAAC,GAAG,IACvB,CAAC,CAAC,CACJ,CACF,CAAC,EAEDQ,EAAM,QAAQ,CAAC,OAAQ,MAAO,OAAO,EAAG,SAA+BE,EAAQ,CAG7E,SAASmB,EAAmBC,EAAQ,CAClC,OAAO,SAAoBF,EAAKG,EAAM/B,EAAQ,CAC5C,OAAO,KAAK,QAAQI,GAAYJ,GAAU,CAAC,EAAG,CAC5C,OAAAU,EACA,QAASoB,EAAS,CAChB,eAAgB,qBAClB,EAAI,CAAC,EACL,IAAAF,EACA,KAAAG,CACF,CAAC,CAAC,CACJ,CACF,CAEAnC,GAAM,UAAUc,CAAM,EAAImB,EAAmB,EAE7CjC,GAAM,UAAUc,EAAS,MAAM,EAAImB,EAAmB,EAAI,CAC5D,CAAC,EAED,IAAOG,GAAQpC,GCtOf,IAAMqC,GAAN,MAAMC,CAAY,CAChB,YAAYC,EAAU,CACpB,GAAI,OAAOA,GAAa,WACtB,MAAM,IAAI,UAAU,8BAA8B,EAGpD,IAAIC,EAEJ,KAAK,QAAU,IAAI,QAAQ,SAAyBC,EAAS,CAC3DD,EAAiBC,CACnB,CAAC,EAED,IAAMC,EAAQ,KAGd,KAAK,QAAQ,KAAKC,GAAU,CAC1B,GAAI,CAACD,EAAM,WAAY,OAEvB,IAAIE,EAAIF,EAAM,WAAW,OAEzB,KAAOE,KAAM,GACXF,EAAM,WAAWE,CAAC,EAAED,CAAM,EAE5BD,EAAM,WAAa,IACrB,CAAC,EAGD,KAAK,QAAQ,KAAOG,GAAe,CACjC,IAAIC,EAEEC,EAAU,IAAI,QAAQN,GAAW,CACrCC,EAAM,UAAUD,CAAO,EACvBK,EAAWL,CACb,CAAC,EAAE,KAAKI,CAAW,EAEnB,OAAAE,EAAQ,OAAS,UAAkB,CACjCL,EAAM,YAAYI,CAAQ,CAC5B,EAEOC,CACT,EAEAR,EAAS,SAAgBS,EAASC,EAAQC,EAAS,CAC7CR,EAAM,SAKVA,EAAM,OAAS,IAAIS,GAAcH,EAASC,EAAQC,CAAO,EACzDV,EAAeE,EAAM,MAAM,EAC7B,CAAC,CACH,CAKA,kBAAmB,CACjB,GAAI,KAAK,OACP,MAAM,KAAK,MAEf,CAMA,UAAUU,EAAU,CAClB,GAAI,KAAK,OAAQ,CACfA,EAAS,KAAK,MAAM,EACpB,MACF,CAEI,KAAK,WACP,KAAK,WAAW,KAAKA,CAAQ,EAE7B,KAAK,WAAa,CAACA,CAAQ,CAE/B,CAMA,YAAYA,EAAU,CACpB,GAAI,CAAC,KAAK,WACR,OAEF,IAAMC,EAAQ,KAAK,WAAW,QAAQD,CAAQ,EAC1CC,IAAU,IACZ,KAAK,WAAW,OAAOA,EAAO,CAAC,CAEnC,CAEA,eAAgB,CACd,IAAMC,EAAa,IAAI,gBAEjBC,EAASC,GAAQ,CACrBF,EAAW,MAAME,CAAG,CACtB,EAEA,YAAK,UAAUD,CAAK,EAEpBD,EAAW,OAAO,YAAc,IAAM,KAAK,YAAYC,CAAK,EAErDD,EAAW,MACpB,CAMA,OAAO,QAAS,CACd,IAAIX,EAIJ,MAAO,CACL,MAJY,IAAIL,EAAY,SAAkBmB,EAAG,CACjDd,EAASc,CACX,CAAC,EAGC,OAAAd,CACF,CACF,CACF,EAEOe,GAAQrB,GC/GA,SAARsB,GAAwBC,EAAU,CACvC,OAAO,SAAcC,EAAK,CACxB,OAAOD,EAAS,MAAM,KAAMC,CAAG,CACjC,CACF,CChBe,SAARC,GAA8BC,EAAS,CAC5C,OAAOC,EAAM,SAASD,CAAO,GAAMA,EAAQ,eAAiB,EAC9D,CCbA,IAAME,GAAiB,CACrB,SAAU,IACV,mBAAoB,IACpB,WAAY,IACZ,WAAY,IACZ,GAAI,IACJ,QAAS,IACT,SAAU,IACV,4BAA6B,IAC7B,UAAW,IACX,aAAc,IACd,eAAgB,IAChB,YAAa,IACb,gBAAiB,IACjB,OAAQ,IACR,gBAAiB,IACjB,iBAAkB,IAClB,MAAO,IACP,SAAU,IACV,YAAa,IACb,SAAU,IACV,OAAQ,IACR,kBAAmB,IACnB,kBAAmB,IACnB,WAAY,IACZ,aAAc,IACd,gBAAiB,IACjB,UAAW,IACX,SAAU,IACV,iBAAkB,IAClB,cAAe,IACf,4BAA6B,IAC7B,eAAgB,IAChB,SAAU,IACV,KAAM,IACN,eAAgB,IAChB,mBAAoB,IACpB,gBAAiB,IACjB,WAAY,IACZ,qBAAsB,IACtB,oBAAqB,IACrB,kBAAmB,IACnB,UAAW,IACX,mBAAoB,IACpB,oBAAqB,IACrB,OAAQ,IACR,iBAAkB,IAClB,SAAU,IACV,gBAAiB,IACjB,qBAAsB,IACtB,gBAAiB,IACjB,4BAA6B,IAC7B,2BAA4B,IAC5B,oBAAqB,IACrB,eAAgB,IAChB,WAAY,IACZ,mBAAoB,IACpB,eAAgB,IAChB,wBAAyB,IACzB,sBAAuB,IACvB,oBAAqB,IACrB,aAAc,IACd,YAAa,IACb,8BAA+B,GACjC,EAEA,OAAO,QAAQA,EAAc,EAAE,QAAQ,CAAC,CAACC,EAAKC,CAAK,IAAM,CACvDF,GAAeE,CAAK,EAAID,CAC1B,CAAC,EAED,IAAOE,GAAQH,GC3Cf,SAASI,GAAeC,EAAe,CACrC,IAAMC,EAAU,IAAIC,GAAMF,CAAa,EACjCG,EAAWC,GAAKF,GAAM,UAAU,QAASD,CAAO,EAGtD,OAAAI,EAAM,OAAOF,EAAUD,GAAM,UAAWD,EAAS,CAAC,WAAY,EAAI,CAAC,EAGnEI,EAAM,OAAOF,EAAUF,EAAS,KAAM,CAAC,WAAY,EAAI,CAAC,EAGxDE,EAAS,OAAS,SAAgBG,EAAgB,CAChD,OAAOP,GAAeQ,GAAYP,EAAeM,CAAc,CAAC,CAClE,EAEOH,CACT,CAGA,IAAMK,EAAQT,GAAeU,EAAQ,EAGrCD,EAAM,MAAQN,GAGdM,EAAM,cAAgBE,GACtBF,EAAM,YAAcG,GACpBH,EAAM,SAAWI,GACjBJ,EAAM,QAAUK,GAChBL,EAAM,WAAaM,GAGnBN,EAAM,WAAaO,EAGnBP,EAAM,OAASA,EAAM,cAGrBA,EAAM,IAAM,SAAaQ,EAAU,CACjC,OAAO,QAAQ,IAAIA,CAAQ,CAC7B,EAEAR,EAAM,OAASS,GAGfT,EAAM,aAAeU,GAGrBV,EAAM,YAAcD,GAEpBC,EAAM,aAAeW,EAErBX,EAAM,WAAaY,GAASC,GAAehB,EAAM,WAAWe,CAAK,EAAI,IAAI,SAASA,CAAK,EAAIA,CAAK,EAEhGZ,EAAM,WAAac,GAAS,WAE5Bd,EAAM,eAAiBe,GAEvBf,EAAM,QAAUA,EAGhB,IAAOgB,GAAQhB,ECnFf,GAAM,CACJ,MAAAiB,GACA,WAAAC,GACA,cAAAC,GACA,SAAAC,GACA,YAAAC,GACA,QAAAC,GACA,IAAAC,GACA,OAAAC,GACA,aAAAC,GACA,OAAAC,GACA,WAAAC,GACA,aAAAC,GACA,eAAAC,GACA,WAAAC,GACA,WAAAC,GACA,YAAAC,EACF,EAAIC,GCtBJ,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,MAAS,MCDlB,OAAS,KAAAC,MAAS,MAElB,IAAMC,GAAsBD,EAAE,OAAO,CACnC,KAAMA,EAAE,OAAO,EACf,YAAaA,EAAE,OAAO,EACtB,GAAIA,EAAE,OAAO,EACb,eAAgBA,EAAE,OAAO,EACzB,eAAgBA,EAAE,OAAO,OAAO,EAChC,mBAAoBA,EAAE,OAAO,OAAO,EACpC,kBAAmBA,EAAE,OAAO,CAAE,GAAIA,EAAE,OAAO,CAAE,CAAC,EAAE,SAAS,CAC3D,CAAC,EAEKE,GAAwBF,EAAE,OAAO,CACrC,GAAIA,EAAE,OAAO,CACf,CAAC,EAEKG,GAAoBH,EAAE,OAAO,CACjC,MAAOA,EAAE,OAAO,EAChB,SAAUA,EAAE,OAAO,EACnB,mBAAoBA,EAAE,MACpBA,EAAE,OAAO,CACP,aAAcA,EAAE,OAAO,EAAE,SAAS,EAClC,WAAYA,EAAE,QAAQ,EAAE,SAAS,EACjC,WAAYA,EAAE,OAAO,EAAE,SAAS,CAClC,CAAC,CACH,CACF,CAAC,EAEKI,GAAgCJ,EAAE,OAAO,CAC7C,QAASA,EAAE,OAAO,CAAE,MAAOA,EAAE,OAAO,EAAG,YAAaA,EAAE,OAAO,CAAE,CAAC,EAChE,eAAgBA,EAAE,OAAO,CAAE,MAAOA,EAAE,OAAO,CAAE,CAAC,EAC9C,QAASA,EAAE,MAAMG,EAAiB,CACpC,CAAC,EAEKE,GAA2BL,EAAE,OAAO,CACxC,WAAYE,GACZ,oBAAqBE,GACrB,wBAAyBJ,EAAE,OAAO,CAAE,iBAAkBA,EAAE,OAAO,CAAE,CAAC,EAAE,SAAS,EAC7E,iBAAkBA,EAAE,QAAQ,CAC9B,CAAC,EAEYM,GAA8BN,EAAE,OAAO,CAClD,mBAAoBA,EAAE,MAAMA,EAAE,OAAO,CAAC,EACtC,sBAAuBA,EAAE,MAAMA,EAAE,OAAO,CAAC,EACzC,kBAAmBA,EAAE,OAAO,CAC9B,CAAC,EAEYO,GAAiCP,EAAE,OAAO,CACrD,QAASA,EAAE,MAAMG,EAAiB,EAClC,mBAAoBH,EAAE,OAAO,CAC3B,YAAaA,EAAE,OAAO,EACtB,MAAOA,EAAE,OAAO,CAClB,CAAC,EACD,WAAYA,EAAE,OAAO,CAAE,WAAYA,EAAE,OAAO,CAAE,CAAC,CACjD,CAAC,EAEYQ,GAAmBR,EAAE,OAAO,CACvC,OAAQA,EAAE,OAAO,CAAE,MAAOA,EAAE,OAAO,CAAE,CAAC,EAAE,SAAS,CACnD,CAAC,EAEYS,GAAoBT,EAAE,OAAO,CACxC,GAAIA,EAAE,OAAO,EACb,cAAeO,GACf,cAAeP,EAAE,OAAO,EACxB,WAAYA,EAAE,QAAQ,EACtB,eAAgBA,EAAE,OAAO,EACzB,eAAgBA,EAAE,OAAO,OAAO,EAChC,MAAOQ,GAAiB,SAAS,EACjC,YAAaR,EAAE,QAAQ,CACzB,CAAC,EAEYU,GAAmCV,EAAE,OAAO,CACvD,KAAMA,EAAE,OAAO,EACf,aAAcA,EAAE,OAAO,CACrB,cAAeA,EAAE,OAAO,EACxB,YAAaA,EAAE,OAAO,CACxB,CAAC,EACD,eAAgBA,EAAE,OAAO,EACzB,mBAAoBA,EAAE,OAAO,CAAE,eAAgBA,EAAE,OAAO,CAAE,CAAC,EAC3D,uBAAwBA,EAAE,OAAO,CAC/B,qBAAsBA,EAAE,OAAO,EAAE,SAAS,EAC1C,mBAAoBA,EAAE,OAAO,EAAE,SAAS,CAC1C,CAAC,EACD,qBAAsBA,EAAE,OAAO,CAAE,SAAUA,EAAE,OAAO,CAAE,CAAC,EACvD,cAAeA,EAAE,OAAO,CAC1B,CAAC,EAEYW,GAAuBX,EAAE,OAAO,CAC3C,SAAUA,EAAE,MAAMA,EAAE,OAAO,CAAE,KAAMA,EAAE,OAAO,EAAG,SAAUA,EAAE,QAAQ,CAAE,CAAC,CAAC,CACzE,CAAC,EAEYY,GAAmBZ,EAAE,OAAO,CACvC,YAAaA,EAAE,MACbA,EAAE,OAAO,CACP,eAAgBA,EAAE,OAAO,CAAE,WAAYA,EAAE,OAAO,CAAE,CAAC,EACnD,MAAOA,EAAE,OAAO,OAAO,CACzB,CAAC,CACH,CACF,CAAC,EAEYa,GAAwBb,EAAE,MACrCA,EAAE,OAAO,CACP,oBAAqBI,GACrB,wBAAyBJ,EAAE,OAAO,CAAE,iBAAkBA,EAAE,OAAO,CAAE,CAAC,EAAE,SAAS,EAC7E,oBAAqBA,EAAE,OAAO,CAChC,CAAC,CACH,EAEac,GAA8Bd,EAAE,OAAO,CAClD,SAAUC,GACV,cAAeI,GACf,kBAAmBC,GACnB,QAASN,EAAE,MAAMS,EAAiB,EAClC,cAAeT,EAAE,OAAO,OAAO,EAC/B,uBAAwBU,GACxB,iBAAkBC,GAClB,YAAaC,GACb,iBAAkBC,EACpB,CAAC,EAEYE,GAAgCf,EAAE,OAAO,CACpD,GAAIA,EAAE,OAAO,EACb,UAAWA,EAAE,OAAO,CACtB,CAAC,EAEYgB,GAAqBhB,EAAE,KAAK,CACvC,uBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,gBACF,CAAC,EAGYiB,GAAmBjB,EAAE,KAAK,CACrC,qBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,cACF,CAAC,EAGYkB,GAAyBlB,EAAE,KAAK,CAC3C,4BACA,qBACA,oBACF,CAAC,EAGYmB,GAA2BnB,EAAE,OAAO,CAC/C,eAAgBA,EAAE,OAAO,CACvB,QAASA,EAAE,OAAO,EAClB,QAASA,EAAE,OAAO,CAChB,cAAekB,GACf,UAAWlB,EAAE,OAAO,EACpB,SAAUgB,GACV,OAAQC,EACV,CAAC,EACD,MAAOjB,EAAE,OAAO,CACd,SAAUA,EAAE,OAAO,CACjB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,UAAWA,EAAE,OAAO,EAAE,SAAS,EAC/B,cAAeA,EAAE,OAAO,EAAE,SAAS,CACrC,CAAC,EACD,OAAQA,EAAE,OAAO,CACf,WAAYA,EAAE,OAAO,CACnB,WAAYA,EAAE,OAAO,CACnB,GAAIA,EAAE,OAAO,CACf,CAAC,EACD,oBAAqBI,GACrB,iBAAkBJ,EAAE,QAAQ,CAC9B,CAAC,EACD,qBAAsBO,GACtB,kBAAmBD,GACnB,uBAAwBI,GACxB,iBAAkBC,GAClB,MAAOH,GAAiB,SAAS,CACnC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,EAEYY,GAA4BpB,EAAE,OAAO,CAChD,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,MACVA,EAAE,OAAO,CACP,OAAQA,EAAE,OAAO,C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AA;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;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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
|
|
6
6
|
"names": ["StdioServerTransport", "dotenv", "join", "fileURLToPath", "toolNames", "toolGroupNames", "toolGroups", "isToolName", "value", "name", "isToolGroupName", "transports", "isTransport", "transport", "t", "invariant", "condition", "message", "__dirname", "fileURLToPath", "authTypes", "Config", "cleansedVars", "removeClaudeMcpBundleUserConfigTemplates", "auth", "server", "siteName", "transport", "sslKey", "sslCert", "httpPortEnvVarName", "corsOriginConfig", "patName", "patValue", "jwtSubClaim", "clientId", "secretId", "secretValue", "jwtAdditionalPayload", "datasourceCredentials", "defaultLogLevel", "disableLogMasking", "includeTools", "excludeTools", "maxResultLimit", "disableQueryDatasourceFilterValidation", "disableMetadataApiRequests", "enableServerLogging", "serverLogDirectory", "defaultPort", "httpPort", "httpPortNumber", "type", "isTransport", "getCorsOriginConfig", "join", "maxResultLimitNumber", "s", "v", "isToolName", "isToolGroupName", "toolGroups", "invariant", "validateServer", "_", "error", "errorMessage", "origin", "envVars", "acc", "key", "value", "getConfig", "loggingLevels", "currentLogLevel", "serverLogger", "isLoggingLevel", "level", "l", "setLogLevel", "server", "silent", "log", "setServerLogger", "logger", "getSendLoggingMessageFn", "shouldLogWhenLevelIsAtLeast", "writeToStderr", "message", "getToolLogMessage", "requestId", "toolName", "args", "appendFile", "existsSync", "mkdirSync", "join", "getExceptionMessage", "error", "ServerLogger", "logDirectory", "existsSync", "mkdirSync", "obj", "timestamp", "filename", "logFilePath", "join", "mutexKey", "newMutex", "appendFile", "error", "writeToStderr", "getExceptionMessage", "McpServer", "SetLevelRequestSchema", "package_default", "Ok", "z", "Err", "Ok", "maskRequest", "config", "result", "clone", "maskedData", "shouldLogWhenLevelIsAtLeast", "connection", "maskResponse", "response", "obj", "Ok", "error", "Err", "message", "getExceptionMessage", "writeToStderr", "getRequestInterceptorConfig", "config", "getResponseInterceptorConfig", "response", "Zodios", "randomUUID", "SignJWT", "getJwt", "username", "connectedApp", "scopes", "additionalPayload", "header", "payload", "makeApi", "makeEndpoint", "z", "z", "credentialsSchema", "signInRequestSchema", "z", "signInEndpoint", "makeEndpoint", "credentialsSchema", "signOutEndpoint", "authenticationApi", "makeApi", "authenticationApis", "Methods", "apiClient", "AuthenticatedMethods", "Methods", "apiClient", "creds", "AuthenticationMethods", "Methods", "baseUrl", "Zodios", "authenticationApis", "authConfig", "getJwt", "AuthenticatedAuthenticationMethods", "AuthenticatedMethods", "creds", "Zodios", "makeApi", "makeEndpoint", "z", "z", "orderingMethods", "orderBySchema", "contentTypes", "modifiedTimeSchema", "searchContentFilterBase", "searchContentFilterSchema", "searchContentItemSchema", "searchContentResponseSchema", "searchContentEndpoint", "makeEndpoint", "z", "searchContentResponseSchema", "contentExplorationApi", "makeApi", "contentExplorationApis", "ContentExplorationMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "contentExplorationApis", "queries", "key", "value", "Zodios", "makeApi", "makeEndpoint", "z", "z", "z", "projectSchema", "dataSourceSchema", "z", "projectSchema", "z", "paginationSchema", "z", "paginationParameters", "listDatasourcesRestEndpoint", "makeEndpoint", "paginationParameters", "z", "paginationSchema", "dataSourceSchema", "datasourcesApi", "makeApi", "datasourcesApis", "DatasourcesMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "datasourcesApis", "siteId", "filter", "pageSize", "pageNumber", "response", "Zodios", "makeApi", "makeEndpoint", "z", "graphqlResponse", "graphqlEndpoint", "metadataApi", "metadataApis", "MetadataMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "metadataApis", "query", "Zodios", "Err", "Ok", "bind", "fn", "thisArg", "toString", "getPrototypeOf", "iterator", "toStringTag", "kindOf", "cache", "thing", "str", "kindOfTest", "type", "typeOfTest", "isArray", "isUndefined", "isBuffer", "val", "isFunction", "isArrayBuffer", "isArrayBufferView", "result", "isString", "isNumber", "isObject", "isBoolean", "isPlainObject", "prototype", "isEmptyObject", "isDate", "isFile", "isBlob", "isFileList", "isStream", "isFormData", "kind", "isURLSearchParams", "isReadableStream", "isRequest", "isResponse", "isHeaders", "trim", "forEach", "obj", "fn", "allOwnKeys", "l", "keys", "len", "key", "findKey", "_key", "_global", "isContextDefined", "context", "merge", "caseless", "skipUndefined", "assignValue", "targetKey", "i", "extend", "a", "b", "thisArg", "bind", "stripBOM", "content", "inherits", "constructor", "superConstructor", "props", "descriptors", "toFlatObject", "sourceObj", "destObj", "filter", "propFilter", "prop", "merged", "endsWith", "searchString", "position", "lastIndex", "toArray", "arr", "isTypedArray", "TypedArray", "forEachEntry", "_iterator", "pair", "matchAll", "regExp", "matches", "isHTMLForm", "toCamelCase", "m", "p1", "p2", "hasOwnProperty", "isRegExp", "reduceDescriptors", "reducer", "reducedDescriptors", "descriptor", "name", "ret", "freezeMethods", "value", "toObjectSet", "arrayOrString", "delimiter", "define", "noop", "toFiniteNumber", "defaultValue", "isSpecCompliantForm", "toJSONObject", "stack", "visit", "source", "target", "reducedValue", "isAsyncFn", "isThenable", "_setImmediate", "setImmediateSupported", "postMessageSupported", "token", "callbacks", "data", "cb", "asap", "isIterable", "utils_default", "AxiosError", "message", "code", "config", "request", "response", "utils_default", "prototype", "descriptors", "error", "customProps", "axiosError", "obj", "prop", "msg", "errCode", "AxiosError_default", "FormData", "FormData_default", "isVisitable", "thing", "utils_default", "removeBrackets", "key", "renderKey", "path", "dots", "token", "i", "isFlatArray", "arr", "predicates", "prop", "toFormData", "obj", "formData", "options", "FormData_default", "option", "source", "metaTokens", "visitor", "defaultVisitor", "indexes", "useBlob", "convertValue", "value", "AxiosError_default", "el", "index", "stack", "exposedHelpers", "build", "toFormData_default", "encode", "str", "charMap", "match", "AxiosURLSearchParams", "params", "options", "toFormData_default", "prototype", "name", "value", "encoder", "_encode", "pair", "AxiosURLSearchParams_default", "encode", "val", "buildURL", "url", "params", "options", "_encode", "utils_default", "serializeFn", "serializedParams", "AxiosURLSearchParams_default", "hashmarkIndex", "InterceptorManager", "fulfilled", "rejected", "options", "id", "fn", "utils_default", "h", "InterceptorManager_default", "transitional_default", "crypto", "url", "URLSearchParams_default", "ALPHA", "DIGIT", "ALPHABET", "generateString", "size", "alphabet", "str", "length", "randomValues", "crypto", "i", "node_default", "URLSearchParams_default", "FormData_default", "utils_exports", "__export", "hasBrowserEnv", "hasStandardBrowserEnv", "hasStandardBrowserWebWorkerEnv", "_navigator", "origin", "platform_default", "utils_exports", "node_default", "toURLEncodedForm", "data", "options", "toFormData_default", "platform_default", "value", "key", "path", "helpers", "utils_default", "parsePropPath", "name", "utils_default", "match", "arrayToObject", "arr", "obj", "keys", "len", "key", "formDataToJSON", "formData", "buildPath", "path", "value", "target", "index", "isNumericKey", "isLast", "formDataToJSON_default", "stringifySafely", "rawValue", "parser", "encoder", "utils_default", "e", "defaults", "transitional_default", "data", "headers", "contentType", "hasJSONContentType", "isObjectPayload", "formDataToJSON_default", "isFileList", "toURLEncodedForm", "_FormData", "toFormData_default", "transitional", "forcedJSONParsing", "JSONRequested", "strictJSONParsing", "AxiosError_default", "platform_default", "status", "method", "defaults_default", "ignoreDuplicateOf", "utils_default", "parseHeaders_default", "rawHeaders", "parsed", "key", "val", "i", "line", "$internals", "normalizeHeader", "header", "normalizeValue", "value", "utils_default", "parseTokens", "str", "tokens", "tokensRE", "match", "isValidHeaderName", "matchHeaderValue", "context", "filter", "isHeaderNameFilter", "formatHeader", "w", "char", "buildAccessors", "obj", "accessorName", "methodName", "arg1", "arg2", "arg3", "AxiosHeaders", "headers", "valueOrRewrite", "rewrite", "self", "setHeader", "_value", "_header", "_rewrite", "lHeader", "key", "setHeaders", "parseHeaders_default", "dest", "entry", "parser", "matcher", "deleted", "deleteHeader", "keys", "format", "normalized", "targets", "asStrings", "thing", "first", "computed", "target", "accessors", "prototype", "defineAccessor", "mapped", "headerValue", "AxiosHeaders_default", "transformData", "fns", "response", "config", "defaults_default", "context", "headers", "AxiosHeaders_default", "data", "utils_default", "fn", "isCancel", "value", "CanceledError", "message", "config", "request", "AxiosError_default", "utils_default", "CanceledError_default", "settle", "resolve", "reject", "response", "validateStatus", "AxiosError_default", "isAbsoluteURL", "url", "combineURLs", "baseURL", "relativeURL", "buildFullPath", "baseURL", "requestedURL", "allowAbsoluteUrls", "isRelativeUrl", "isAbsoluteURL", "combineURLs", "proxyFromEnv", "http", "https", "util", "followRedirects", "zlib", "VERSION", "parseProtocol", "url", "match", "DATA_URL_PATTERN", "fromDataURI", "uri", "asBlob", "options", "_Blob", "platform_default", "protocol", "parseProtocol", "match", "AxiosError_default", "mime", "isBase64", "body", "buffer", "stream", "stream", "kInternals", "AxiosTransformStream", "stream", "options", "utils_default", "prop", "source", "internals", "event", "size", "chunk", "encoding", "callback", "maxRate", "readableHighWaterMark", "timeWindow", "divider", "bytesThreshold", "minChunkSize", "pushChunk", "_chunk", "_callback", "bytes", "transformChunk", "chunkSize", "chunkRemainder", "maxChunkSize", "bytesLeft", "passed", "now", "transformNextChunk", "err", "AxiosTransformStream_default", "EventEmitter", "util", "Readable", "asyncIterator", "readBlob", "blob", "readBlob_default", "BOUNDARY_ALPHABET", "platform_default", "textEncoder", "util", "CRLF", "CRLF_BYTES", "CRLF_BYTES_COUNT", "FormDataPart", "name", "value", "escapeName", "isStringValue", "utils_default", "headers", "readBlob_default", "match", "formDataToStream", "form", "headersHandler", "options", "tag", "size", "boundary", "boundaryBytes", "footerBytes", "contentLength", "parts", "part", "computedHeaders", "Readable", "formDataToStream_default", "stream", "ZlibHeaderTransformStream", "chunk", "encoding", "callback", "header", "ZlibHeaderTransformStream_default", "callbackify", "fn", "reducer", "utils_default", "args", "cb", "value", "err", "callbackify_default", "speedometer", "samplesCount", "min", "bytes", "timestamps", "head", "tail", "firstSampleTS", "chunkLength", "now", "startedAt", "i", "bytesCount", "passed", "speedometer_default", "throttle", "fn", "freq", "timestamp", "threshold", "lastArgs", "timer", "invoke", "args", "now", "passed", "throttle_default", "progressEventReducer", "listener", "isDownloadStream", "freq", "bytesNotified", "_speedometer", "speedometer_default", "throttle_default", "e", "loaded", "total", "progressBytes", "rate", "inRange", "data", "progressEventDecorator", "throttled", "lengthComputable", "asyncDecorator", "fn", "args", "utils_default", "estimateDataURLDecodedBytes", "url", "comma", "meta", "body", "effectiveLen", "len", "i", "a", "b", "pad", "idx", "tailIsPct3D", "j", "bytes", "zlibOptions", "zlib", "brotliOptions", "isBrotliSupported", "utils_default", "httpFollow", "httpsFollow", "followRedirects", "isHttps", "supportedProtocols", "platform_default", "protocol", "flushOnFinish", "stream", "throttled", "flush", "dispatchBeforeRedirect", "options", "responseDetails", "setProxy", "configProxy", "location", "proxy", "proxyUrl", "proxyFromEnv", "base64", "proxyHost", "redirectOptions", "isHttpAdapterSupported", "wrapAsync", "asyncExecutor", "resolve", "reject", "onDone", "isDone", "done", "value", "isRejected", "_resolve", "_reject", "reason", "onDoneHandler", "resolveFamily", "address", "family", "buildAddressEntry", "http_default", "config", "data", "lookup", "responseType", "responseEncoding", "method", "rejected", "req", "_lookup", "callbackify_default", "hostname", "opt", "cb", "err", "arg0", "arg1", "addresses", "addr", "emitter", "EventEmitter", "onFinished", "abort", "CanceledError_default", "fullPath", "buildFullPath", "parsed", "dataUrl", "estimateDataURLDecodedBytes", "AxiosError_default", "convertedData", "settle", "fromDataURI", "AxiosHeaders_default", "headers", "VERSION", "onUploadProgress", "onDownloadProgress", "maxRate", "maxUploadRate", "maxDownloadRate", "userBoundary", "formDataToStream_default", "formHeaders", "knownLength", "util", "readBlob_default", "contentLength", "AxiosTransformStream_default", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "auth", "username", "password", "urlUsername", "urlPassword", "path", "buildURL", "customErr", "transport", "isHttpsRequest", "https", "http", "res", "streams", "responseLength", "transformStream", "responseStream", "lastRequest", "ZlibHeaderTransformStream_default", "offListeners", "response", "responseBuffer", "totalResponseBytes", "chunk", "responseData", "socket", "timeout", "timeoutErrorMessage", "transitional", "transitional_default", "ended", "errored", "isURLSameOrigin_default", "platform_default", "origin", "isMSIE", "url", "cookies_default", "platform_default", "name", "value", "expires", "path", "domain", "secure", "cookie", "utils_default", "match", "headersToObject", "thing", "AxiosHeaders_default", "mergeConfig", "config1", "config2", "config", "getMergedValue", "target", "source", "prop", "caseless", "utils_default", "mergeDeepProperties", "a", "b", "valueFromConfig2", "defaultToConfig2", "mergeDirectKeys", "mergeMap", "merge", "configValue", "resolveConfig_default", "config", "newConfig", "mergeConfig", "data", "withXSRFToken", "xsrfHeaderName", "xsrfCookieName", "headers", "auth", "AxiosHeaders_default", "buildURL", "buildFullPath", "utils_default", "platform_default", "formHeaders", "allowedHeaders", "key", "val", "isURLSameOrigin_default", "xsrfValue", "cookies_default", "isXHRAdapterSupported", "xhr_default", "config", "resolve", "reject", "_config", "resolveConfig_default", "requestData", "requestHeaders", "AxiosHeaders_default", "responseType", "onUploadProgress", "onDownloadProgress", "onCanceled", "uploadThrottled", "downloadThrottled", "flushUpload", "flushDownload", "done", "request", "onloadend", "responseHeaders", "response", "settle", "value", "err", "AxiosError_default", "event", "msg", "timeoutErrorMessage", "transitional", "transitional_default", "utils_default", "val", "key", "progressEventReducer", "cancel", "CanceledError_default", "protocol", "parseProtocol", "platform_default", "composeSignals", "signals", "timeout", "length", "controller", "aborted", "onabort", "reason", "unsubscribe", "err", "AxiosError_default", "CanceledError_default", "timer", "signal", "utils_default", "composeSignals_default", "streamChunk", "chunk", "chunkSize", "len", "pos", "end", "readBytes", "iterable", "readStream", "stream", "reader", "done", "value", "trackStream", "onProgress", "onFinish", "iterator", "bytes", "_onFinish", "e", "controller", "loadedBytes", "err", "reason", "DEFAULT_CHUNK_SIZE", "isFunction", "utils_default", "globalFetchAPI", "fetch", "Request", "Response", "ReadableStream", "TextEncoder", "test", "fn", "args", "factory", "env", "isFetchSupported", "isRequestSupported", "isResponseSupported", "isReadableStreamSupported", "encodeText", "encoder", "str", "supportsRequestStream", "duplexAccessed", "hasContentType", "platform_default", "supportsResponseStream", "resolvers", "res", "type", "config", "method", "AxiosError_default", "getBodyLength", "body", "resolveBodyLength", "headers", "length", "url", "data", "signal", "cancelToken", "timeout", "onDownloadProgress", "onUploadProgress", "responseType", "withCredentials", "fetchOptions", "resolveConfig_default", "composedSignal", "composeSignals_default", "request", "unsubscribe", "requestContentLength", "_request", "contentTypeHeader", "onProgress", "flush", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "trackStream", "isCredentialsSupported", "resolvedOptions", "response", "isStreamResponse", "options", "prop", "responseContentLength", "responseData", "resolve", "reject", "settle", "AxiosHeaders_default", "err", "seedCache", "getFetch", "seeds", "len", "i", "seed", "target", "map", "adapter", "knownAdapters", "http_default", "xhr_default", "getFetch", "utils_default", "fn", "value", "renderReason", "reason", "isResolvedHandle", "adapter", "adapters_default", "adapters", "config", "length", "nameOrAdapter", "rejectedReasons", "i", "id", "AxiosError_default", "reasons", "state", "s", "throwIfCancellationRequested", "config", "CanceledError_default", "dispatchRequest", "AxiosHeaders_default", "transformData", "adapters_default", "defaults_default", "response", "reason", "isCancel", "validators", "type", "i", "thing", "deprecatedWarnings", "validator", "version", "message", "formatMessage", "opt", "desc", "VERSION", "value", "opts", "AxiosError_default", "correctSpelling", "assertOptions", "options", "schema", "allowUnknown", "keys", "result", "validator_default", "validators", "validator_default", "Axios", "instanceConfig", "InterceptorManager_default", "configOrUrl", "config", "err", "dummy", "stack", "mergeConfig", "transitional", "paramsSerializer", "headers", "utils_default", "contextHeaders", "method", "AxiosHeaders_default", "requestInterceptorChain", "synchronousRequestInterceptors", "interceptor", "responseInterceptorChain", "promise", "i", "len", "chain", "dispatchRequest", "newConfig", "onFulfilled", "onRejected", "error", "fullPath", "buildFullPath", "buildURL", "url", "generateHTTPMethod", "isForm", "data", "Axios_default", "CancelToken", "_CancelToken", "executor", "resolvePromise", "resolve", "token", "cancel", "i", "onfulfilled", "_resolve", "promise", "message", "config", "request", "CanceledError_default", "listener", "index", "controller", "abort", "err", "c", "CancelToken_default", "spread", "callback", "arr", "isAxiosError", "payload", "utils_default", "HttpStatusCode", "key", "value", "HttpStatusCode_default", "createInstance", "defaultConfig", "context", "Axios_default", "instance", "bind", "utils_default", "instanceConfig", "mergeConfig", "axios", "defaults_default", "CanceledError_default", "CancelToken_default", "isCancel", "VERSION", "toFormData_default", "AxiosError_default", "promises", "spread", "isAxiosError", "AxiosHeaders_default", "thing", "formDataToJSON_default", "adapters_default", "HttpStatusCode_default", "axios_default", "Axios", "AxiosError", "CanceledError", "isCancel", "CancelToken", "VERSION", "all", "Cancel", "isAxiosError", "spread", "toFormData", "AxiosHeaders", "HttpStatusCode", "formToJSON", "getAdapter", "mergeConfig", "axios_default", "makeApi", "makeEndpoint", "z", "z", "pulseMetadataSchema", "pulseDatasourceSchema", "pulseFilterSchema", "pulseBasicSpecificationSchema", "pulseSpecificationSchema", "pulseExtensionOptionsSchema", "pulseMetricSpecificationSchema", "pulseGoalsSchema", "pulseMetricSchema", "pulseRepresentationOptionsSchema", "insightOptionsSchema", "comparisonSchema", "datasourceGoalsSchema", "pulseMetricDefinitionSchema", "pulseMetricSubscriptionSchema", "languageEnumSchema", "localeEnumSchema", "outputFormatEnumSchema", "pulseBundleRequestSchema", "popcBanInsightGroupSchema", "pulseBundleResponseSchema", "pulseInsightBundleTypeEnum", "pulseMetricDefinitionViewEnum", "listAllPulseMetricDefinitionsRestEndpoint", "makeEndpoint", "z", "pulseMetricDefinitionViewEnum", "pulseMetricDefinitionSchema", "listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint", "listPulseMetricsFromMetricDefinitionIdRestEndpoint", "pulseMetricSchema", "listPulseMetricsFromMetricIdsRestEndpoint", "listPulseMetricSubscriptionsForCurrentUserRestEndpoint", "pulseMetricSubscriptionSchema", "generatePulseMetricValueInsightBundleRestEndpoint", "pulseBundleRequestSchema", "pulseInsightBundleTypeEnum", "pulseBundleResponseSchema", "pulseApi", "makeApi", "pulseApis", "PulseMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "pulseApis", "view", "guardAgainstPulseDisabled", "metricDefinitionIds", "pulseMetricDefinitionID", "metricIds", "bundleRequest", "bundleType", "callback", "Ok", "error", "isAxiosError", "Err", "Zodios", "makeApi", "makeEndpoint", "z", "z", "viewSchema", "queryViewDataEndpoint", "makeEndpoint", "z", "queryViewImageEndpoint", "queryViewsForWorkbookEndpoint", "viewSchema", "queryViewsForSiteEndpoint", "paginationParameters", "paginationSchema", "viewsApi", "makeApi", "viewsApis", "ViewsMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "viewsApis", "viewId", "siteId", "width", "height", "resolution", "workbookId", "includeUsageStatistics", "filter", "pageSize", "pageNumber", "response", "isErrorFromAlias", "Zodios", "ZodiosError", "Err", "Ok", "makeApi", "z", "Connection", "Datasource", "ReturnFormat", "QueryOptions", "ReadMetadataRequest", "Function", "DataType", "PeriodType", "FieldMetadata", "ParameterValue", "ParameterBase", "Parameter", "MetadataOutput", "TableauError", "SortDirection", "FieldBase", "Field", "FilterField", "FilterBase", "SimpleFilterBase", "SetFilter", "RelativeDateFilterBase", "RelativeDateFilter", "MatchFilterBase", "MatchFilter", "QuantitativeNumericalFilterBase", "QuantitativeNumericalFilter", "QuantitativeDateFilterBase", "QuantitativeDateFilter", "TopNFilter", "Filter", "Query", "QueryDatasourceOptions", "QueryRequest", "QueryOutput", "vizqlDataServiceApi", "vizqlDataServiceApis", "VizqlDataServiceMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "vizqlDataServiceApis", "queryRequest", "Ok", "error", "isErrorFromAlias", "Err", "ZodiosError", "readMetadataRequest", "Zodios", "makeApi", "makeEndpoint", "z", "z", "workbookSchema", "z", "projectSchema", "viewSchema", "getWorkbookEndpoint", "makeEndpoint", "z", "workbookSchema", "queryWorkbooksForSiteEndpoint", "paginationParameters", "paginationSchema", "workbooksApi", "makeApi", "workbooksApis", "WorkbooksMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "workbooksApis", "workbookId", "siteId", "filter", "pageSize", "pageNumber", "response", "RestApi", "_RestApi", "host", "options", "AuthenticationMethods", "AuthenticatedAuthenticationMethods", "ContentExplorationMethods", "DatasourcesMethods", "baseUrl", "MetadataMethods", "PulseMethods", "VizqlDataServiceMethods", "ViewsMethods", "WorkbooksMethods", "authConfig", "interceptors", "config", "getRequestInterceptorConfig", "error", "response", "getResponseInterceptorConfig", "getNewRestApiInstanceAsync", "config", "requestId", "server", "jwtScopes", "restApi", "RestApi", "getRequestInterceptor", "getRequestErrorInterceptor", "getResponseInterceptor", "getResponseErrorInterceptor", "getJwtSubClaim", "getJwtAdditionalPayload", "useRestApi", "callback", "request", "logRequest", "error", "baseUrl", "isAxiosError", "log", "getExceptionMessage", "getRequestInterceptorConfig", "response", "logResponse", "getResponseInterceptorConfig", "maskedRequest", "getConfig", "maskRequest", "url", "messageObj", "shouldLogWhenLevelIsAtLeast", "maskedResponse", "maskResponse", "json", "ZodiosError", "fromError", "isZodErrorLike", "Tool", "server", "name", "description", "paramsSchema", "annotations", "argsValidator", "callback", "requestId", "args", "log", "getToolLogMessage", "getSuccessResult", "getErrorText", "error", "getErrorResult", "result", "ZodiosError", "isZodErrorLike", "validationError", "fromError", "getExceptionMessage", "buildOrderByString", "orderBy", "methodsUsed", "ordering", "buildFilterString", "filter", "filterExpressions", "typesUsed", "type", "idsUsed", "id", "modifiedTimesUsed", "modifiedTime", "startDate", "endDate", "reduceSearchContentResponse", "response", "searchResults", "item", "getReducedSearchItemContent", "content", "reducedContent", "paramsSchema", "z", "orderBySchema", "searchContentFilterSchema", "getSearchContentTool", "server", "searchContentTool", "Tool", "terms", "limit", "orderBy", "filter", "requestId", "config", "getConfig", "orderByString", "buildOrderByString", "filterString", "buildFilterString", "Ok", "useRestApi", "restApi", "response", "reduceSearchContentResponse", "Err", "Ok", "z", "getVizqlDataServiceDisabledError", "validateDatasourceLuid", "datasourceLuid", "z", "fieldSchema", "parameterSchema", "fieldsResultSchema", "simplifyReadMetadataResult", "readMetadataResult", "simplifiedResponse", "field", "toPush", "parameter", "combineFields", "listFieldsResult", "combinedFields", "populateFieldWithAdditionalProperties", "matchingListField", "f", "sourceField", "targetField", "getGraphqlQuery", "datasourceLuid", "paramsSchema", "z", "getGetDatasourceMetadataTool", "server", "getDatasourceMetadataTool", "Tool", "validateDatasourceLuid", "requestId", "config", "getConfig", "query", "useRestApi", "restApi", "readMetadataResult", "Err", "Ok", "simplifyReadMetadataResult", "listFieldsResult", "combineFields", "error", "getVizqlDataServiceDisabledError", "Ok", "z", "z", "pageConfigSchema", "paginate", "pageConfig", "getDataFn", "pageSize", "limit", "pagination", "data", "result", "totalAvailable", "pageNumber", "nextPagination", "nextData", "genericFilterDescription", "z", "z", "FilterOperatorSchema", "isISO8601DateTime", "value", "dateTimeFields", "parseAndValidateFilterString", "filterString", "allowedOperatorsByField", "filterFieldSchema", "isOperatorAllowed", "field", "operator", "expressions", "f", "parsedFilters", "expr", "fieldRaw", "operatorRaw", "valueParts", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateDatasourcesFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListDatasourcesTool", "server", "listDatasourcesTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "config", "getConfig", "validatedFilter", "parseAndValidateDatasourcesFilterString", "datasources", "useRestApi", "restApi", "paginate", "pageConfig", "pagination", "data", "Ok", "z", "getPulseDisabledError", "reason", "paramsSchema", "pulseBundleRequestSchema", "z", "pulseInsightBundleTypeEnum", "getGeneratePulseMetricValueInsightBundleTool", "server", "generatePulseMetricValueInsightBundleTool", "Tool", "bundleRequest", "bundleType", "requestId", "config", "getConfig", "useRestApi", "restApi", "getPulseDisabledError", "z", "paramsSchema", "z", "pulseMetricDefinitionViewEnum", "getListAllPulseMetricDefinitionsTool", "server", "listAllPulseMetricDefinitionsTool", "Tool", "view", "requestId", "config", "getConfig", "useRestApi", "restApi", "getPulseDisabledError", "z", "paramsSchema", "z", "pulseMetricDefinitionViewEnum", "getListPulseMetricDefinitionsFromDefinitionIdsTool", "server", "listPulseMetricDefinitionsFromDefinitionIdsTool", "Tool", "view", "metricDefinitionIds", "requestId", "config", "getConfig", "useRestApi", "restApi", "getPulseDisabledError", "z", "paramsSchema", "z", "getListPulseMetricsFromMetricDefinitionIdTool", "server", "listPulseMetricsFromMetricDefinitionIdTool", "Tool", "pulseMetricDefinitionID", "requestId", "config", "getConfig", "useRestApi", "restApi", "getPulseDisabledError", "z", "paramsSchema", "z", "getListPulseMetricsFromMetricIdsTool", "server", "listPulseMetricsFromMetricIdsTool", "Tool", "metricIds", "requestId", "config", "getConfig", "useRestApi", "restApi", "getPulseDisabledError", "paramsSchema", "getListPulseMetricSubscriptionsTool", "server", "listPulseMetricSubscriptionsTool", "Tool", "_", "requestId", "config", "getConfig", "useRestApi", "restApi", "getPulseDisabledError", "ZodiosError", "Err", "z", "z", "schema", "z", "luid", "u", "p", "credentialMap", "initialized", "getDatasourceCredentials", "datasourceLuid", "datasourceCredentials", "getConfig", "obj", "e", "parsed", "handleQueryDatasourceError", "error", "errorDetail", "validateFields", "fields", "hasEmptyFieldCaption", "fieldCounts", "acc", "field", "duplicateFields", "_", "count", "sortPriorities", "duplicateSortPriorities", "duplicateSortPrioritiesArr", "priority", "fieldsWithBothFunctionAndCalculation", "hasFunctionAndCalculation", "fieldsWithNegativeMaxDecimalPlace", "hasNegativeMaxDecimalPlace", "hasFieldCaptionAndCalculation", "Err", "Ok", "validateFilters", "filters", "filter", "fieldCounts", "acc", "fieldsWithMultipleFilters", "_", "count", "field", "filtersWithInvalidFields", "result", "validateFilterField", "topNFiltersWithInvalidFields", "matchFiltersWithInvalidFields", "hasEmptyFieldCaption", "Err", "hasFieldCaptionAndCalculation", "fieldCaption", "hasFunctionAndCalculation", "Ok", "validateQuery", "datasourceLuid", "query", "validateDatasourceLuid", "fields", "filters", "validateFields", "validateFilters", "Query", "queryDatasourceToolDescription", "levenshtein", "Err", "Ok", "validateFilterValues", "server", "query", "vizqlDataServiceMethods", "datasource", "Ok", "validationErrors", "filtersToValidate", "filter", "fieldCaption", "result", "validateSetFilter", "validateMatchFilter", "error", "log", "Err", "filterValues", "v", "queryRequest", "data", "existingValues", "row", "invalidValues", "value", "suggestedValues", "getFuzzyMatches", "message", "fieldValues", "similarValues", "lowerValue", "fuzzyStartMatch", "pattern", "len", "dynamicDistance", "startSlice", "levenshtein", "fuzzyEndMatch", "endSlice", "fuzzyContainsMatch", "_", "i", "dist", "patternDescriptions", "similarValuesString", "maxDistance", "maxSuggestions", "suggestions", "existingValue", "matches", "invalidValue", "match", "a", "b", "bestMatch", "toReturn", "suggestionLimitPerInvalidValue", "invalidValueSuggestionCounter", "suggestionForInvalidValue", "paramsSchema", "z", "Query", "getQueryDatasourceTool", "server", "queryDatasourceTool", "Tool", "queryDatasourceToolDescription", "validateQuery", "datasourceLuid", "query", "requestId", "config", "getConfig", "datasource", "options", "credentials", "getDatasourceCredentials", "queryRequest", "useRestApi", "restApi", "filterValidationResult", "validateFilterValues", "errorMessage", "error", "Err", "result", "ZodiosError", "getVizqlDataServiceDisabledError", "handleQueryDatasourceError", "Ok", "z", "paramsSchema", "z", "getGetViewDataTool", "server", "getViewDataTool", "Tool", "viewId", "requestId", "config", "getConfig", "Ok", "useRestApi", "restApi", "Ok", "z", "convertPngDataToToolResult", "pngData", "paramsSchema", "z", "getGetViewImageTool", "server", "getViewImageTool", "Tool", "viewId", "width", "height", "requestId", "config", "getConfig", "Ok", "useRestApi", "restApi", "convertPngDataToToolResult", "Ok", "z", "z", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateViewsFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListViewsTool", "server", "listViewsTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "config", "getConfig", "validatedFilter", "parseAndValidateViewsFilterString", "Ok", "useRestApi", "restApi", "paginate", "pageConfig", "pagination", "data", "Ok", "z", "paramsSchema", "z", "getGetWorkbookTool", "server", "getWorkbookTool", "Tool", "workbookId", "requestId", "config", "getConfig", "Ok", "useRestApi", "restApi", "workbook", "views", "Ok", "z", "z", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateWorkbooksFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListWorkbooksTool", "server", "listWorkbooksTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "config", "getConfig", "validatedFilter", "parseAndValidateWorkbooksFilterString", "Ok", "useRestApi", "restApi", "paginate", "pageConfig", "pagination", "data", "toolFactories", "getGetDatasourceMetadataTool", "getListDatasourcesTool", "getQueryDatasourceTool", "getListAllPulseMetricDefinitionsTool", "getListPulseMetricDefinitionsFromDefinitionIdsTool", "getListPulseMetricsFromMetricDefinitionIdTool", "getListPulseMetricsFromMetricIdsTool", "getListPulseMetricSubscriptionsTool", "getGeneratePulseMetricValueInsightBundleTool", "getGetWorkbookTool", "getGetViewDataTool", "getGetViewImageTool", "getListWorkbooksTool", "getListViewsTool", "getSearchContentTool", "serverName", "serverVersion", "package_default", "Server", "McpServer", "name", "description", "paramsSchema", "annotations", "callback", "SetLevelRequestSchema", "request", "setLogLevel", "includeTools", "excludeTools", "getConfig", "toolsToRegister", "toolFactories", "tool", "toolNames", "StreamableHTTPServerTransport", "cors", "express", "fs", "existsSync", "http", "https", "startExpressServer", "basePath", "config", "logLevel", "app", "express", "cors", "path", "createMcpServer", "methodNotAllowed", "resolve", "http", "existsSync", "options", "fs", "https", "req", "res", "server", "Server", "transport", "StreamableHTTPServerTransport", "setLogLevel", "error", "_req", "startServer", "dotenv", "config", "getConfig", "logLevel", "isLoggingLevel", "setServerLogger", "ServerLogger", "server", "Server", "transport", "StdioServerTransport", "setLogLevel", "log", "url", "startExpressServer", "serverName", "serverVersion", "writeToStderr", "error", "getExceptionMessage"]
|
|
7
7
|
}
|